diff options
author | Alex Auvolat <alex@adnab.me> | 2021-03-11 19:06:27 +0100 |
---|---|---|
committer | Alex Auvolat <alex@adnab.me> | 2021-03-11 19:06:27 +0100 |
commit | 3f7a496355bdbeeeee859912fa6fa7a95cb47f3b (patch) | |
tree | 53284e346d2020de4a9207b6a20bc1b83ae9df6e /src/table | |
parent | f7c2cd1cd7ee15b9c97b9fbdef25c0644b3523bb (diff) | |
download | garage-3f7a496355bdbeeeee859912fa6fa7a95cb47f3b.tar.gz garage-3f7a496355bdbeeeee859912fa6fa7a95cb47f3b.zip |
More security: don't delete stuff too easily
Diffstat (limited to 'src/table')
-rw-r--r-- | src/table/replication/fullcopy.rs | 7 | ||||
-rw-r--r-- | src/table/sync.rs | 3 |
2 files changed, 9 insertions, 1 deletions
diff --git a/src/table/replication/fullcopy.rs b/src/table/replication/fullcopy.rs index a20f20b7..a5faece9 100644 --- a/src/table/replication/fullcopy.rs +++ b/src/table/replication/fullcopy.rs @@ -41,7 +41,12 @@ impl TableReplication for TableFullReplication { self.replication_nodes(hash, system.ring.borrow().as_ref()) } fn write_quorum(&self, system: &System) -> usize { - system.ring.borrow().config.members.len() - self.max_faults + let nmembers = system.ring.borrow().config.members.len(); + if nmembers > self.max_faults { + nmembers - self.max_faults + } else { + 1 + } } fn max_write_errors(&self) -> usize { self.max_faults diff --git a/src/table/sync.rs b/src/table/sync.rs index b5044a4e..f8ebb2f0 100644 --- a/src/table/sync.rs +++ b/src/table/sync.rs @@ -277,6 +277,9 @@ where warn!("Interrupting offload as partitions seem to have changed"); break; } + if nodes.len() < self.aux.replication.write_quorum(&self.aux.system) { + return Err(Error::Message(format!("Not offloading as we don't have a quorum of nodes to write to."))); + } counter += 1; debug!( |