Fix race condition in is_valid_pk() for files being ingested
When add_from_reader() returns after prebuffering, the file may not exist on disk yet due to tokio::spawn() scheduling. This caused "Cache entry not found" errors when playlist tried to validate the pk. Solution: - If DB entry exists but file doesn't, wait up to 1 second for file creation - This handles the race condition between prebuffer completion and File::create() in the background task - Deterministic and robust: either file exists or we timeout with error The fix preserves the progressive caching design while ensuring validation is deterministic. Test: Verified no "Cache entry not found" errors with clean cache.
This commit is contained in:
@@ -152,8 +152,22 @@ pub trait FileCache<C: CacheConfig>: Send + Sync {
|
||||
|
||||
let file_path = self.file_path(pk);
|
||||
if !file_path.exists() {
|
||||
tracing::debug!("is_valid_pk({}): File does not exist", pk);
|
||||
return false;
|
||||
// Si l'entrée DB existe mais pas le fichier, c'est probablement en cours d'ingestion
|
||||
// Attendre jusqu'à 1 seconde que le fichier soit créé (le tokio::spawn peut mettre un peu de temps)
|
||||
tracing::debug!("is_valid_pk({}): File does not exist yet, waiting for file creation (ingestion in progress)", pk);
|
||||
|
||||
let mut attempts = 0;
|
||||
while !file_path.exists() && attempts < 100 {
|
||||
std::thread::sleep(std::time::Duration::from_millis(10));
|
||||
attempts += 1;
|
||||
}
|
||||
|
||||
if !file_path.exists() {
|
||||
tracing::warn!("is_valid_pk({}): File not created after 1s despite DB entry existing", pk);
|
||||
return false;
|
||||
}
|
||||
|
||||
tracing::debug!("is_valid_pk({}): File created after {}ms", pk, attempts * 10);
|
||||
}
|
||||
|
||||
// Vérifier d'abord si le marker de completion existe
|
||||
|
||||
Reference in New Issue
Block a user