292 lines
7.8 KiB
C
292 lines
7.8 KiB
C
/*
|
|
* Copyright (c) 2020 YuQing <384681@qq.com>
|
|
*
|
|
* This program is free software: you can use, redistribute, and/or modify
|
|
* it under the terms of the Lesser GNU General Public License, version 3
|
|
* or later ("LGPL"), as published by the Free Software Foundation.
|
|
*
|
|
* This program is distributed in the hope that it will be useful, but WITHOUT
|
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
* FITNESS FOR A PARTICULAR PURPOSE.
|
|
*
|
|
* You should have received a copy of the Lesser GNU General Public License
|
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
//server_id_func.h
|
|
|
|
#ifndef _SERVER_ID_FUNC_H
|
|
#define _SERVER_ID_FUNC_H
|
|
|
|
#include "common_define.h"
|
|
#include "connection_pool.h"
|
|
#include "ini_file_reader.h"
|
|
#include "fast_buffer.h"
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
#define FC_MAX_SERVER_IP_COUNT 8
|
|
#define FC_MAX_GROUP_COUNT 4
|
|
|
|
#define FC_SID_SERVER_COUNT(ctx) (ctx).sorted_server_arrays.by_id.count
|
|
#define FC_SID_SERVERS(ctx) (ctx).sorted_server_arrays.by_id.servers
|
|
|
|
typedef struct
|
|
{
|
|
int net_type;
|
|
ConnectionInfo conn;
|
|
} FCAddressInfo;
|
|
|
|
typedef struct {
|
|
int alloc;
|
|
int count;
|
|
FCAddressInfo *addrs;
|
|
} FCAddressArray;
|
|
|
|
typedef struct {
|
|
int alloc;
|
|
int count;
|
|
int index;
|
|
FCAddressInfo **addrs;
|
|
} FCAddressPtrArray;
|
|
|
|
typedef struct
|
|
{
|
|
bool enabled;
|
|
int switch_on_iops;
|
|
int switch_on_count;
|
|
} FCSmartPollingConfig;
|
|
|
|
typedef struct
|
|
{
|
|
string_t group_name;
|
|
int port; //default port
|
|
int server_port; //port in server section
|
|
int buffer_size; //for RDMA
|
|
FCCommunicationType comm_type;
|
|
FCSmartPollingConfig smart_polling;
|
|
struct {
|
|
int net_type;
|
|
string_t ip_prefix;
|
|
char prefix_buff[IP_ADDRESS_SIZE];
|
|
} filter;
|
|
char name_buff[FAST_INI_ITEM_NAME_SIZE]; //group_name string holder
|
|
} FCServerGroupInfo;
|
|
|
|
typedef struct
|
|
{
|
|
int count;
|
|
FCServerGroupInfo groups[FC_MAX_GROUP_COUNT];
|
|
} FCServerGroupArray;
|
|
|
|
typedef struct
|
|
{
|
|
FCServerGroupInfo *server_group;
|
|
FCAddressPtrArray address_array;
|
|
} FCGroupAddresses;
|
|
|
|
typedef struct
|
|
{
|
|
int id; //server id
|
|
FCAddressPtrArray uniq_addresses;
|
|
FCGroupAddresses group_addrs[FC_MAX_GROUP_COUNT];
|
|
} FCServerInfo;
|
|
|
|
typedef struct
|
|
{
|
|
string_t ip_addr;
|
|
int port;
|
|
FCServerInfo *server;
|
|
} FCServerMap;
|
|
|
|
typedef struct
|
|
{
|
|
int alloc;
|
|
int count;
|
|
FCServerInfo *servers;
|
|
} FCServerInfoArray;
|
|
|
|
typedef struct
|
|
{
|
|
int alloc;
|
|
int count;
|
|
FCServerInfo **servers;
|
|
} FCServerInfoPtrArray;
|
|
|
|
typedef struct
|
|
{
|
|
int count;
|
|
FCServerMap *maps;
|
|
} FCServerMapArray;
|
|
|
|
typedef enum {
|
|
fc_connection_thread_local_auto,
|
|
fc_connection_thread_local_yes,
|
|
fc_connection_thread_local_no
|
|
} FCServerConnThreadLocal;
|
|
|
|
typedef struct fc_server_config
|
|
{
|
|
int default_port;
|
|
int min_hosts_each_group;
|
|
bool share_between_groups; //if an address shared between different groups
|
|
int buffer_size; //for RDMA
|
|
FCCommunicationType comm_type;
|
|
FCSmartPollingConfig smart_polling;
|
|
FCServerConnThreadLocal connection_thread_local;
|
|
FCServerGroupArray group_array;
|
|
struct {
|
|
FCServerInfoArray by_id; //sorted by server id
|
|
FCServerMapArray by_ip_port; //sorted by IP and port
|
|
} sorted_server_arrays;
|
|
} FCServerConfig;
|
|
|
|
FCServerInfo *fc_server_get_by_id(FCServerConfig *ctx,
|
|
const int server_id);
|
|
|
|
FCServerInfo *fc_server_get_by_ip_port_ex(FCServerConfig *ctx,
|
|
const string_t *ip_addr, const int port);
|
|
|
|
static inline FCServerInfo *fc_server_get_by_ip_port(FCServerConfig *ctx,
|
|
const char *ip_addr, const int port)
|
|
{
|
|
string_t saddr;
|
|
FC_SET_STRING(saddr, (char *)ip_addr);
|
|
return fc_server_get_by_ip_port_ex(ctx, &saddr, port);
|
|
}
|
|
|
|
FCServerGroupInfo *fc_server_get_group_by_name(FCServerConfig *ctx,
|
|
const string_t *group_name);
|
|
|
|
static inline FCServerGroupInfo *fc_server_get_group_by_index(
|
|
FCServerConfig *ctx, const int index)
|
|
{
|
|
if (index < 0 || index >= ctx->group_array.count) {
|
|
return NULL;
|
|
}
|
|
|
|
return ctx->group_array.groups + index;
|
|
}
|
|
|
|
static inline int fc_server_get_group_index_ex(FCServerConfig *ctx,
|
|
const string_t *group_name)
|
|
{
|
|
FCServerGroupInfo *group;
|
|
group = fc_server_get_group_by_name(ctx, group_name);
|
|
if (group != NULL) {
|
|
return group - ctx->group_array.groups;
|
|
} else {
|
|
return -1;
|
|
}
|
|
}
|
|
|
|
static inline int fc_server_get_group_index(FCServerConfig *ctx,
|
|
const char *group_name)
|
|
{
|
|
string_t gname;
|
|
FC_SET_STRING(gname, (char *)group_name);
|
|
return fc_server_get_group_index_ex(ctx, &gname);
|
|
}
|
|
|
|
int fc_server_load_from_file_ex(FCServerConfig *ctx,
|
|
const char *config_filename, const int default_port,
|
|
const int min_hosts_each_group, const bool share_between_groups);
|
|
|
|
static inline int fc_server_load_from_file(FCServerConfig *ctx,
|
|
const char *config_filename)
|
|
{
|
|
const int default_port = 0;
|
|
const int min_hosts_each_group = 1;
|
|
const bool share_between_groups = false;
|
|
return fc_server_load_from_file_ex(ctx, config_filename,
|
|
default_port, min_hosts_each_group, share_between_groups);
|
|
}
|
|
|
|
int fc_server_load_from_buffer_ex(FCServerConfig *ctx, char *content,
|
|
const char *caption, const int default_port,
|
|
const int min_hosts_each_group, const bool share_between_groups);
|
|
|
|
static inline int fc_server_load_from_buffer(FCServerConfig *ctx,
|
|
char *content)
|
|
{
|
|
const char *caption = "from-buffer";
|
|
const int default_port = 0;
|
|
const int min_hosts_each_group = 1;
|
|
const bool share_between_groups = false;
|
|
return fc_server_load_from_buffer_ex(ctx, content, caption,
|
|
default_port, min_hosts_each_group, share_between_groups);
|
|
}
|
|
|
|
int fc_server_load_from_ini_context_ex(FCServerConfig *ctx,
|
|
IniContext *ini_context, const char *config_filename,
|
|
const int default_port, const int min_hosts_each_group,
|
|
const bool share_between_groups);
|
|
|
|
static inline int fc_server_load_from_ini_context(FCServerConfig *ctx,
|
|
IniContext *ini_context, const char *config_filename)
|
|
{
|
|
const int default_port = 0;
|
|
const int min_hosts_each_group = 1;
|
|
const bool share_between_groups = false;
|
|
return fc_server_load_from_ini_context_ex(ctx, ini_context,
|
|
config_filename, default_port, min_hosts_each_group,
|
|
share_between_groups);
|
|
}
|
|
|
|
void fc_server_destroy(FCServerConfig *ctx);
|
|
|
|
int fc_server_to_config_string(FCServerConfig *ctx, FastBuffer *buffer);
|
|
|
|
void fc_server_to_log(FCServerConfig *ctx);
|
|
|
|
const FCAddressInfo *fc_server_get_address_by_peer(
|
|
FCAddressPtrArray *addr_array, const char *peer_ip);
|
|
|
|
int fc_server_make_connection_ex(FCAddressPtrArray *addr_array,
|
|
ConnectionInfo *conn, const char *service_name,
|
|
const int connect_timeout, const char *bind_ipaddr,
|
|
const bool log_connect_error);
|
|
|
|
#define fc_server_make_connection(addr_array, \
|
|
conn, service_name, connect_timeout) \
|
|
fc_server_make_connection_ex(addr_array, conn, \
|
|
service_name, connect_timeout, NULL, true)
|
|
|
|
static inline void fc_server_close_connection(ConnectionInfo *conn)
|
|
{
|
|
G_COMMON_CONNECTION_CALLBACKS[conn->comm_type].close_connection(conn);
|
|
}
|
|
|
|
static inline void fc_server_destroy_connection(ConnectionInfo *conn)
|
|
{
|
|
fc_server_close_connection(conn);
|
|
conn_pool_free_connection(conn);
|
|
}
|
|
|
|
struct ibv_pd *fc_alloc_rdma_pd(fc_alloc_pd_callback alloc_pd,
|
|
FCAddressPtrArray *address_array, int *result);
|
|
|
|
static inline const char *fc_connection_thread_local_str(
|
|
const FCServerConnThreadLocal value)
|
|
{
|
|
switch (value) {
|
|
case fc_connection_thread_local_auto:
|
|
return "auto";
|
|
case fc_connection_thread_local_yes:
|
|
return "yes";
|
|
case fc_connection_thread_local_no:
|
|
return "no";
|
|
default:
|
|
return "unkown";
|
|
}
|
|
}
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif
|
|
|