Skip to content

Commit 06a00de

Browse files
authored
Merge pull request #4892 from remotion-dev/compositor-equal-cache
`@remotion/compositor`: Simplify cache rules - every thread has equal share of cache
2 parents 8fdda30 + 48d0695 commit 06a00de

File tree

15 files changed

+56
-140
lines changed

15 files changed

+56
-140
lines changed
-34.4 KB
Binary file not shown.
-23.3 KB
Binary file not shown.
-32.8 KB
Binary file not shown.
-28.4 KB
Binary file not shown.
-22.8 KB
Binary file not shown.
-34.8 KB
Binary file not shown.
-29.7 KB
Binary file not shown.

packages/compositor/rust/cache_references.rs

Lines changed: 0 additions & 100 deletions
This file was deleted.

packages/compositor/rust/frame_cache_manager.rs

Lines changed: 46 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ use std::{collections::HashMap, sync::Mutex};
33
use ffmpeg_next::Rational;
44

55
use crate::{
6-
cache_references::FRAME_CACHE_REFERENCES,
76
errors::ErrorWithBacktrace,
87
frame_cache::{FrameCache, FrameCacheItem, FrameCacheReference},
98
global_printer::_print_verbose,
@@ -36,17 +35,56 @@ impl FrameCacheManager {
3635
self.cache.clear();
3736
}
3837

38+
fn get_frames_to_prune(
39+
&mut self,
40+
maximum_frame_cache_size_in_bytes: u64,
41+
) -> Result<Vec<FrameCacheReference>, ErrorWithBacktrace> {
42+
let references = self.get_frame_references()?;
43+
let mut sorted = references.clone();
44+
sorted.sort_by(|a, b| a.last_used.cmp(&b.last_used));
45+
46+
let max_cache_size = max_cache_size::get_instance().lock().unwrap();
47+
48+
let current_cache_size_in_bytes =
49+
max_cache_size.get_cache_size_for_thread(self.thread_index);
50+
51+
let mut to_remove: Vec<FrameCacheReference> = vec![];
52+
53+
let bytes_to_free = match current_cache_size_in_bytes > maximum_frame_cache_size_in_bytes {
54+
true => current_cache_size_in_bytes - maximum_frame_cache_size_in_bytes,
55+
false => {
56+
return Ok(to_remove);
57+
}
58+
};
59+
60+
let mut removed = 0;
61+
let mut removed_count = 0;
62+
63+
for removal in sorted {
64+
removed += removal.size;
65+
removed_count += 1;
66+
to_remove.push(removal.clone());
67+
if removed >= bytes_to_free {
68+
break;
69+
}
70+
}
71+
72+
_print_verbose(&format!(
73+
"Need to free {}MB, Selected {} frames ({}MB) for removal",
74+
bytes_to_free / 1024 / 1024,
75+
removed_count,
76+
removed / 1024 / 1024
77+
))?;
78+
79+
Ok(to_remove)
80+
}
81+
3982
pub fn get_to_prune_local(
4083
&mut self,
4184
max_cache_size: u64,
4285
) -> Result<Vec<FrameCacheReference>, ErrorWithBacktrace> {
43-
let to_prune = {
44-
FRAME_CACHE_REFERENCES
45-
.lock()
46-
.unwrap()
47-
.get_frames_to_prune(max_cache_size, Some(self.thread_index))?
48-
};
49-
let of_thread: Vec<FrameCacheReference> = to_prune[self.thread_index].clone();
86+
let to_prune = { self.get_frames_to_prune(max_cache_size)? };
87+
let of_thread: Vec<FrameCacheReference> = to_prune.clone();
5088
Ok(of_thread)
5189
}
5290

@@ -265,14 +303,6 @@ impl FrameCacheManager {
265303
return Ok(total_size);
266304
}
267305

268-
pub fn copy_to_global(&mut self) -> Result<(), ErrorWithBacktrace> {
269-
FRAME_CACHE_REFERENCES
270-
.lock()
271-
.unwrap()
272-
.set_cache_references(self.thread_index, self.get_frame_references()?);
273-
Ok(())
274-
}
275-
276306
fn remove_item_by_id(
277307
&mut self,
278308
removal: FrameCacheReference,

packages/compositor/rust/long_running_process.rs

Lines changed: 6 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ use std::{
77
};
88

99
use crate::{
10-
cache_references::FRAME_CACHE_REFERENCES,
1110
commands::execute_command_and_print,
1211
errors::ErrorWithBacktrace,
1312
global_printer::{self, print_error},
@@ -205,26 +204,20 @@ impl LongRunningProcess {
205204
}
206205

207206
fn prune(&mut self, maximum_frame_cache_size_in_bytes: u64) -> Result<(), ErrorWithBacktrace> {
208-
let frames_to_prune = FRAME_CACHE_REFERENCES
209-
.lock()
210-
.unwrap()
211-
.get_frames_to_prune(maximum_frame_cache_size_in_bytes, None)?;
212-
213-
for thread in frames_to_prune {
214-
if thread.is_empty() {
215-
continue;
216-
}
217-
let first_item = thread.get(0).unwrap();
218-
self.send_to_thread_handles[first_item.thread_index].send(CliInputAndMaxCacheSize {
207+
let threads = self.send_to_thread_handles.len();
208+
for i in 0..threads {
209+
self.send_to_thread_handles[i].send(CliInputAndMaxCacheSize {
219210
cli_input: CliInputCommand {
220211
payload: CliInputCommandPayload::DeleteFramesFromCache(DeleteFramesFromCache {
221-
cache_references: thread,
212+
maximum_frame_cache_size_in_bytes: maximum_frame_cache_size_in_bytes
213+
/ threads as u64,
222214
}),
223215
nonce: "".to_string(),
224216
},
225217
max_cache_size: self.maximum_frame_cache_size_in_bytes,
226218
})?;
227219
}
220+
228221
Ok(())
229222
}
230223

packages/compositor/rust/main.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
mod cache_references;
21
mod commands;
32
mod errors;
43
mod extract_audio;
@@ -55,7 +54,7 @@ fn mainfn() -> Result<(), ErrorWithBacktrace> {
5554
.unwrap_or(get_ideal_maximum_frame_cache_size());
5655

5756
_print_verbose(&format!(
58-
"Starting Rust process. Max video cache size: {}MB, max concurrency = {}",
57+
"Starting Rust process. Max video cache size: {}MB, max threads = {}",
5958
max_video_cache_size / 1024 / 1024,
6059
payload.concurrency
6160
))?;

packages/compositor/rust/max_cache_size.rs

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,10 +34,6 @@ impl MaxCacheSize {
3434
None => 0,
3535
}
3636
}
37-
38-
pub fn thread_count(&self) -> usize {
39-
self.thread_cache_sizes.len()
40-
}
4137
}
4238

4339
// Global static instance of MaxCacheSize

packages/compositor/rust/opened_stream.rs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,6 @@ impl OpenedStream {
139139
index: frame_cache_id,
140140
pts: video.pts().expect("pts"),
141141
});
142-
frame_cache_manager.copy_to_global().unwrap();
143142

144143
}
145144
Ok(None) => {
@@ -380,7 +379,6 @@ impl OpenedStream {
380379
thread_index
381380
);
382381

383-
frame_cache_manager.copy_to_global().unwrap();
384382

385383
items_in_loop += 1;
386384

packages/compositor/rust/payloads.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ extern crate serde;
44
extern crate serde_json;
55

66
pub mod payloads {
7-
use crate::{errors::ErrorWithBacktrace, frame_cache::FrameCacheReference};
7+
use crate::errors::ErrorWithBacktrace;
88
use serde::{Deserialize, Serialize};
99

1010
#[derive(Serialize, Deserialize, Debug)]
@@ -245,7 +245,7 @@ pub mod payloads {
245245

246246
#[derive(Clone, Serialize, Deserialize, Debug)]
247247
pub struct DeleteFramesFromCache {
248-
pub cache_references: Vec<FrameCacheReference>,
248+
pub maximum_frame_cache_size_in_bytes: u64,
249249
}
250250

251251
#[derive(Serialize, Deserialize, Debug, Clone)]

packages/compositor/rust/thread.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ impl WorkerThread {
9696
cache_references: DeleteFramesFromCache,
9797
) -> Result<(), ErrorWithBacktrace> {
9898
self.frame_cache_manager
99-
.execute_prune(cache_references.cache_references, self.thread_index)?;
99+
.prune_on_thread(cache_references.maximum_frame_cache_size_in_bytes)?;
100100
self.opened_video_manager
101101
.close_videos_if_cache_empty(&mut self.frame_cache_manager)
102102
}

0 commit comments

Comments
 (0)