From 03f64998ce05ac2bc18178eef415f6dd058eee1f Mon Sep 17 00:00:00 2001 From: YuQing <384681@qq.com> Date: Thu, 7 Aug 2025 19:53:38 +0800 Subject: [PATCH] performance opt.: replace snprintf --- src/sf_binlog_index.c | 2 +- src/sf_binlog_writer.c | 6 ++--- src/sf_file_writer.c | 56 ++++++++++++++++++++--------------------- src/sf_file_writer.h | 43 ++++++++++++++++++++++++++----- src/sf_global.c | 27 ++++++++++++++------ src/sf_global.h | 6 +++-- src/sf_ordered_writer.c | 6 ++--- src/sf_service.c | 2 +- 8 files changed, 95 insertions(+), 53 deletions(-) diff --git a/src/sf_binlog_index.c b/src/sf_binlog_index.c index 37b9942..a8e5677 100644 --- a/src/sf_binlog_index.c +++ b/src/sf_binlog_index.c @@ -229,7 +229,7 @@ int sf_binlog_index_save(SFBinlogIndexContext *ctx) int result; 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) { return result; } diff --git a/src/sf_binlog_writer.c b/src/sf_binlog_writer.c index 7f7009b..b1de8a8 100644 --- a/src/sf_binlog_writer.c +++ b/src/sf_binlog_writer.c @@ -305,7 +305,7 @@ void sf_binlog_writer_finish(SFBinlogWriterInfo *writer) uint32_t last_timestamp; int count; - if (writer->fw.file.name != NULL) { + if (writer->fw.file.name.str != NULL) { while (writer->thread->running && !fc_queue_empty( &writer->thread->queue)) { @@ -333,8 +333,8 @@ void sf_binlog_writer_finish(SFBinlogWriterInfo *writer) deal_binlog_records(writer->thread, wb_head, &last_timestamp); } - free(writer->fw.file.name); - writer->fw.file.name = NULL; + free(writer->fw.file.name.str); + writer->fw.file.name.str = NULL; } if (writer->fw.file.fd >= 0) { diff --git a/src/sf_file_writer.c b/src/sf_file_writer.c index fbf5b59..3a16af4 100644 --- a/src/sf_file_writer.c +++ b/src/sf_file_writer.c @@ -48,9 +48,10 @@ 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.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, @@ -232,13 +233,13 @@ static int open_writable_binlog(SFFileWriterInfo *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); if (writer->file.fd < 0) { logError("file: "__FILE__", line: %d, " "open file \"%s\" fail, " "errno: %d, error info: %s", - __LINE__, writer->file.name, + __LINE__, writer->file.name.str, errno, STRERROR(errno)); return errno != 0 ? errno : EACCES; } @@ -248,7 +249,7 @@ static int open_writable_binlog(SFFileWriterInfo *writer) logError("file: "__FILE__", line: %d, " "lseek file \"%s\" fail, " "errno: %d, error info: %s", - __LINE__, writer->file.name, + __LINE__, writer->file.name.str, errno, STRERROR(errno)); return errno != 0 ? errno : EIO; } @@ -259,22 +260,23 @@ static int open_writable_binlog(SFFileWriterInfo *writer) static int open_next_binlog(SFFileWriterInfo *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 date_str[32]; - snprintf(bak_filename, sizeof(bak_filename), "%s.%s", - writer->file.name, formatDatetime(g_current_time, - "%Y%m%d%H%M%S", date_str, sizeof(date_str))); - if (rename(writer->file.name, bak_filename) == 0) { + formatDatetime(g_current_time, "%Y%m%d%H%M%S", + date_str, sizeof(date_str)); + fc_combine_two_string(writer->file.name.str, + date_str, '.', bak_filename); + if (rename(writer->file.name.str, bak_filename) == 0) { logWarning("file: "__FILE__", line: %d, " "binlog file %s exist, rename to %s", - __LINE__, writer->file.name, bak_filename); + __LINE__, writer->file.name.str, bak_filename); } else { logError("file: "__FILE__", line: %d, " "rename binlog %s to backup %s fail, " "errno: %d, error info: %s", - __LINE__, writer->file.name, bak_filename, + __LINE__, writer->file.name.str, bak_filename, errno, STRERROR(errno)); return errno != 0 ? errno : EPERM; } @@ -293,7 +295,7 @@ static int do_write_to_file(SFFileWriterInfo *writer, logError("file: "__FILE__", line: %d, " "write to binlog file \"%s\" fail, " "errno: %d, error info: %s", - __LINE__, writer->file.name, + __LINE__, writer->file.name.str, result, STRERROR(result)); return result; } @@ -303,7 +305,7 @@ static int do_write_to_file(SFFileWriterInfo *writer, result = errno != 0 ? errno : EIO; logError("file: "__FILE__", line: %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)); return result; } @@ -337,7 +339,7 @@ int sf_file_writer_direct_write(SFFileWriterInfo *writer, if (result != 0) { logError("file: "__FILE__", line: %d, " "open binlog file \"%s\" fail", - __LINE__, writer->file.name); + __LINE__, writer->file.name.str); return result; } @@ -380,7 +382,7 @@ int sf_file_writer_fsync(SFFileWriterInfo *writer) result = errno != 0 ? errno : EIO; logError("file: "__FILE__", line: %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)); 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.file_rotate_size = file_rotate_size; writer->cfg.data_path = data_path; - path_len = snprintf(filepath, sizeof(filepath), - "%s/%s", data_path, subdir_name); + path_len = fc_combine_full_filepath(data_path, subdir_name, filepath); if ((result=fc_check_mkdir_ex(filepath, 0775, &create)) != 0) { return result; } @@ -514,14 +515,11 @@ int sf_file_writer_init(SFFileWriterInfo *writer, const char *data_path, } writer->file.fd = -1; - snprintf(writer->cfg.subdir_name, - sizeof(writer->cfg.subdir_name), - "%s", subdir_name); - snprintf(writer->cfg.file_prefix, - sizeof(writer->cfg.file_prefix), - "%s", file_prefix); - writer->file.name = (char *)fc_malloc(path_len + 32); - if (writer->file.name == NULL) { + fc_safe_strcpy(writer->cfg.subdir_name, subdir_name); + fc_safe_strcpy(writer->cfg.file_prefix, file_prefix); + writer->file.name.size = path_len + 32; + writer->file.name.str = (char *)fc_malloc(writer->file.name.size); + if (writer->file.name.str == NULL) { return ENOMEM; } @@ -542,9 +540,9 @@ void sf_file_writer_destroy(SFFileWriterInfo *writer) close(writer->file.fd); writer->file.fd = -1; } - if (writer->file.name != NULL) { - free(writer->file.name); - writer->file.name = NULL; + if (writer->file.name.str != NULL) { + free(writer->file.name.str); + writer->file.name.str = NULL; } sf_binlog_buffer_destroy(&writer->binlog_buffer); } diff --git a/src/sf_file_writer.h b/src/sf_file_writer.h index 28b70d1..ec073e0 100644 --- a/src/sf_file_writer.h +++ b/src/sf_file_writer.h @@ -28,7 +28,8 @@ #define SF_BINLOG_DEFAULT_ROTATE_SIZE (1024 * 1024 * 1024) #define SF_BINLOG_NEVER_ROTATE_FILE 0 #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; @@ -53,8 +54,11 @@ typedef struct sf_file_writer_info { struct { int fd; - int64_t size; - char *name; + int64_t size; //file size + struct { + char *str; + int size; + } name; } file; 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, 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; } @@ -231,8 +236,34 @@ static inline const char *sf_file_writer_get_filename_ex( const char *file_prefix, const int binlog_index, char *filename, const int size) { - snprintf(filename, size, "%s/%s/%s"SF_BINLOG_FILE_EXT_FMT, - data_path, subdir_name, file_prefix, binlog_index); + char *p; + 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; } diff --git a/src/sf_global.c b/src/sf_global.c index 03cb242..fc0ce4e 100644 --- a/src/sf_global.c +++ b/src/sf_global.c @@ -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; return 0; } @@ -271,6 +272,7 @@ int sf_load_global_base_path(IniFullContext *ini_ctx) } 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 ((result=fc_check_mkdir_ex(SF_G_BASE_PATH_STR, 0775, &SF_G_BASE_PATH_CREATED)) != 0) @@ -525,7 +527,7 @@ static void set_bind_address(const char *bind_addr, char *ipv4_bind_addr, 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); for (i=0; i= addr_size) { + len = addr_size - 1; + } + memcpy(ipv6_bind_addr, ip_addr, len); + *(ipv6_bind_addr + len) = '\0'; } 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 *data_path; + int data_path_len; + int path_size; data_path = iniGetStrValue(ini_ctx->section_name, item_name, ini_ctx->context); @@ -1061,20 +1069,23 @@ int sf_load_data_path_config_ex(IniFullContext *ini_ctx, return EINVAL; } + data_path_len = strlen(data_path); if (*data_path == '/') { - path->len = strlen(data_path); + path->len = data_path_len; path->str = fc_strdup1(data_path, path->len); if (path->str == NULL) { return ENOMEM; } } else { - path->len = strlen(SF_G_BASE_PATH_STR) + strlen(data_path) + 1; - path->str = (char *)fc_malloc(path->len + 1); + path_size = SF_G_BASE_PATH_LEN + data_path_len + 2; + path->str = (char *)fc_malloc(path_size); if (path->str == NULL) { 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); path->len = strlen(path->str); diff --git a/src/sf_global.h b/src/sf_global.h index 08db74a..0f6dadd 100644 --- a/src/sf_global.h +++ b/src/sf_global.h @@ -32,6 +32,7 @@ typedef struct sf_connection_stat { typedef struct sf_global_variables { struct { char str[MAX_PATH_SIZE]; + int len; bool inited; bool created; } base_path; @@ -79,6 +80,7 @@ extern SFGlobalVariables g_sf_global_vars; extern SFContext g_sf_context; #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_CREATED g_sf_global_vars.base_path.created #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; FC_SET_STRING(path_string, (char *)base_path); - normalize_path(NULL, &path_string, SF_G_BASE_PATH_STR, - sizeof(SF_G_BASE_PATH_STR)); + SF_G_BASE_PATH_LEN = normalize_path(NULL, &path_string, + SF_G_BASE_PATH_STR, sizeof(SF_G_BASE_PATH_STR)); SF_G_BASE_PATH_INITED = true; } diff --git a/src/sf_ordered_writer.c b/src/sf_ordered_writer.c index bf0755c..043d58f 100644 --- a/src/sf_ordered_writer.c +++ b/src/sf_ordered_writer.c @@ -106,7 +106,7 @@ void sf_ordered_writer_finish(SFOrderedWriterContext *ctx) { int count; - if (ctx->writer.fw.file.name != NULL) { + if (ctx->writer.fw.file.name.str != NULL) { fc_queue_terminate(&ctx->thread.queues.version); count = 0; @@ -120,8 +120,8 @@ void sf_ordered_writer_finish(SFOrderedWriterContext *ctx) __LINE__, ctx->writer.fw.cfg.subdir_name); } - free(ctx->writer.fw.file.name); - ctx->writer.fw.file.name = NULL; + free(ctx->writer.fw.file.name.str); + ctx->writer.fw.file.name.str = NULL; } if (ctx->writer.fw.file.fd >= 0) { diff --git a/src/sf_service.c b/src/sf_service.c index d89a754..685ed01 100644 --- a/src/sf_service.c +++ b/src/sf_service.c @@ -115,7 +115,7 @@ int sf_service_init_ex2(SFContext *sf_context, const char *name, pthread_t tid; 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->realloc_task_buffer = sf_context->net_buffer_cfg. min_buff_size < sf_context->net_buffer_cfg.max_buff_size;