From 19b863acebc508290c944f91cc307a21013ae9d9 Mon Sep 17 00:00:00 2001 From: YuQing <384681@qq.com> Date: Sat, 19 Sep 2020 14:28:09 +0800 Subject: [PATCH] add macro SF_CLIENT_IDEMPOTENCY_QUERY_WRAPPER --- src/idempotency/client/rpc_wrapper.h | 44 +++++++++++++++++++++++++++- src/sf_define.h | 3 +- 2 files changed, 45 insertions(+), 2 deletions(-) diff --git a/src/idempotency/client/rpc_wrapper.h b/src/idempotency/client/rpc_wrapper.h index 87109c2..24c02e4 100644 --- a/src/idempotency/client/rpc_wrapper.h +++ b/src/idempotency/client/rpc_wrapper.h @@ -4,7 +4,7 @@ #include "../../sf_configs.h" -#define SF_CLIENT_IDEMPOTENCY_UPDATE_WARPER(client_ctx, \ +#define SF_CLIENT_IDEMPOTENCY_UPDATE_WRAPPER(client_ctx, \ GET_MASTER_CONNECTION, get_conn_arg1, update_callback, ...) \ ConnectionInfo *conn; \ IdempotencyClientChannel *old_channel; \ @@ -95,6 +95,48 @@ return SF_UNIX_ERRNO(result, EIO) +#define SF_CLIENT_IDEMPOTENCY_QUERY_WRAPPER(client_ctx, \ + GET_READABLE_CONNECTION, get_conn_arg1, query_callback, ...) \ + ConnectionInfo *conn; \ + int result; \ + int i; \ + SFNetRetryIntervalContext net_retry_ctx; \ + \ + if ((conn=GET_READABLE_CONNECTION(client_ctx, \ + get_conn_arg1, &result)) == NULL) \ + { \ + return SF_UNIX_ERRNO(result, EIO); \ + } \ + \ + sf_init_net_retry_interval_context(&net_retry_ctx, \ + &client_ctx->net_retry_cfg.interval_mm, \ + &client_ctx->net_retry_cfg.network); \ + i = 0; \ + while (1) { \ + if ((result=query_callback(client_ctx, \ + conn, ##__VA_ARGS__)) == 0) \ + { \ + break; \ + } \ + SF_NET_RETRY_CHECK_AND_SLEEP(net_retry_ctx, client_ctx-> \ + net_retry_cfg.network.times, ++i, result); \ + \ + logInfo("file: "__FILE__", line: %d, func: %s, " \ + "net retry result: %d, retry count: %d", \ + __LINE__, __FUNCTION__, result, i); \ + \ + SF_CLIENT_RELEASE_CONNECTION(client_ctx, conn, result); \ + if ((conn=GET_READABLE_CONNECTION(client_ctx, \ + get_conn_arg1, &result)) == NULL) \ + { \ + return SF_UNIX_ERRNO(result, EIO); \ + } \ + } \ + \ + SF_CLIENT_RELEASE_CONNECTION(client_ctx, conn, result); \ + return SF_UNIX_ERRNO(result, EIO) + + #ifdef __cplusplus extern "C" { #endif diff --git a/src/sf_define.h b/src/sf_define.h index 0aa80b9..a7ea558 100644 --- a/src/sf_define.h +++ b/src/sf_define.h @@ -48,7 +48,8 @@ #define SF_FORCE_CLOSE_CONNECTION_ERROR(code) \ ((code >= SF_FORCE_CLOSE_CONNECTION_ERROR_MIN && \ code <= SF_FORCE_CLOSE_CONNECTION_ERROR_MAX) || \ - (result == EINVAL) || (result != 0 && is_network_error(code))) + (result == EINVAL) || (result == EOVERFLOW) || \ + (result != 0 && is_network_error(code))) #define SF_UNIX_ERRNO(code, errno_for_overflow) \