diff --git a/src/idempotency/client/rpc_wrapper.h b/src/idempotency/client/rpc_wrapper.h index d1a3cc1..1bf8c63 100644 --- a/src/idempotency/client/rpc_wrapper.h +++ b/src/idempotency/client/rpc_wrapper.h @@ -117,7 +117,7 @@ continue; \ } \ \ - if (idempotency_enabled) { \ + if (idempotency_enabled && !SF_IS_SERVER_RETRIABLE_ERROR(result)) { \ idempotency_client_channel_push( \ connection_params->channel, req_id); \ } \ diff --git a/src/sf_define.h b/src/sf_define.h index bac72fe..682c6f2 100644 --- a/src/sf_define.h +++ b/src/sf_define.h @@ -63,6 +63,10 @@ #define SF_FORCE_CLOSE_CONNECTION_ERROR_MIN SF_RETRIABLE_ERROR_NOT_MASTER #define SF_FORCE_CLOSE_CONNECTION_ERROR_MAX SF_RETRIABLE_ERROR_MAX +#define SF_IS_SERVER_RETRIABLE_ERROR(code) \ + ((code >= SF_RETRIABLE_ERROR_MIN && code <= SF_RETRIABLE_ERROR_MAX) || \ + (code == EAGAIN)) + #define SF_IS_RETRIABLE_ERROR(code) \ ((code >= SF_RETRIABLE_ERROR_MIN && code <= SF_RETRIABLE_ERROR_MAX) || \ (code == EAGAIN) || is_network_error(code))