[Feature][T8TSK-284][syslog] after syslog 4k/8k/16k buffer, add time-out flush
Affected branch: unknown
Affected module: unknown
Is it affected on both ZXIC and MTK: only GSW
Self-test: Yes
Doc Update: No
Change-Id: I17fa0dfd06bb31b0ccc5df5c6b34a8571d5da24f
diff --git a/meta-sdk/meta/meta-mediatek-ivt/recipes-core/busybox/busybox/ring_buf.patch b/meta-sdk/meta/meta-mediatek-ivt/recipes-core/busybox/busybox/ring_buf.patch
index 968cb53..89b810b 100755
--- a/meta-sdk/meta/meta-mediatek-ivt/recipes-core/busybox/busybox/ring_buf.patch
+++ b/meta-sdk/meta/meta-mediatek-ivt/recipes-core/busybox/busybox/ring_buf.patch
@@ -22,20 +22,23 @@
#define DEBUG 0
/* MARK code is not very useful, is bloat, and broken:
-@@ -210,6 +217,7 @@
-
- typedef struct logFile_t {
+@@ -212,6 +219,8 @@
const char *path;
-+ FILE * fp;
int fd;
time_t last_log_time;
++ FILE * fp;
++ int will_flush_bytes;
#if ENABLE_FEATURE_ROTATE_LOGFILE
-@@ -677,6 +685,79 @@
+ unsigned size;
+ uint8_t isRegular;
+@@ -677,6 +686,129 @@
static void log_to_kmsg(int pri UNUSED_PARAM, const char *msg UNUSED_PARAM) {}
#endif /* FEATURE_KMSG_SYSLOG */
+int g_syslog_buffer_size=8*1024;
+char g_syslog_buffer[16*1024];
++int g_max_flush_interval=0;
++
+
+int syslog_is_buffer_write()
+{
@@ -51,15 +54,33 @@
+
+void syslog_close_fp_fd(FILE * fp, int* fd)
+{
-+ if(syslog_is_buffer_write() && (*fd) > 1)
-+ {
-+ fclose(fp);
-+ }
-+ else
-+ {
-+ close(*fd);
-+ }
-+ (*fd) = -1;
++ if((*fd) > 1)
++ {
++ if(syslog_is_buffer_write())
++ {
++ fclose(fp);
++ }
++ else
++ {
++ close(*fd);
++ }
++ (*fd) = -1;
++ }
++}
++
++void syslog_close_all_fp_fd()
++{
++#if ENABLE_FEATURE_SYSLOGD_CFG
++ logRule_t *rule;
++
++ for (rule = G.log_rules; rule; rule = rule->next) {
++ if(rule->file!=NULL)
++ {
++ syslog_close_fp_fd(rule->file->fp,&(rule->file->fd));
++ }
++ }
++#endif
++ syslog_close_fp_fd(G.logFile.fp,&(G.logFile.fd));
+}
+
+void syslog_get_fp_fd(const char * path, FILE** fp, int* fd)
@@ -95,22 +116,52 @@
+ }
+}
+
-+int syslog_write(FILE* fp, int fd, char *msg, int len)
++void syslog_get_now_time(time_t* now)
+{
++
++ time(now);
++}
++
++void syslog_write(FILE* fp, int fd, char *msg, int* len, time_t* last_log_time,int* will_flush_bytes)
++{
++ unsigned long interval;
++ time_t now;
+ if(syslog_is_buffer_write() && fd > 1)
+ {
-+ return fwrite(msg,1,len,fp);
++ *len = fwrite(msg,1,*len,fp);
++ if(*len > 0 && g_max_flush_interval>0)
++ {
++ (*will_flush_bytes)+=(*len);
++ syslog_get_now_time(&now);
++ if((*will_flush_bytes) >=g_syslog_buffer_size)
++ {
++ (*will_flush_bytes)=(*will_flush_bytes)%g_syslog_buffer_size;
++
++ *last_log_time=now;
++ }
++ else
++ {
++ interval = difftime(now,*last_log_time);
++
++ if(interval>=g_max_flush_interval)
++ {
++ fflush(fp);
++ *last_log_time=now;
++ (*will_flush_bytes) = 0;
++ }
++ }
++ }
+ }
+ else
+ {
-+ return full_write(fd, msg, len);
++ *len = full_write(fd, msg, *len);
+ }
+}
+
/* Print a message to the log file. */
static void log_locally(time_t now, char *msg, logFile_t *log_file)
{
-@@ -693,14 +774,24 @@
+@@ -693,14 +825,24 @@
* This costs almost nothing since it happens
* _at most_ once a second for each file, and happens
* only when each file is actually written.
@@ -130,7 +181,7 @@
+ }
+ if(log_file->last_log_time != now) {
+ log_file->last_log_time = now;
-+ close(log_file->fd);
++ syslog_close_fp_fd(log_file->fp,&(log_file->fd));
+ goto reopen;
+ }
}
@@ -142,7 +193,7 @@
}
else if (log_file->fd == 1) {
/* We are logging to stdout: do nothing */
-@@ -710,10 +801,8 @@
+@@ -710,10 +852,8 @@
log_file->fd = 1;
/* log_file->isRegular = 0; - already is */
} else {
@@ -155,7 +206,21 @@
if (log_file->fd < 0) {
/* cannot open logfile? - print to /dev/console then */
int fd = device_open(DEV_CONSOLE, O_WRONLY | O_NOCTTY | O_NONBLOCK);
-@@ -759,6 +848,10 @@
+@@ -723,7 +863,12 @@
+ if (fd != 2)
+ close(fd);
+ return;
+- }
++ }
++ if(syslog_is_buffer_write())
++ {
++ syslog_get_now_time(&(log_file->last_log_time));
++ log_file->will_flush_bytes=0;
++ }
+ #if ENABLE_FEATURE_ROTATE_LOGFILE
+ {
+ struct stat statf;
+@@ -759,6 +904,10 @@
rename(oldFile, newFile);
}
/* newFile == "f.0" now */
@@ -166,7 +231,7 @@
rename(log_file->path, newFile);
}
-@@ -776,15 +869,16 @@
+@@ -776,15 +925,18 @@
fl.l_type = F_UNLCK;
fcntl(log_file->fd, F_SETLKW, &fl);
#endif
@@ -176,29 +241,47 @@
}
/* TODO: what to do on write errors ("disk full")? */
- len = full_write(log_file->fd, msg, len);
-+ len = syslog_write(log_file->fp,log_file->fd,msg,len);
++ syslog_write(log_file->fp,log_file->fd,msg,&len,&(log_file->last_log_time),&(log_file->will_flush_bytes));
+
if (len > 0)
- log_file->size += len;
+- log_file->size += len;
++ {
++ log_file->size += len;
++ }
#else
- full_write(log_file->fd, msg, len);
-+ syslog_write(log_file->fp,log_file->fd,msg,len);
++ syslog_write(log_file->fp,log_file->fd,msg,&len,&(log_file->last_log_time),&(log_file->will_flush_bytes));
#endif
#ifdef SYSLOGD_WRLOCK
-@@ -974,6 +1068,11 @@
+@@ -974,6 +1126,26 @@
}
#endif
+static void syslog_signal_handler(int signum) {
+ fflush_all();
++ if(syslog_is_buffer_write() && g_max_flush_interval > 0)
++ {
++ time(&(G.logFile.last_log_time));
++ G.logFile.will_flush_bytes =0;
++#if ENABLE_FEATURE_SYSLOGD_CFG
++ logRule_t *rule;
++ for (rule = G.log_rules; rule; rule = rule->next) {
++ if(rule->file!=NULL)
++ {
++ time(&(rule->file->last_log_time));
++ rule->file->will_flush_bytes =0;
++ }
++ }
++#endif
++ }
+}
+
+
static void do_syslogd(void) NORETURN;
static void do_syslogd(void)
{
-@@ -997,6 +1096,7 @@
+@@ -997,6 +1169,7 @@
signal(SIGALRM, do_mark);
alarm(G.markInterval);
#endif
@@ -206,15 +289,15 @@
xmove_fd(create_socket(), STDIN_FILENO);
if (option_mask32 & OPT_circularlog)
-@@ -1089,6 +1189,7 @@
+@@ -1089,6 +1262,7 @@
} /* while (!bb_got_signal) */
timestamp_and_log_internal("syslogd exiting");
-+ syslog_close_fp_fd(G.logFile.fp,&(G.logFile.fd));
++ syslog_close_all_fp_fd();
remove_pidfile(CONFIG_PID_FILE_PATH "/syslogd.pid");
ipcsyslog_cleanup();
if (option_mask32 & OPT_kmsg)
-@@ -1097,11 +1198,45 @@
+@@ -1097,11 +1271,45 @@
#undef recvbuf
}
@@ -234,13 +317,14 @@
+ }
+}
+
-+void syslog_get_uci_config(int* lynq_syslog_filesize, int* lynq_syslog_rotate, int* lynq_syslog_buffer_size)
++void syslog_get_uci_config(int* lynq_syslog_filesize, int* lynq_syslog_rotate, int* lynq_syslog_buffer_size,int* lynq_max_flush_interval)
+{
+ if(NULL != lynq_get_value && (NULL != lynq_set_value))
+ {
+ syslog_get_uci_config_item("syslog_flie_size",lynq_syslog_filesize);
+ syslog_get_uci_config_item("syslog_flie_rotate",lynq_syslog_rotate);
-+ syslog_get_uci_config_item("syslog_flie_buffer_size",lynq_syslog_buffer_size);
++ syslog_get_uci_config_item("syslog_flie_buffer_size",lynq_syslog_buffer_size);
++ syslog_get_uci_config_item("syslog_flie_max_flush_interval",lynq_max_flush_interval);
+ }
+}
+
@@ -255,19 +339,18 @@
+ int lynq_syslog_filesize = 80*1024*1024;
+ int lynq_syslog_rotate = 10;
+ const char *lynq_libpath_uci = "/lib64/liblynq-uci.so";
-+ int lynq_syslog_buffer_size = 8*1024;
+
#if ENABLE_FEATURE_REMOTE_LOG
llist_t *remoteAddrList = NULL;
#endif
-@@ -1157,6 +1292,14 @@
+@@ -1157,6 +1365,14 @@
//umask(0); - why??
write_pidfile(CONFIG_PID_FILE_PATH "/syslogd.pid");
+ handle_uci = dlopen(lynq_libpath_uci,RTLD_NOW);
+ lynq_get_value = (int (*)(void))dlsym(handle_uci,"lynq_get_value");
+ lynq_set_value = (int (*)(char *section, char *key, char *value))dlsym(handle_uci,"lynq_set_value");
-+ syslog_get_uci_config(&lynq_syslog_filesize, &lynq_syslog_rotate, &g_syslog_buffer_size);
++ syslog_get_uci_config(&lynq_syslog_filesize, &lynq_syslog_rotate, &g_syslog_buffer_size,&g_max_flush_interval);
+
+ G.logFileSize = lynq_syslog_filesize;
+ G.logFileRotate = lynq_syslog_rotate;
@@ -275,7 +358,7 @@
do_syslogd();
/* return EXIT_SUCCESS; */
}
-@@ -1171,3 +1314,6 @@
+@@ -1171,3 +1387,6 @@
#undef OPTION_STR
#undef OPTION_DECL
#undef OPTION_PARAM
diff --git a/meta/meta-mediatek-ivt/recipes-core/busybox/busybox/ring_buf.patch b/meta/meta-mediatek-ivt/recipes-core/busybox/busybox/ring_buf.patch
index 968cb53..89b810b 100755
--- a/meta/meta-mediatek-ivt/recipes-core/busybox/busybox/ring_buf.patch
+++ b/meta/meta-mediatek-ivt/recipes-core/busybox/busybox/ring_buf.patch
@@ -22,20 +22,23 @@
#define DEBUG 0
/* MARK code is not very useful, is bloat, and broken:
-@@ -210,6 +217,7 @@
-
- typedef struct logFile_t {
+@@ -212,6 +219,8 @@
const char *path;
-+ FILE * fp;
int fd;
time_t last_log_time;
++ FILE * fp;
++ int will_flush_bytes;
#if ENABLE_FEATURE_ROTATE_LOGFILE
-@@ -677,6 +685,79 @@
+ unsigned size;
+ uint8_t isRegular;
+@@ -677,6 +686,129 @@
static void log_to_kmsg(int pri UNUSED_PARAM, const char *msg UNUSED_PARAM) {}
#endif /* FEATURE_KMSG_SYSLOG */
+int g_syslog_buffer_size=8*1024;
+char g_syslog_buffer[16*1024];
++int g_max_flush_interval=0;
++
+
+int syslog_is_buffer_write()
+{
@@ -51,15 +54,33 @@
+
+void syslog_close_fp_fd(FILE * fp, int* fd)
+{
-+ if(syslog_is_buffer_write() && (*fd) > 1)
-+ {
-+ fclose(fp);
-+ }
-+ else
-+ {
-+ close(*fd);
-+ }
-+ (*fd) = -1;
++ if((*fd) > 1)
++ {
++ if(syslog_is_buffer_write())
++ {
++ fclose(fp);
++ }
++ else
++ {
++ close(*fd);
++ }
++ (*fd) = -1;
++ }
++}
++
++void syslog_close_all_fp_fd()
++{
++#if ENABLE_FEATURE_SYSLOGD_CFG
++ logRule_t *rule;
++
++ for (rule = G.log_rules; rule; rule = rule->next) {
++ if(rule->file!=NULL)
++ {
++ syslog_close_fp_fd(rule->file->fp,&(rule->file->fd));
++ }
++ }
++#endif
++ syslog_close_fp_fd(G.logFile.fp,&(G.logFile.fd));
+}
+
+void syslog_get_fp_fd(const char * path, FILE** fp, int* fd)
@@ -95,22 +116,52 @@
+ }
+}
+
-+int syslog_write(FILE* fp, int fd, char *msg, int len)
++void syslog_get_now_time(time_t* now)
+{
++
++ time(now);
++}
++
++void syslog_write(FILE* fp, int fd, char *msg, int* len, time_t* last_log_time,int* will_flush_bytes)
++{
++ unsigned long interval;
++ time_t now;
+ if(syslog_is_buffer_write() && fd > 1)
+ {
-+ return fwrite(msg,1,len,fp);
++ *len = fwrite(msg,1,*len,fp);
++ if(*len > 0 && g_max_flush_interval>0)
++ {
++ (*will_flush_bytes)+=(*len);
++ syslog_get_now_time(&now);
++ if((*will_flush_bytes) >=g_syslog_buffer_size)
++ {
++ (*will_flush_bytes)=(*will_flush_bytes)%g_syslog_buffer_size;
++
++ *last_log_time=now;
++ }
++ else
++ {
++ interval = difftime(now,*last_log_time);
++
++ if(interval>=g_max_flush_interval)
++ {
++ fflush(fp);
++ *last_log_time=now;
++ (*will_flush_bytes) = 0;
++ }
++ }
++ }
+ }
+ else
+ {
-+ return full_write(fd, msg, len);
++ *len = full_write(fd, msg, *len);
+ }
+}
+
/* Print a message to the log file. */
static void log_locally(time_t now, char *msg, logFile_t *log_file)
{
-@@ -693,14 +774,24 @@
+@@ -693,14 +825,24 @@
* This costs almost nothing since it happens
* _at most_ once a second for each file, and happens
* only when each file is actually written.
@@ -130,7 +181,7 @@
+ }
+ if(log_file->last_log_time != now) {
+ log_file->last_log_time = now;
-+ close(log_file->fd);
++ syslog_close_fp_fd(log_file->fp,&(log_file->fd));
+ goto reopen;
+ }
}
@@ -142,7 +193,7 @@
}
else if (log_file->fd == 1) {
/* We are logging to stdout: do nothing */
-@@ -710,10 +801,8 @@
+@@ -710,10 +852,8 @@
log_file->fd = 1;
/* log_file->isRegular = 0; - already is */
} else {
@@ -155,7 +206,21 @@
if (log_file->fd < 0) {
/* cannot open logfile? - print to /dev/console then */
int fd = device_open(DEV_CONSOLE, O_WRONLY | O_NOCTTY | O_NONBLOCK);
-@@ -759,6 +848,10 @@
+@@ -723,7 +863,12 @@
+ if (fd != 2)
+ close(fd);
+ return;
+- }
++ }
++ if(syslog_is_buffer_write())
++ {
++ syslog_get_now_time(&(log_file->last_log_time));
++ log_file->will_flush_bytes=0;
++ }
+ #if ENABLE_FEATURE_ROTATE_LOGFILE
+ {
+ struct stat statf;
+@@ -759,6 +904,10 @@
rename(oldFile, newFile);
}
/* newFile == "f.0" now */
@@ -166,7 +231,7 @@
rename(log_file->path, newFile);
}
-@@ -776,15 +869,16 @@
+@@ -776,15 +925,18 @@
fl.l_type = F_UNLCK;
fcntl(log_file->fd, F_SETLKW, &fl);
#endif
@@ -176,29 +241,47 @@
}
/* TODO: what to do on write errors ("disk full")? */
- len = full_write(log_file->fd, msg, len);
-+ len = syslog_write(log_file->fp,log_file->fd,msg,len);
++ syslog_write(log_file->fp,log_file->fd,msg,&len,&(log_file->last_log_time),&(log_file->will_flush_bytes));
+
if (len > 0)
- log_file->size += len;
+- log_file->size += len;
++ {
++ log_file->size += len;
++ }
#else
- full_write(log_file->fd, msg, len);
-+ syslog_write(log_file->fp,log_file->fd,msg,len);
++ syslog_write(log_file->fp,log_file->fd,msg,&len,&(log_file->last_log_time),&(log_file->will_flush_bytes));
#endif
#ifdef SYSLOGD_WRLOCK
-@@ -974,6 +1068,11 @@
+@@ -974,6 +1126,26 @@
}
#endif
+static void syslog_signal_handler(int signum) {
+ fflush_all();
++ if(syslog_is_buffer_write() && g_max_flush_interval > 0)
++ {
++ time(&(G.logFile.last_log_time));
++ G.logFile.will_flush_bytes =0;
++#if ENABLE_FEATURE_SYSLOGD_CFG
++ logRule_t *rule;
++ for (rule = G.log_rules; rule; rule = rule->next) {
++ if(rule->file!=NULL)
++ {
++ time(&(rule->file->last_log_time));
++ rule->file->will_flush_bytes =0;
++ }
++ }
++#endif
++ }
+}
+
+
static void do_syslogd(void) NORETURN;
static void do_syslogd(void)
{
-@@ -997,6 +1096,7 @@
+@@ -997,6 +1169,7 @@
signal(SIGALRM, do_mark);
alarm(G.markInterval);
#endif
@@ -206,15 +289,15 @@
xmove_fd(create_socket(), STDIN_FILENO);
if (option_mask32 & OPT_circularlog)
-@@ -1089,6 +1189,7 @@
+@@ -1089,6 +1262,7 @@
} /* while (!bb_got_signal) */
timestamp_and_log_internal("syslogd exiting");
-+ syslog_close_fp_fd(G.logFile.fp,&(G.logFile.fd));
++ syslog_close_all_fp_fd();
remove_pidfile(CONFIG_PID_FILE_PATH "/syslogd.pid");
ipcsyslog_cleanup();
if (option_mask32 & OPT_kmsg)
-@@ -1097,11 +1198,45 @@
+@@ -1097,11 +1271,45 @@
#undef recvbuf
}
@@ -234,13 +317,14 @@
+ }
+}
+
-+void syslog_get_uci_config(int* lynq_syslog_filesize, int* lynq_syslog_rotate, int* lynq_syslog_buffer_size)
++void syslog_get_uci_config(int* lynq_syslog_filesize, int* lynq_syslog_rotate, int* lynq_syslog_buffer_size,int* lynq_max_flush_interval)
+{
+ if(NULL != lynq_get_value && (NULL != lynq_set_value))
+ {
+ syslog_get_uci_config_item("syslog_flie_size",lynq_syslog_filesize);
+ syslog_get_uci_config_item("syslog_flie_rotate",lynq_syslog_rotate);
-+ syslog_get_uci_config_item("syslog_flie_buffer_size",lynq_syslog_buffer_size);
++ syslog_get_uci_config_item("syslog_flie_buffer_size",lynq_syslog_buffer_size);
++ syslog_get_uci_config_item("syslog_flie_max_flush_interval",lynq_max_flush_interval);
+ }
+}
+
@@ -255,19 +339,18 @@
+ int lynq_syslog_filesize = 80*1024*1024;
+ int lynq_syslog_rotate = 10;
+ const char *lynq_libpath_uci = "/lib64/liblynq-uci.so";
-+ int lynq_syslog_buffer_size = 8*1024;
+
#if ENABLE_FEATURE_REMOTE_LOG
llist_t *remoteAddrList = NULL;
#endif
-@@ -1157,6 +1292,14 @@
+@@ -1157,6 +1365,14 @@
//umask(0); - why??
write_pidfile(CONFIG_PID_FILE_PATH "/syslogd.pid");
+ handle_uci = dlopen(lynq_libpath_uci,RTLD_NOW);
+ lynq_get_value = (int (*)(void))dlsym(handle_uci,"lynq_get_value");
+ lynq_set_value = (int (*)(char *section, char *key, char *value))dlsym(handle_uci,"lynq_set_value");
-+ syslog_get_uci_config(&lynq_syslog_filesize, &lynq_syslog_rotate, &g_syslog_buffer_size);
++ syslog_get_uci_config(&lynq_syslog_filesize, &lynq_syslog_rotate, &g_syslog_buffer_size,&g_max_flush_interval);
+
+ G.logFileSize = lynq_syslog_filesize;
+ G.logFileRotate = lynq_syslog_rotate;
@@ -275,7 +358,7 @@
do_syslogd();
/* return EXIT_SUCCESS; */
}
-@@ -1171,3 +1314,6 @@
+@@ -1171,3 +1387,6 @@
#undef OPTION_STR
#undef OPTION_DECL
#undef OPTION_PARAM