fix: preserve datanode write batches when retrying (#9720)

* fix: preserve datanode write batches when retrying

Signed-off-by: WenyXu <wenymedia@gmail.com>

* fix: isolate invalid entries in metric write batches

Signed-off-by: WenyXu <wenymedia@gmail.com>

* refactor: adapt batch writes to the unified metric API

Signed-off-by: WenyXu <wenymedia@gmail.com>

* fix: explicitly accept partial results for batched retries

Signed-off-by: WenyXu <wenymedia@gmail.com>

* test: assert terminal retry hint instead of masked error text

Signed-off-by: WenyXu <wenymedia@gmail.com>

* test: preserve application status in region failure fixtures

Signed-off-by: WenyXu <wenymedia@gmail.com>

* fix: refresh routes after region close

Signed-off-by: WenyXu <wenymedia@gmail.com>

---------

Signed-off-by: WenyXu <wenymedia@gmail.com>
This commit is contained in:
Weny Xu
2026-10-22 03:36:02 +00:00
committed by GitHub
parent 436d07bf2d
commit 9e9346d2ff
5 changed files with 329 additions and 132 deletions
+5
View File
@@ -41,6 +41,9 @@ pub use retry_hint::{retry_hint_from_postgres_error, retry_hint_from_postgres_po
#[snafu(visibility(pub))]
#[stack_trace_debug]
pub enum Error {
#[snafu(display("Failed to execute batch request"))]
BatchRequest { source: Arc<Error> },
#[snafu(display(
"Region request has {} failed entries; {}",
response.failures.len(),
@@ -1216,6 +1219,7 @@ impl ErrorExt for Error {
Error::PartialRegion { response } => response
.first_failure()
.map_or(StatusCode::Internal, |(_, error)| error.status_code()),
Error::BatchRequest { source } => source.status_code(),
IllegalServerState { .. }
| EtcdTxnOpResponse { .. }
| EtcdFailed { .. }
@@ -1386,6 +1390,7 @@ impl ErrorExt for Error {
match self {
Error::PartialRegion { .. } => RetryHint::Retryable,
Error::BatchRequest { source } => source.retry_hint(),
RetryLater { source, .. } => match source.retry_hint() {
RetryHint::RetryAfterRouteRefresh => RetryHint::RetryAfterRouteRefresh,
RetryHint::Retryable | RetryHint::NonRetryable => RetryHint::Retryable,