Skip to content

Commit 6c0bb0b

Browse files
authored
refactor: Minimize lock duration during raft-log export (#15417)
* chore: fix snapshot-v2 versions * refactor: Minimize lock duration during raft-log export Optimize the locking mechanism in the raft-log export process. Previously, the lock was held until the export was fully completed. With this refactor: - For raft-log exports: Release the lock immediately after transferring logs to memory. - For snapshot exports: Release the lock once the snapshot file is opened. This change reduces the time the lock is held, potentially improving performance and concurrency.
1 parent 71419a0 commit 6c0bb0b

File tree

2 files changed

+36
-27
lines changed

2 files changed

+36
-27
lines changed

src/meta/service/src/store/store_inner.rs

Lines changed: 35 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -478,28 +478,21 @@ impl StoreInner {
478478
yield s;
479479
};
480480

481-
// Export logs that has smaller or equal leader id as `vote`
482-
{
483-
let tree_name = &log.inner.name;
484-
485-
let log_kvs = log.inner.export()?;
481+
drop(raft_state);
486482

487-
for kv in log_kvs.iter() {
488-
let kv_entry = RaftStoreEntry::deserialize(&kv[0], &kv[1])?;
483+
// Dump logs that has smaller or equal leader id as `vote`
484+
let log_tree_name = log.inner.name.clone();
485+
let log_kvs = log.inner.export()?;
489486

490-
let tree_kv = (tree_name, kv_entry);
491-
let line = serde_json::to_string(&tree_kv).map_err(invalid_data)?;
492-
yield line;
493-
}
494-
}
487+
drop(log);
495488

496-
// Export snapshot of state machine
497-
{
498-
// NOTE:
499-
// The name in form of "state_machine/[0-9]+" had been used by the sled tree based sm.
500-
// Do not change it for keeping compatibility.
501-
let tree_name = "state_machine/0";
489+
// Dump snapshot of state machine
502490

491+
// NOTE:
492+
// The name in form of "state_machine/[0-9]+" had been used by the sled tree based sm.
493+
// Do not change it for keeping compatibility.
494+
let sm_tree_name = "state_machine/0";
495+
let f = {
503496
let snapshot = current_snapshot.clone();
504497
if let Some(s) = snapshot {
505498
let meta = s.meta;
@@ -510,17 +503,33 @@ impl StoreInner {
510503
.load_snapshot(&meta.snapshot_id)
511504
.await
512505
.map_err(invalid_data)?;
513-
let bf = BufReader::new(f);
514-
let mut lines = AsyncBufReadExt::lines(bf);
506+
Some(f)
507+
} else {
508+
None
509+
}
510+
};
515511

516-
while let Some(l) = lines.next_line().await? {
517-
let ent: RaftStoreEntry = serde_json::from_str(&l).map_err(invalid_data)?;
512+
drop(current_snapshot);
518513

519-
let named_entry = (tree_name, ent);
514+
for kv in log_kvs.iter() {
515+
let kv_entry = RaftStoreEntry::deserialize(&kv[0], &kv[1])?;
520516

521-
let line = serde_json::to_string(&named_entry).map_err(invalid_data)?;
522-
yield line;
523-
}
517+
let tree_kv = (&log_tree_name, kv_entry);
518+
let line = serde_json::to_string(&tree_kv).map_err(invalid_data)?;
519+
yield line;
520+
}
521+
522+
if let Some(f) = f {
523+
let bf = BufReader::new(f);
524+
let mut lines = AsyncBufReadExt::lines(bf);
525+
526+
while let Some(l) = lines.next_line().await? {
527+
let ent: RaftStoreEntry = serde_json::from_str(&l).map_err(invalid_data)?;
528+
529+
let named_entry = (sm_tree_name, ent);
530+
531+
let line = serde_json::to_string(&named_entry).map_err(invalid_data)?;
532+
yield line;
524533
}
525534
}
526535
}

src/meta/service/src/version.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ pub(crate) mod raft {
100100
add_provide(("append", 0), "2023-02-16", (0, 9, 41)),
101101
add_provide(("install_snapshot", 0), "2023-02-16", (0, 9, 41)),
102102
add_provide(("install_snapshot", 1), "2023-11-16", (1, 2, 212)),
103-
add_provide(("install_snapshot", 2), "2024-05-05", (1, 2, 452)),
103+
add_provide(("install_snapshot", 2), "2024-05-06", (1, 2, 453)),
104104
];
105105

106106
/// The client features that raft server depends on.

0 commit comments

Comments
 (0)