correction for lazy playlist and lazy cache
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
_ => {}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user