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;
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;
}

View File

@ -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) {

View File

@ -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);
}

View File

@ -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;
}
@ -230,12 +235,38 @@ static inline const char *sf_file_writer_get_filename_ex(
const char *data_path, const char *subdir_name,
const char *file_prefix, const int binlog_index,
char *filename, const int size)
{
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;
}
#define sf_file_writer_get_filename(data_path, subdir_name, \
binlog_index, filename, size) \
sf_file_writer_get_filename_ex(data_path, subdir_name, \

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;
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<count; i++) {
ip_addr = cols[i];
@ -535,9 +537,13 @@ static void set_bind_address(const char *bind_addr, char *ipv4_bind_addr,
++ip_addr;
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 {
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);

View File

@ -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;
}

View File

@ -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) {

View File

@ -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;