performance opt.: replace snprintf

use_iouring
YuQing 2025-08-07 19:53:38 +08:00
parent 0b4936bd8f
commit 03f64998ce
8 changed files with 95 additions and 53 deletions

View File

@ -229,7 +229,7 @@ int sf_binlog_index_save(SFBinlogIndexContext *ctx)
int result; int result;
char tmp_filename[PATH_MAX]; char tmp_filename[PATH_MAX];
snprintf(tmp_filename, sizeof(tmp_filename), "%s.tmp", ctx->filename); fc_combine_two_string(ctx->filename, "tmp", '.', tmp_filename);
if ((result=save(ctx, tmp_filename)) != 0) { if ((result=save(ctx, tmp_filename)) != 0) {
return result; return result;
} }

View File

@ -305,7 +305,7 @@ void sf_binlog_writer_finish(SFBinlogWriterInfo *writer)
uint32_t last_timestamp; uint32_t last_timestamp;
int count; int count;
if (writer->fw.file.name != NULL) { if (writer->fw.file.name.str != NULL) {
while (writer->thread->running && !fc_queue_empty( while (writer->thread->running && !fc_queue_empty(
&writer->thread->queue)) &writer->thread->queue))
{ {
@ -333,8 +333,8 @@ void sf_binlog_writer_finish(SFBinlogWriterInfo *writer)
deal_binlog_records(writer->thread, wb_head, &last_timestamp); deal_binlog_records(writer->thread, wb_head, &last_timestamp);
} }
free(writer->fw.file.name); free(writer->fw.file.name.str);
writer->fw.file.name = NULL; writer->fw.file.name.str = NULL;
} }
if (writer->fw.file.fd >= 0) { if (writer->fw.file.fd >= 0) {

View File

@ -48,9 +48,10 @@
static inline void sf_file_writer_get_binlog_filename(SFFileWriterInfo *writer) static inline void sf_file_writer_get_binlog_filename(SFFileWriterInfo *writer)
{ {
sprintf(writer->file.name, "%s/%s/%s"SF_BINLOG_FILE_EXT_FMT, sf_file_writer_get_filename_ex(
writer->cfg.data_path, writer->cfg.subdir_name, writer->cfg.data_path, writer->cfg.subdir_name,
writer->cfg.file_prefix, writer->binlog.last_index); writer->cfg.file_prefix, writer->binlog.last_index,
writer->file.name.str, writer->file.name.size);
} }
static inline void sf_file_writer_get_index_filename_ex(const char *data_path, static inline void sf_file_writer_get_index_filename_ex(const char *data_path,
@ -232,13 +233,13 @@ static int open_writable_binlog(SFFileWriterInfo *writer)
} }
sf_file_writer_get_binlog_filename(writer); sf_file_writer_get_binlog_filename(writer);
writer->file.fd = open(writer->file.name, O_WRONLY | writer->file.fd = open(writer->file.name.str, O_WRONLY |
O_CREAT | O_APPEND | O_CLOEXEC, 0644); O_CREAT | O_APPEND | O_CLOEXEC, 0644);
if (writer->file.fd < 0) { if (writer->file.fd < 0) {
logError("file: "__FILE__", line: %d, " logError("file: "__FILE__", line: %d, "
"open file \"%s\" fail, " "open file \"%s\" fail, "
"errno: %d, error info: %s", "errno: %d, error info: %s",
__LINE__, writer->file.name, __LINE__, writer->file.name.str,
errno, STRERROR(errno)); errno, STRERROR(errno));
return errno != 0 ? errno : EACCES; return errno != 0 ? errno : EACCES;
} }
@ -248,7 +249,7 @@ static int open_writable_binlog(SFFileWriterInfo *writer)
logError("file: "__FILE__", line: %d, " logError("file: "__FILE__", line: %d, "
"lseek file \"%s\" fail, " "lseek file \"%s\" fail, "
"errno: %d, error info: %s", "errno: %d, error info: %s",
__LINE__, writer->file.name, __LINE__, writer->file.name.str,
errno, STRERROR(errno)); errno, STRERROR(errno));
return errno != 0 ? errno : EIO; return errno != 0 ? errno : EIO;
} }
@ -259,22 +260,23 @@ static int open_writable_binlog(SFFileWriterInfo *writer)
static int open_next_binlog(SFFileWriterInfo *writer) static int open_next_binlog(SFFileWriterInfo *writer)
{ {
sf_file_writer_get_binlog_filename(writer); sf_file_writer_get_binlog_filename(writer);
if (access(writer->file.name, F_OK) == 0) { if (access(writer->file.name.str, F_OK) == 0) {
char bak_filename[PATH_MAX]; char bak_filename[PATH_MAX];
char date_str[32]; char date_str[32];
snprintf(bak_filename, sizeof(bak_filename), "%s.%s", formatDatetime(g_current_time, "%Y%m%d%H%M%S",
writer->file.name, formatDatetime(g_current_time, date_str, sizeof(date_str));
"%Y%m%d%H%M%S", date_str, sizeof(date_str))); fc_combine_two_string(writer->file.name.str,
if (rename(writer->file.name, bak_filename) == 0) { date_str, '.', bak_filename);
if (rename(writer->file.name.str, bak_filename) == 0) {
logWarning("file: "__FILE__", line: %d, " logWarning("file: "__FILE__", line: %d, "
"binlog file %s exist, rename to %s", "binlog file %s exist, rename to %s",
__LINE__, writer->file.name, bak_filename); __LINE__, writer->file.name.str, bak_filename);
} else { } else {
logError("file: "__FILE__", line: %d, " logError("file: "__FILE__", line: %d, "
"rename binlog %s to backup %s fail, " "rename binlog %s to backup %s fail, "
"errno: %d, error info: %s", "errno: %d, error info: %s",
__LINE__, writer->file.name, bak_filename, __LINE__, writer->file.name.str, bak_filename,
errno, STRERROR(errno)); errno, STRERROR(errno));
return errno != 0 ? errno : EPERM; return errno != 0 ? errno : EPERM;
} }
@ -293,7 +295,7 @@ static int do_write_to_file(SFFileWriterInfo *writer,
logError("file: "__FILE__", line: %d, " logError("file: "__FILE__", line: %d, "
"write to binlog file \"%s\" fail, " "write to binlog file \"%s\" fail, "
"errno: %d, error info: %s", "errno: %d, error info: %s",
__LINE__, writer->file.name, __LINE__, writer->file.name.str,
result, STRERROR(result)); result, STRERROR(result));
return result; return result;
} }
@ -303,7 +305,7 @@ static int do_write_to_file(SFFileWriterInfo *writer,
result = errno != 0 ? errno : EIO; result = errno != 0 ? errno : EIO;
logError("file: "__FILE__", line: %d, " logError("file: "__FILE__", line: %d, "
"fsync to binlog file \"%s\" fail, errno: %d, " "fsync to binlog file \"%s\" fail, errno: %d, "
"error info: %s", __LINE__, writer->file.name, "error info: %s", __LINE__, writer->file.name.str,
result, STRERROR(result)); result, STRERROR(result));
return result; return result;
} }
@ -337,7 +339,7 @@ int sf_file_writer_direct_write(SFFileWriterInfo *writer,
if (result != 0) { if (result != 0) {
logError("file: "__FILE__", line: %d, " logError("file: "__FILE__", line: %d, "
"open binlog file \"%s\" fail", "open binlog file \"%s\" fail",
__LINE__, writer->file.name); __LINE__, writer->file.name.str);
return result; return result;
} }
@ -380,7 +382,7 @@ int sf_file_writer_fsync(SFFileWriterInfo *writer)
result = errno != 0 ? errno : EIO; result = errno != 0 ? errno : EIO;
logError("file: "__FILE__", line: %d, " logError("file: "__FILE__", line: %d, "
"fsync to binlog file \"%s\" fail, errno: %d, " "fsync to binlog file \"%s\" fail, errno: %d, "
"error info: %s", __LINE__, writer->file.name, "error info: %s", __LINE__, writer->file.name.str,
result, STRERROR(result)); result, STRERROR(result));
return result; return result;
} }
@ -504,8 +506,7 @@ int sf_file_writer_init(SFFileWriterInfo *writer, const char *data_path,
writer->cfg.call_fsync = call_fsync; writer->cfg.call_fsync = call_fsync;
writer->cfg.file_rotate_size = file_rotate_size; writer->cfg.file_rotate_size = file_rotate_size;
writer->cfg.data_path = data_path; writer->cfg.data_path = data_path;
path_len = snprintf(filepath, sizeof(filepath), path_len = fc_combine_full_filepath(data_path, subdir_name, filepath);
"%s/%s", data_path, subdir_name);
if ((result=fc_check_mkdir_ex(filepath, 0775, &create)) != 0) { if ((result=fc_check_mkdir_ex(filepath, 0775, &create)) != 0) {
return result; return result;
} }
@ -514,14 +515,11 @@ int sf_file_writer_init(SFFileWriterInfo *writer, const char *data_path,
} }
writer->file.fd = -1; writer->file.fd = -1;
snprintf(writer->cfg.subdir_name, fc_safe_strcpy(writer->cfg.subdir_name, subdir_name);
sizeof(writer->cfg.subdir_name), fc_safe_strcpy(writer->cfg.file_prefix, file_prefix);
"%s", subdir_name); writer->file.name.size = path_len + 32;
snprintf(writer->cfg.file_prefix, writer->file.name.str = (char *)fc_malloc(writer->file.name.size);
sizeof(writer->cfg.file_prefix), if (writer->file.name.str == NULL) {
"%s", file_prefix);
writer->file.name = (char *)fc_malloc(path_len + 32);
if (writer->file.name == NULL) {
return ENOMEM; return ENOMEM;
} }
@ -542,9 +540,9 @@ void sf_file_writer_destroy(SFFileWriterInfo *writer)
close(writer->file.fd); close(writer->file.fd);
writer->file.fd = -1; writer->file.fd = -1;
} }
if (writer->file.name != NULL) { if (writer->file.name.str != NULL) {
free(writer->file.name); free(writer->file.name.str);
writer->file.name = NULL; writer->file.name.str = NULL;
} }
sf_binlog_buffer_destroy(&writer->binlog_buffer); sf_binlog_buffer_destroy(&writer->binlog_buffer);
} }

View File

@ -28,7 +28,8 @@
#define SF_BINLOG_DEFAULT_ROTATE_SIZE (1024 * 1024 * 1024) #define SF_BINLOG_DEFAULT_ROTATE_SIZE (1024 * 1024 * 1024)
#define SF_BINLOG_NEVER_ROTATE_FILE 0 #define SF_BINLOG_NEVER_ROTATE_FILE 0
#define SF_BINLOG_FILE_PREFIX "binlog" #define SF_BINLOG_FILE_PREFIX "binlog"
#define SF_BINLOG_FILE_EXT_FMT ".%06d" #define SF_BINLOG_FILE_EXT_LEN 6
#define SF_BINLOG_FILE_EXT_FMT ".%0"FC_MACRO_TOSTRING(SF_BINLOG_FILE_EXT_LEN)"d"
struct sf_file_writer_info; struct sf_file_writer_info;
@ -53,8 +54,11 @@ typedef struct sf_file_writer_info {
struct { struct {
int fd; int fd;
int64_t size; int64_t size; //file size
char *name; struct {
char *str;
int size;
} name;
} file; } file;
int64_t total_count; int64_t total_count;
@ -222,7 +226,8 @@ static inline const char *sf_file_writer_get_filepath(
const char *data_path, const char *subdir_name, const char *data_path, const char *subdir_name,
char *filepath, const int size) char *filepath, const int size)
{ {
snprintf(filepath, size, "%s/%s", data_path, subdir_name); fc_get_full_filepath_ex(data_path, strlen(data_path),
subdir_name, strlen(subdir_name), filepath, size);
return filepath; return filepath;
} }
@ -231,8 +236,34 @@ static inline const char *sf_file_writer_get_filename_ex(
const char *file_prefix, const int binlog_index, const char *file_prefix, const int binlog_index,
char *filename, const int size) char *filename, const int size)
{ {
snprintf(filename, size, "%s/%s/%s"SF_BINLOG_FILE_EXT_FMT, char *p;
data_path, subdir_name, file_prefix, binlog_index); int data_path_len;
int subdir_name_len;
int file_prefix_len;
data_path_len = strlen(data_path);
subdir_name_len = strlen(subdir_name);
file_prefix_len = strlen(file_prefix);
if (data_path_len + subdir_name_len + file_prefix_len +
4 + SF_BINLOG_FILE_EXT_LEN >= size)
{
snprintf(filename, size, "%s/%s/%s"SF_BINLOG_FILE_EXT_FMT,
data_path, subdir_name, file_prefix, binlog_index);
return filename;
}
p = filename;
memcpy(p, data_path, data_path_len);
p += data_path_len;
*p++ = '/';
memcpy(p, subdir_name, subdir_name_len);
p += subdir_name_len;
*p++ = '/';
memcpy(p, file_prefix, file_prefix_len);
p += file_prefix_len;
*p++ = '.';
fc_ltostr_ex(binlog_index, p, SF_BINLOG_FILE_EXT_LEN);
return filename; return filename;
} }

View File

@ -250,6 +250,7 @@ int sf_get_base_path_from_conf_file(const char *config_filename)
} }
} }
SF_G_BASE_PATH_LEN = strlen(SF_G_BASE_PATH_STR);
SF_G_BASE_PATH_INITED = true; SF_G_BASE_PATH_INITED = true;
return 0; return 0;
} }
@ -271,6 +272,7 @@ int sf_load_global_base_path(IniFullContext *ini_ctx)
} }
chopPath(SF_G_BASE_PATH_STR); chopPath(SF_G_BASE_PATH_STR);
SF_G_BASE_PATH_LEN = strlen(SF_G_BASE_PATH_STR);
if (!fileExists(SF_G_BASE_PATH_STR)) { if (!fileExists(SF_G_BASE_PATH_STR)) {
if ((result=fc_check_mkdir_ex(SF_G_BASE_PATH_STR, 0775, if ((result=fc_check_mkdir_ex(SF_G_BASE_PATH_STR, 0775,
&SF_G_BASE_PATH_CREATED)) != 0) &SF_G_BASE_PATH_CREATED)) != 0)
@ -525,7 +527,7 @@ static void set_bind_address(const char *bind_addr, char *ipv4_bind_addr,
return; return;
} }
snprintf(new_bind_addr, sizeof(new_bind_addr), "%s", bind_addr); fc_safe_strcpy(new_bind_addr, bind_addr);
count = splitEx(new_bind_addr, ',', cols, 2); count = splitEx(new_bind_addr, ',', cols, 2);
for (i=0; i<count; i++) { for (i=0; i<count; i++) {
ip_addr = cols[i]; ip_addr = cols[i];
@ -535,9 +537,13 @@ static void set_bind_address(const char *bind_addr, char *ipv4_bind_addr,
++ip_addr; ++ip_addr;
len -= 2; len -= 2;
} }
snprintf(ipv6_bind_addr, addr_size, "%.*s", len, ip_addr); if (len >= addr_size) {
len = addr_size - 1;
}
memcpy(ipv6_bind_addr, ip_addr, len);
*(ipv6_bind_addr + len) = '\0';
} else { } else {
snprintf(ipv4_bind_addr, addr_size, "%s", ip_addr); fc_strlcpy(ipv4_bind_addr, ip_addr, addr_size);
} }
} }
} }
@ -1046,6 +1052,8 @@ int sf_load_data_path_config_ex(IniFullContext *ini_ctx,
const char *item_name, const char *default_value, string_t *path) const char *item_name, const char *default_value, string_t *path)
{ {
const char *data_path; const char *data_path;
int data_path_len;
int path_size;
data_path = iniGetStrValue(ini_ctx->section_name, data_path = iniGetStrValue(ini_ctx->section_name,
item_name, ini_ctx->context); item_name, ini_ctx->context);
@ -1061,20 +1069,23 @@ int sf_load_data_path_config_ex(IniFullContext *ini_ctx,
return EINVAL; return EINVAL;
} }
data_path_len = strlen(data_path);
if (*data_path == '/') { if (*data_path == '/') {
path->len = strlen(data_path); path->len = data_path_len;
path->str = fc_strdup1(data_path, path->len); path->str = fc_strdup1(data_path, path->len);
if (path->str == NULL) { if (path->str == NULL) {
return ENOMEM; return ENOMEM;
} }
} else { } else {
path->len = strlen(SF_G_BASE_PATH_STR) + strlen(data_path) + 1; path_size = SF_G_BASE_PATH_LEN + data_path_len + 2;
path->str = (char *)fc_malloc(path->len + 1); path->str = (char *)fc_malloc(path_size);
if (path->str == NULL) { if (path->str == NULL) {
return ENOMEM; return ENOMEM;
} }
path->len = sprintf(path->str, "%s/%s",
SF_G_BASE_PATH_STR, data_path); path->len = fc_get_full_filepath_ex(SF_G_BASE_PATH_STR,
SF_G_BASE_PATH_LEN, data_path, data_path_len,
path->str, path_size);
} }
chopPath(path->str); chopPath(path->str);
path->len = strlen(path->str); path->len = strlen(path->str);

View File

@ -32,6 +32,7 @@ typedef struct sf_connection_stat {
typedef struct sf_global_variables { typedef struct sf_global_variables {
struct { struct {
char str[MAX_PATH_SIZE]; char str[MAX_PATH_SIZE];
int len;
bool inited; bool inited;
bool created; bool created;
} base_path; } base_path;
@ -79,6 +80,7 @@ extern SFGlobalVariables g_sf_global_vars;
extern SFContext g_sf_context; extern SFContext g_sf_context;
#define SF_G_BASE_PATH_STR g_sf_global_vars.base_path.str #define SF_G_BASE_PATH_STR g_sf_global_vars.base_path.str
#define SF_G_BASE_PATH_LEN g_sf_global_vars.base_path.len
#define SF_G_BASE_PATH_INITED g_sf_global_vars.base_path.inited #define SF_G_BASE_PATH_INITED g_sf_global_vars.base_path.inited
#define SF_G_BASE_PATH_CREATED g_sf_global_vars.base_path.created #define SF_G_BASE_PATH_CREATED g_sf_global_vars.base_path.created
#define SF_G_CONTINUE_FLAG g_sf_global_vars.continue_flag #define SF_G_CONTINUE_FLAG g_sf_global_vars.continue_flag
@ -317,8 +319,8 @@ static inline void sf_set_global_base_path(const char *base_path)
string_t path_string; string_t path_string;
FC_SET_STRING(path_string, (char *)base_path); FC_SET_STRING(path_string, (char *)base_path);
normalize_path(NULL, &path_string, SF_G_BASE_PATH_STR, SF_G_BASE_PATH_LEN = normalize_path(NULL, &path_string,
sizeof(SF_G_BASE_PATH_STR)); SF_G_BASE_PATH_STR, sizeof(SF_G_BASE_PATH_STR));
SF_G_BASE_PATH_INITED = true; SF_G_BASE_PATH_INITED = true;
} }

View File

@ -106,7 +106,7 @@ void sf_ordered_writer_finish(SFOrderedWriterContext *ctx)
{ {
int count; int count;
if (ctx->writer.fw.file.name != NULL) { if (ctx->writer.fw.file.name.str != NULL) {
fc_queue_terminate(&ctx->thread.queues.version); fc_queue_terminate(&ctx->thread.queues.version);
count = 0; count = 0;
@ -120,8 +120,8 @@ void sf_ordered_writer_finish(SFOrderedWriterContext *ctx)
__LINE__, ctx->writer.fw.cfg.subdir_name); __LINE__, ctx->writer.fw.cfg.subdir_name);
} }
free(ctx->writer.fw.file.name); free(ctx->writer.fw.file.name.str);
ctx->writer.fw.file.name = NULL; ctx->writer.fw.file.name.str = NULL;
} }
if (ctx->writer.fw.file.fd >= 0) { if (ctx->writer.fw.file.fd >= 0) {

View File

@ -115,7 +115,7 @@ int sf_service_init_ex2(SFContext *sf_context, const char *name,
pthread_t tid; pthread_t tid;
pthread_attr_t thread_attr; pthread_attr_t thread_attr;
snprintf(sf_context->name, sizeof(sf_context->name), "%s", name); fc_safe_strcpy(sf_context->name, name);
sf_context->connect_need_log = true; sf_context->connect_need_log = true;
sf_context->realloc_task_buffer = sf_context->net_buffer_cfg. sf_context->realloc_task_buffer = sf_context->net_buffer_cfg.
min_buff_size < sf_context->net_buffer_cfg.max_buff_size; min_buff_size < sf_context->net_buffer_cfg.max_buff_size;