idempotency support RDMA
parent
0eb842dc09
commit
9731e736df
|
|
@ -63,6 +63,15 @@ typedef struct idempotency_receipt_thread_context {
|
||||||
} last_check_times;
|
} last_check_times;
|
||||||
} IdempotencyReceiptThreadContext;
|
} IdempotencyReceiptThreadContext;
|
||||||
|
|
||||||
|
typedef struct idempotency_receipt_global_vars {
|
||||||
|
struct {
|
||||||
|
int task_padding_size;
|
||||||
|
sf_init_connection_callback init_connection;
|
||||||
|
struct ibv_pd *pd;
|
||||||
|
} rdma;
|
||||||
|
IdempotencyReceiptThreadContext *thread_contexts;
|
||||||
|
} IdempotencyReceiptGlobalVars;
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -41,13 +41,22 @@
|
||||||
#include "client_channel.h"
|
#include "client_channel.h"
|
||||||
#include "receipt_handler.h"
|
#include "receipt_handler.h"
|
||||||
|
|
||||||
static IdempotencyReceiptThreadContext *receipt_thread_contexts = NULL;
|
static IdempotencyReceiptGlobalVars receipt_global_vars;
|
||||||
|
|
||||||
|
#define RECEIPT_THREAD_CONTEXTS receipt_global_vars.thread_contexts
|
||||||
|
#define TASK_PADDING_SIZE receipt_global_vars.rdma.task_padding_size
|
||||||
|
#define RDMA_INIT_CONNECTION receipt_global_vars.rdma.init_connection
|
||||||
|
#define RDMA_PD receipt_global_vars.rdma.pd
|
||||||
|
|
||||||
static int receipt_init_task(struct fast_task_info *task)
|
static int receipt_init_task(struct fast_task_info *task)
|
||||||
{
|
{
|
||||||
task->connect_timeout = SF_G_CONNECT_TIMEOUT; //for client side
|
task->connect_timeout = SF_G_CONNECT_TIMEOUT; //for client side
|
||||||
task->network_timeout = SF_G_NETWORK_TIMEOUT;
|
task->network_timeout = SF_G_NETWORK_TIMEOUT;
|
||||||
return 0;
|
if (RDMA_INIT_CONNECTION != NULL) {
|
||||||
|
return RDMA_INIT_CONNECTION(task, RDMA_PD);
|
||||||
|
} else {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int receipt_recv_timeout_callback(struct fast_task_info *task)
|
static int receipt_recv_timeout_callback(struct fast_task_info *task)
|
||||||
|
|
@ -83,8 +92,7 @@ static void receipt_task_finish_cleanup(struct fast_task_info *task)
|
||||||
|
|
||||||
if (task->event.fd >= 0) {
|
if (task->event.fd >= 0) {
|
||||||
sf_task_detach_thread(task);
|
sf_task_detach_thread(task);
|
||||||
close(task->event.fd);
|
task->handler->close_connection(task);
|
||||||
task->event.fd = -1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
task->length = 0;
|
task->length = 0;
|
||||||
|
|
@ -474,35 +482,51 @@ static void *receipt_alloc_thread_extra_data(const int thread_index)
|
||||||
{
|
{
|
||||||
IdempotencyReceiptThreadContext *ctx;
|
IdempotencyReceiptThreadContext *ctx;
|
||||||
|
|
||||||
ctx = receipt_thread_contexts + thread_index;
|
ctx = RECEIPT_THREAD_CONTEXTS + thread_index;
|
||||||
FC_INIT_LIST_HEAD(&ctx->head);
|
FC_INIT_LIST_HEAD(&ctx->head);
|
||||||
return ctx;
|
return ctx;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int do_init()
|
static int do_init(FCAddressPtrArray *address_array)
|
||||||
{
|
{
|
||||||
|
int result;
|
||||||
int bytes;
|
int bytes;
|
||||||
|
SFNetworkHandler *rdma_handler;
|
||||||
|
|
||||||
bytes = sizeof(IdempotencyReceiptThreadContext) * SF_G_WORK_THREADS;
|
bytes = sizeof(IdempotencyReceiptThreadContext) * SF_G_WORK_THREADS;
|
||||||
receipt_thread_contexts = (IdempotencyReceiptThreadContext *)
|
RECEIPT_THREAD_CONTEXTS = (IdempotencyReceiptThreadContext *)
|
||||||
fc_malloc(bytes);
|
fc_malloc(bytes);
|
||||||
if (receipt_thread_contexts == NULL) {
|
if (RECEIPT_THREAD_CONTEXTS == NULL) {
|
||||||
return ENOMEM;
|
return ENOMEM;
|
||||||
}
|
}
|
||||||
memset(receipt_thread_contexts, 0, bytes);
|
memset(RECEIPT_THREAD_CONTEXTS, 0, bytes);
|
||||||
|
|
||||||
|
if ((rdma_handler=sf_get_rdma_network_handler(&g_sf_context)) != NULL) {
|
||||||
|
if ((result=sf_alloc_rdma_pd(&g_sf_context, address_array)) != 0) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
TASK_PADDING_SIZE = rdma_handler->get_connection_size();
|
||||||
|
RDMA_INIT_CONNECTION = rdma_handler->init_connection;
|
||||||
|
RDMA_PD = rdma_handler->pd;
|
||||||
|
} else {
|
||||||
|
TASK_PADDING_SIZE = 0;
|
||||||
|
RDMA_INIT_CONNECTION = NULL;
|
||||||
|
RDMA_PD = NULL;
|
||||||
|
}
|
||||||
return sf_service_init_ex2(&g_sf_context, "idemp-receipt",
|
return sf_service_init_ex2(&g_sf_context, "idemp-receipt",
|
||||||
receipt_alloc_thread_extra_data, receipt_thread_loop_callback,
|
receipt_alloc_thread_extra_data, receipt_thread_loop_callback,
|
||||||
NULL, sf_proto_set_body_length, NULL, NULL, receipt_deal_task,
|
NULL, sf_proto_set_body_length, NULL, NULL, receipt_deal_task,
|
||||||
receipt_task_finish_cleanup, receipt_recv_timeout_callback,
|
receipt_task_finish_cleanup, receipt_recv_timeout_callback,
|
||||||
1000, sizeof(SFCommonProtoHeader), 0, 0, receipt_init_task, NULL);
|
1000, sizeof(SFCommonProtoHeader), TASK_PADDING_SIZE, 0,
|
||||||
|
receipt_init_task, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
int receipt_handler_init()
|
int receipt_handler_init(FCAddressPtrArray *address_array)
|
||||||
{
|
{
|
||||||
int result;
|
int result;
|
||||||
|
|
||||||
if ((result=do_init()) != 0) {
|
if ((result=do_init(address_array)) != 0) {
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -24,7 +24,7 @@
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
int receipt_handler_init();
|
int receipt_handler_init(FCAddressPtrArray *address_array);
|
||||||
int receipt_handler_destroy();
|
int receipt_handler_destroy();
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue