From bf8241e9c55b84bc8256d6c17173fafe99659595 Mon Sep 17 00:00:00 2001 From: Ping Yu Date: Sun, 2 Jun 2024 22:53:51 +0800 Subject: [PATCH] pd: handle get members with error (#452) Signed-off-by: Ping Yu --- src/common/errors.rs | 2 ++ src/pd/cluster.rs | 13 ++++++++++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/src/common/errors.rs b/src/common/errors.rs index c1ed78b..35e7d32 100644 --- a/src/common/errors.rs +++ b/src/common/errors.rs @@ -111,6 +111,8 @@ pub enum Error { }, #[error("Transaction not found error: {:?}", _0)] TxnNotFound(kvrpcpb::TxnNotFound), + #[error("PD has no leader")] + PdNoLeader, } impl From for Error { diff --git a/src/pd/cluster.rs b/src/pd/cluster.rs index 3df4d25..f0f22e8 100644 --- a/src/pd/cluster.rs +++ b/src/pd/cluster.rs @@ -16,6 +16,7 @@ use tonic::Request; use super::timestamp::TimestampOracle; use crate::internal_err; use crate::proto::pdpb; +use crate::Error; use crate::Result; use crate::SecurityManager; use crate::Timestamp; @@ -46,7 +47,7 @@ impl Cluster { timeout: Duration, ) -> Result { let mut req = pd_request!(self.id, pdpb::GetRegionRequest); - req.region_key = key.clone(); + req.region_key = key; req.send(&mut self.client, timeout).await } @@ -203,6 +204,16 @@ impl Connection { .get_members(pdpb::GetMembersRequest::default()) .await? .into_inner(); + if let Some(err) = resp + .header + .as_ref() + .and_then(|header| header.error.as_ref()) + { + return Err(internal_err!("failed to get PD members, err {:?}", err)); + } + if resp.leader.is_none() { + return Err(Error::PdNoLeader); + } Ok((client, resp)) }