|
2 | 2 | use crate::utils::{check_namespace_key_validity, is_valid_kvstore_str};
|
3 | 3 |
|
4 | 4 | use lightning::util::persist::KVStore;
|
5 |
| -use lightning::util::string::PrintableString; |
6 | 5 |
|
7 | 6 | use std::collections::HashMap;
|
8 | 7 | use std::fs;
|
@@ -316,89 +315,92 @@ impl KVStore for FilesystemStore {
|
316 | 315 | let entry = entry?;
|
317 | 316 | let p = entry.path();
|
318 | 317 |
|
319 |
| - if let Some(ext) = p.extension() { |
320 |
| - #[cfg(target_os = "windows")] |
321 |
| - { |
322 |
| - // Clean up any trash files lying around. |
323 |
| - if ext == "trash" { |
324 |
| - fs::remove_file(p).ok(); |
325 |
| - continue; |
326 |
| - } |
327 |
| - } |
328 |
| - if ext == "tmp" { |
329 |
| - continue; |
330 |
| - } |
| 318 | + if !dir_entry_is_key(&p)? { |
| 319 | + continue; |
331 | 320 | }
|
332 | 321 |
|
333 |
| - let metadata = p.metadata()?; |
| 322 | + let key = get_key_from_dir_entry(&p, &prefixed_dest)?; |
334 | 323 |
|
335 |
| - // We allow the presence of directories in the empty primary namespace and just skip them. |
336 |
| - if metadata.is_dir() { |
337 |
| - continue; |
338 |
| - } |
| 324 | + keys.push(key); |
| 325 | + } |
339 | 326 |
|
340 |
| - // If we otherwise don't find a file at the given path something went wrong. |
341 |
| - if !metadata.is_file() { |
342 |
| - debug_assert!( |
343 |
| - false, |
344 |
| - "Failed to list keys of {}/{}: file couldn't be accessed.", |
345 |
| - PrintableString(primary_namespace), |
346 |
| - PrintableString(secondary_namespace) |
347 |
| - ); |
348 |
| - let msg = format!( |
349 |
| - "Failed to list keys of {}/{}: file couldn't be accessed.", |
350 |
| - PrintableString(primary_namespace), |
351 |
| - PrintableString(secondary_namespace) |
352 |
| - ); |
353 |
| - return Err(lightning::io::Error::new(lightning::io::ErrorKind::Other, msg)); |
| 327 | + self.garbage_collect_locks(); |
| 328 | + |
| 329 | + Ok(keys) |
| 330 | + } |
| 331 | +} |
| 332 | + |
| 333 | +fn dir_entry_is_key(p: &Path) -> Result<bool, lightning::io::Error> { |
| 334 | + if let Some(ext) = p.extension() { |
| 335 | + #[cfg(target_os = "windows")] |
| 336 | + { |
| 337 | + // Clean up any trash files lying around. |
| 338 | + if ext == "trash" { |
| 339 | + fs::remove_file(p).ok(); |
| 340 | + return Ok(false); |
354 | 341 | }
|
| 342 | + } |
| 343 | + if ext == "tmp" { |
| 344 | + return Ok(false); |
| 345 | + } |
| 346 | + } |
355 | 347 |
|
356 |
| - match p.strip_prefix(&prefixed_dest) { |
357 |
| - Ok(stripped_path) => { |
358 |
| - if let Some(relative_path) = stripped_path.to_str() { |
359 |
| - if is_valid_kvstore_str(relative_path) { |
360 |
| - keys.push(relative_path.to_string()) |
361 |
| - } |
362 |
| - } else { |
363 |
| - debug_assert!( |
364 |
| - false, |
365 |
| - "Failed to list keys of {}/{}: file path is not valid UTF-8", |
366 |
| - PrintableString(primary_namespace), |
367 |
| - PrintableString(secondary_namespace) |
368 |
| - ); |
369 |
| - let msg = format!( |
370 |
| - "Failed to list keys of {}/{}: file path is not valid UTF-8", |
371 |
| - PrintableString(primary_namespace), |
372 |
| - PrintableString(secondary_namespace) |
373 |
| - ); |
374 |
| - return Err(lightning::io::Error::new( |
375 |
| - lightning::io::ErrorKind::Other, |
376 |
| - msg, |
377 |
| - )); |
378 |
| - } |
379 |
| - }, |
380 |
| - Err(e) => { |
| 348 | + let metadata = p.metadata()?; |
| 349 | + |
| 350 | + // We allow the presence of directories in the empty primary namespace and just skip them. |
| 351 | + if metadata.is_dir() { |
| 352 | + return Ok(false); |
| 353 | + } |
| 354 | + |
| 355 | + // If we otherwise don't find a file at the given path something went wrong. |
| 356 | + if !metadata.is_file() { |
| 357 | + debug_assert!( |
| 358 | + false, |
| 359 | + "Failed to list keys at path {:?}: file couldn't be accessed.", |
| 360 | + p.to_str() |
| 361 | + ); |
| 362 | + let msg = |
| 363 | + format!("Failed to list keys at path {:?}: file couldn't be accessed.", p.to_str()); |
| 364 | + return Err(lightning::io::Error::new(lightning::io::ErrorKind::Other, msg)); |
| 365 | + } |
| 366 | + |
| 367 | + Ok(true) |
| 368 | +} |
| 369 | + |
| 370 | +fn get_key_from_dir_entry(p: &Path, base_path: &Path) -> Result<String, lightning::io::Error> { |
| 371 | + match p.strip_prefix(&base_path) { |
| 372 | + Ok(stripped_path) => { |
| 373 | + if let Some(relative_path) = stripped_path.to_str() { |
| 374 | + if is_valid_kvstore_str(relative_path) { |
| 375 | + return Ok(relative_path.to_string()); |
| 376 | + } else { |
381 | 377 | debug_assert!(
|
382 | 378 | false,
|
383 |
| - "Failed to list keys of {}/{}: {}", |
384 |
| - PrintableString(primary_namespace), |
385 |
| - PrintableString(secondary_namespace), |
386 |
| - e |
| 379 | + "Failed to list keys of path {:?}: file path is not valid key", |
| 380 | + p.to_str() |
387 | 381 | );
|
388 | 382 | let msg = format!(
|
389 |
| - "Failed to list keys of {}/{}: {}", |
390 |
| - PrintableString(primary_namespace), |
391 |
| - PrintableString(secondary_namespace), |
392 |
| - e |
| 383 | + "Failed to list keys of path {:?}: file path is not valid key", |
| 384 | + p.to_str() |
393 | 385 | );
|
394 | 386 | return Err(lightning::io::Error::new(lightning::io::ErrorKind::Other, msg));
|
395 |
| - }, |
| 387 | + } |
| 388 | + } else { |
| 389 | + debug_assert!( |
| 390 | + false, |
| 391 | + "Failed to list keys of path {:?}: file path is not valid UTF-8", |
| 392 | + p |
| 393 | + ); |
| 394 | + let msg = |
| 395 | + format!("Failed to list keys of path {:?}: file path is not valid UTF-8", p); |
| 396 | + return Err(lightning::io::Error::new(lightning::io::ErrorKind::Other, msg)); |
396 | 397 | }
|
397 |
| - } |
398 |
| - |
399 |
| - self.garbage_collect_locks(); |
400 |
| - |
401 |
| - Ok(keys) |
| 398 | + }, |
| 399 | + Err(e) => { |
| 400 | + debug_assert!(false, "Failed to list keys of path {:?}: {}", p, e); |
| 401 | + let msg = format!("Failed to list keys of path {:?}: {}", p, e); |
| 402 | + return Err(lightning::io::Error::new(lightning::io::ErrorKind::Other, msg)); |
| 403 | + }, |
402 | 404 | }
|
403 | 405 | }
|
404 | 406 |
|
|
0 commit comments