rpc: fix write set quorums

This commit is contained in:
Alex Auvolat 2023-11-15 13:07:42 +01:00
parent 46007bf01d
commit acd49de9f9
No known key found for this signature in database
GPG key ID: 0E496D15096376BE
4 changed files with 22 additions and 13 deletions

View file

@ -53,9 +53,7 @@ impl CommonError {
pub fn http_status_code(&self) -> StatusCode { pub fn http_status_code(&self) -> StatusCode {
match self { match self {
CommonError::InternalError( CommonError::InternalError(
GarageError::Timeout GarageError::Timeout | GarageError::RemoteError(_) | GarageError::Quorum(..),
| GarageError::RemoteError(_)
| GarageError::Quorum(_, _, _, _),
) => StatusCode::SERVICE_UNAVAILABLE, ) => StatusCode::SERVICE_UNAVAILABLE,
CommonError::InternalError(_) | CommonError::Hyper(_) | CommonError::Http(_) => { CommonError::InternalError(_) | CommonError::Hyper(_) | CommonError::Http(_) => {
StatusCode::INTERNAL_SERVER_ERROR StatusCode::INTERNAL_SERVER_ERROR
@ -72,9 +70,7 @@ impl CommonError {
match self { match self {
CommonError::Forbidden(_) => "AccessDenied", CommonError::Forbidden(_) => "AccessDenied",
CommonError::InternalError( CommonError::InternalError(
GarageError::Timeout GarageError::Timeout | GarageError::RemoteError(_) | GarageError::Quorum(..),
| GarageError::RemoteError(_)
| GarageError::Quorum(_, _, _, _),
) => "ServiceUnavailable", ) => "ServiceUnavailable",
CommonError::InternalError(_) | CommonError::Hyper(_) | CommonError::Http(_) => { CommonError::InternalError(_) | CommonError::Hyper(_) | CommonError::Http(_) => {
"InternalError" "InternalError"

View file

@ -344,7 +344,7 @@ impl K2VRpcHandler {
} }
if errors.len() > nodes.len() - quorum { if errors.len() > nodes.len() - quorum {
let errors = errors.iter().map(|e| format!("{}", e)).collect::<Vec<_>>(); let errors = errors.iter().map(|e| format!("{}", e)).collect::<Vec<_>>();
return Err(Error::Quorum(quorum, resps.len(), nodes.len(), errors).into()); return Err(Error::Quorum(quorum, None, resps.len(), nodes.len(), errors).into());
} }
// Take all returned items into account to produce the response. // Take all returned items into account to produce the response.

View file

@ -327,7 +327,13 @@ impl RpcHelper {
Ok(successes) Ok(successes)
} else { } else {
let errors = errors.iter().map(|e| format!("{}", e)).collect::<Vec<_>>(); let errors = errors.iter().map(|e| format!("{}", e)).collect::<Vec<_>>();
Err(Error::Quorum(quorum, successes.len(), to.len(), errors)) Err(Error::Quorum(
quorum,
None,
successes.len(),
to.len(),
errors,
))
} }
} }
@ -469,7 +475,7 @@ impl RpcHelper {
} }
} }
if set_counters.iter().all(|x| x.0 > quorum) { if set_counters.iter().all(|x| x.0 >= quorum) {
// Success // Success
// Continue all other requets in background // Continue all other requets in background
@ -492,6 +498,12 @@ impl RpcHelper {
// Failure, could not get quorum // Failure, could not get quorum
let errors = errors.iter().map(|e| format!("{}", e)).collect::<Vec<_>>(); let errors = errors.iter().map(|e| format!("{}", e)).collect::<Vec<_>>();
Err(Error::Quorum(quorum, successes.len(), peers.len(), errors)) Err(Error::Quorum(
quorum,
Some(to_sets.len()),
successes.len(),
peers.len(),
errors,
))
} }
} }

View file

@ -55,13 +55,14 @@ pub enum Error {
Timeout, Timeout,
#[error( #[error(
display = "Could not reach quorum of {}. {} of {} request succeeded, others returned errors: {:?}", display = "Could not reach quorum of {} (sets={:?}). {} of {} request succeeded, others returned errors: {:?}",
_0, _0,
_1, _1,
_2, _2,
_3 _3,
_4
)] )]
Quorum(usize, usize, usize, Vec<String>), Quorum(usize, Option<usize>, usize, usize, Vec<String>),
#[error(display = "Unexpected RPC message: {}", _0)] #[error(display = "Unexpected RPC message: {}", _0)]
UnexpectedRpcMessage(String), UnexpectedRpcMessage(String),