performance opt.: replace snprintf
parent
0b4936bd8f
commit
03f64998ce
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Reference in New Issue