mirror of
https://github.com/deuxfleurs-org/garage.git
synced 2026-08-27 15:37:03 +00:00
layout: move block_read_nodes_of to rpc_helper to avoid double-locking
(in theory, this could have caused a deadlock)
This commit is contained in:
@@ -8,7 +8,6 @@ use garage_util::data::*;
|
||||
|
||||
use super::schema::*;
|
||||
use crate::replication_mode::ReplicationMode;
|
||||
use crate::rpc_helper::RpcHelper;
|
||||
|
||||
#[derive(Debug, Clone, Serialize, Deserialize, Default, PartialEq, Eq)]
|
||||
pub struct LayoutDigest {
|
||||
@@ -155,6 +154,10 @@ impl LayoutHelper {
|
||||
self.ack_map_min
|
||||
}
|
||||
|
||||
pub fn all_sync(&self) -> u64 {
|
||||
self.sync_map_min
|
||||
}
|
||||
|
||||
pub fn sync_versions(&self) -> (u64, u64, u64) {
|
||||
(
|
||||
self.layout().current().version,
|
||||
@@ -177,28 +180,6 @@ impl LayoutHelper {
|
||||
.collect()
|
||||
}
|
||||
|
||||
pub fn block_read_nodes_of(&self, position: &Hash, rpc_helper: &RpcHelper) -> Vec<Uuid> {
|
||||
let mut ret = Vec::with_capacity(12);
|
||||
let ver_iter = self
|
||||
.layout()
|
||||
.versions
|
||||
.iter()
|
||||
.rev()
|
||||
.chain(self.layout().old_versions.iter().rev());
|
||||
for ver in ver_iter {
|
||||
if ver.version > self.sync_map_min {
|
||||
continue;
|
||||
}
|
||||
let nodes = ver.nodes_of(position, ver.replication_factor);
|
||||
for node in rpc_helper.request_order(nodes) {
|
||||
if !ret.contains(&node) {
|
||||
ret.push(node);
|
||||
}
|
||||
}
|
||||
}
|
||||
ret
|
||||
}
|
||||
|
||||
pub fn storage_sets_of(&self, position: &Hash) -> Vec<Vec<Uuid>> {
|
||||
self.layout()
|
||||
.versions
|
||||
|
||||
Reference in New Issue
Block a user