correction for lazy playlist and lazy cache

This commit is contained in:
2025-12-15 11:18:58 +01:00
parent 4bc80dfd08
commit 90399b408a
28 changed files with 349 additions and 39126 deletions

View File

@@ -357,7 +357,9 @@ impl WriteHandle {
}
let manager = crate::manager::PlaylistManager();
manager.rebuild_track_index(&self.playlist.id, &snapshot).await;
manager
.rebuild_track_index(&self.playlist.id, &snapshot)
.await;
manager.notify_playlist_changed(&self.playlist.id);
Ok(())
@@ -390,7 +392,9 @@ impl WriteHandle {
}
let manager = crate::manager::PlaylistManager();
manager.rebuild_track_index(&self.playlist.id, &snapshot).await;
manager
.rebuild_track_index(&self.playlist.id, &snapshot)
.await;
manager.notify_playlist_changed(&self.playlist.id);
Ok(())
@@ -452,7 +456,9 @@ impl WriteHandle {
}
let manager = crate::manager::PlaylistManager();
manager.rebuild_track_index(&self.playlist.id, &snapshot).await;
manager
.rebuild_track_index(&self.playlist.id, &snapshot)
.await;
manager.notify_playlist_changed(&self.playlist.id);
}

View File

@@ -568,7 +568,11 @@ impl PlaylistManager {
let manager = self.clone();
tokio::spawn(async move {
tracing::info!("Lazy mode enabled for playlist {} (lookahead: {})", playlist_id, lookahead);
tracing::info!(
"Lazy mode enabled for playlist {} (lookahead: {})",
playlist_id,
lookahead
);
while let Ok(event) = rx.recv().await {
match event {
@@ -579,7 +583,9 @@ impl PlaylistManager {
if let Ok(writer) = manager.get_write_handle(playlist_id.clone()).await {
tracing::info!(
"Switching PK in playlist {}: {} -> {}",
playlist_id, lazy_pk, real_pk
playlist_id,
lazy_pk,
real_pk
);
if let Err(e) = writer.update_cache_pk(&lazy_pk, &real_pk).await {
tracing::error!("Failed to update PK in playlist: {}", e);
@@ -587,7 +593,9 @@ impl PlaylistManager {
}
// 2. Prefetch les tracks suivants
manager.prefetch_next_tracks(&playlist_id, &real_pk, lookahead).await;
manager
.prefetch_next_tracks(&playlist_id, &real_pk, lookahead)
.await;
}
_ => {}
}

View File

@@ -1,6 +1,9 @@
//! Record : entrée dans la playlist pointant vers le cache audio
use std::time::{Duration, SystemTime};
use std::sync::atomic::{AtomicI64, Ordering};
use std::time::{Duration, SystemTime, UNIX_EPOCH};
static LAST_ADDED_AT: AtomicI64 = AtomicI64::new(0);
/// Un enregistrement dans la playlist
///
@@ -23,7 +26,7 @@ impl Record {
pub fn new(cache_pk: String) -> Self {
Self {
cache_pk,
added_at: SystemTime::now(),
added_at: next_timestamp(),
ttl: None,
}
}
@@ -32,7 +35,7 @@ impl Record {
pub fn with_ttl(cache_pk: String, ttl: Duration) -> Self {
Self {
cache_pk,
added_at: SystemTime::now(),
added_at: next_timestamp(),
ttl: Some(ttl),
}
}
@@ -59,3 +62,34 @@ impl Record {
.as_nanos() as i64
}
}
fn next_timestamp() -> SystemTime {
let now_nanos = SystemTime::now()
.duration_since(UNIX_EPOCH)
.unwrap_or_default()
.as_nanos() as i64;
let mut last = LAST_ADDED_AT.load(Ordering::Relaxed);
loop {
let candidate = if now_nanos > last {
now_nanos
} else {
last.saturating_add(1)
};
match LAST_ADDED_AT.compare_exchange(
last,
candidate,
Ordering::SeqCst,
Ordering::SeqCst,
) {
Ok(_) => {
let nanos = candidate as u64;
return UNIX_EPOCH + Duration::from_nanos(nanos);
}
Err(updated) => {
last = updated;
}
}
}
}