[#1407] fix(rust): dont panic when no available local disks (#1504)
### What changes were proposed in this pull request?
fix(rust): dont panic when no available local disks
### Why are the changes needed?
make spill data fallback to hdfs when no available local disks
### Does this PR introduce _any_ user-facing change?
No.
### How was this patch tested?
online tests
diff --git a/rust/experimental/server/src/store/localfile.rs b/rust/experimental/server/src/store/localfile.rs
index 8afdb7b..8f81e5c 100644
--- a/rust/experimental/server/src/store/localfile.rs
+++ b/rust/experimental/server/src/store/localfile.rs
@@ -40,6 +40,7 @@
use log::{debug, error, warn};
use crate::runtime::manager::RuntimeManager;
+use dashmap::mapref::entry::Entry;
use std::sync::atomic::{AtomicI64, Ordering};
use std::sync::Arc;
@@ -187,14 +188,16 @@
LocalFileStore::gen_relative_path_for_partition(&uid);
let mut parent_dir_is_created = false;
- let locked_obj = self
- .partition_locks
- .entry(data_file_path.clone())
- .or_insert_with(|| {
+ let locked_obj = match self.partition_locks.entry(data_file_path.clone()) {
+ Entry::Vacant(e) => {
parent_dir_is_created = true;
- Arc::new(LockedObj::from(self.select_disk(&uid).unwrap()))
- })
- .clone();
+ let disk = self.select_disk(&uid)?;
+ let locked_obj = Arc::new(LockedObj::from(disk));
+ let obj = e.insert_entry(locked_obj.clone());
+ obj.get().clone()
+ }
+ Entry::Occupied(v) => v.get().clone(),
+ };
let local_disk = &locked_obj.disk;
let mut next_offset = locked_obj.pointer.load(Ordering::SeqCst);