[SR-Dev] git:janakj/flatstore: FIFO interface for log file rotation.
Jan Janak
jan at iptel.org
Sun Feb 15 18:56:45 CET 2009
Module: sip-router
Branch: janakj/flatstore
Commit: faac0ca2434db223299ad8e1271cbaa31bd00004
URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=faac0ca2434db223299ad8e1271cbaa31bd00004
Author: Jan Janak <jan at iptel.org>
Committer: Jan Janak <jan at iptel.org>
Date: Sat Oct 9 14:30:27 2004 +0000
FIFO interface for log file rotation.
---
modules/db_flatstore/flat_con.c | 76 ++++++++++++++++++++++++++-------
modules/db_flatstore/flat_con.h | 6 +++
modules/db_flatstore/flat_pool.c | 20 +++++++++
modules/db_flatstore/flat_pool.h | 12 +++++
modules/db_flatstore/flatstore.c | 5 ++
modules/db_flatstore/flatstore_mod.c | 47 ++++++++++++++++++---
modules/db_flatstore/flatstore_mod.h | 15 +++++++
7 files changed, 159 insertions(+), 22 deletions(-)
diff --git a/modules/db_flatstore/flat_con.c b/modules/db_flatstore/flat_con.c
index f8db134..cd5b5c9 100644
--- a/modules/db_flatstore/flat_con.c
+++ b/modules/db_flatstore/flat_con.c
@@ -39,29 +39,18 @@
#define FILE_SUFFIX ".log"
#define FILE_SUFFIX_LEN (sizeof(FILE_SUFFIX) - 1)
-struct flat_con* flat_new_connection(struct flat_id* id)
+
+static char* get_name(struct flat_id* id)
{
- char buf[PATH_MAX];
+ static char buf[PATH_MAX];
char* num, *ptr;
int num_len;
- struct flat_con* res;
-
if (!id) {
- LOG(L_ERR, "flat_new_connection: Invalid parameter value\n");
- return 0;
- }
-
- res = (struct flat_con*)pkg_malloc(sizeof(struct flat_con));
- if (!res) {
- LOG(L_ERR, "flat_new_connection: No memory left\n");
+ LOG(L_ERR, "get_name: Invalid parameter value\n");
return 0;
}
- memset(res, 0, sizeof(struct flat_con));
- res->ref = 1;
-
- res->id = id;
ptr = buf;
memcpy(ptr, id->dir.s, id->dir.len);
@@ -81,8 +70,35 @@ struct flat_con* flat_new_connection(struct flat_id* id)
ptr += FILE_SUFFIX_LEN;
*ptr = '\0';
+ return buf;
+}
+
+
+struct flat_con* flat_new_connection(struct flat_id* id)
+{
+ char* fn;
+
+ struct flat_con* res;
+
+ if (!id) {
+ LOG(L_ERR, "flat_new_connection: Invalid parameter value\n");
+ return 0;
+ }
- res->file = fopen(buf, "w");
+ res = (struct flat_con*)pkg_malloc(sizeof(struct flat_con));
+ if (!res) {
+ LOG(L_ERR, "flat_new_connection: No memory left\n");
+ return 0;
+ }
+
+ memset(res, 0, sizeof(struct flat_con));
+ res->ref = 1;
+
+ res->id = id;
+
+ fn = get_name(id);
+
+ res->file = fopen(fn, "w");
if (!res->file) {
LOG(L_ERR, "flat_new_connection: %s\n", strerror(errno));
pkg_free(res);
@@ -105,3 +121,31 @@ void flat_free_connection(struct flat_con* con)
}
pkg_free(con);
}
+
+
+/*
+ * Reopen a connection
+ */
+int flat_reopen_connection(struct flat_con* con)
+{
+ char* fn;
+
+ if (!con) {
+ LOG(L_ERR, "flat_reopen_connection: Invalid parameter value\n");
+ return -1;
+ }
+
+ if (con->file) {
+ fclose(con->file);
+
+ fn = get_name(con->id);
+
+ con->file = fopen(fn, "w");
+ if (!con->file) {
+ LOG(L_ERR, "flat_reopen_connection: Invalid parameter value\n");
+ return -1;
+ }
+ }
+
+ return 0;
+}
diff --git a/modules/db_flatstore/flat_con.h b/modules/db_flatstore/flat_con.h
index c075a07..341b2bd 100644
--- a/modules/db_flatstore/flat_con.h
+++ b/modules/db_flatstore/flat_con.h
@@ -61,4 +61,10 @@ struct flat_con* flat_new_connection(struct flat_id* id);
void flat_free_connection(struct flat_con* con);
+/*
+ * Reopen a connection
+ */
+int flat_reopen_connection(struct flat_con* con);
+
+
#endif /* _FLAT_CON_H */
diff --git a/modules/db_flatstore/flat_pool.c b/modules/db_flatstore/flat_pool.c
index da213cf..fadc472 100644
--- a/modules/db_flatstore/flat_pool.c
+++ b/modules/db_flatstore/flat_pool.c
@@ -44,6 +44,7 @@ static struct flat_con* pool = 0;
static int pool_pid;
+
/*
* Get a connection from the pool, reuse existing
* if possible, otherwise create a new one
@@ -134,3 +135,22 @@ void flat_release_connection(struct flat_con* con)
flat_free_connection(con);
}
+
+
+/*
+ * Close and reopen all opened connections
+ */
+int flat_rotate_logs(void)
+{
+ struct flat_con* ptr;
+
+ ptr = pool;
+ while(ptr) {
+ if (flat_reopen_connection(ptr)) {
+ return -1;
+ }
+ ptr = ptr->next;
+ }
+
+ return 0;
+}
diff --git a/modules/db_flatstore/flat_pool.h b/modules/db_flatstore/flat_pool.h
index 955ae8b..3d6fc27 100644
--- a/modules/db_flatstore/flat_pool.h
+++ b/modules/db_flatstore/flat_pool.h
@@ -47,4 +47,16 @@ struct flat_con* flat_get_connection(char* dir, char* table);
void flat_release_connection(struct flat_con* con);
+/*
+ * Close and reopen all opened connections
+ */
+int flat_rotate_logs(void);
+
+
+/*
+ * Reopen a connection
+ */
+int flat_reopen_connection(struct flat_con* con);
+
+
#endif /* _FLAT_POOL_H */
diff --git a/modules/db_flatstore/flatstore.c b/modules/db_flatstore/flatstore.c
index ffe8027..8b7bfc2 100644
--- a/modules/db_flatstore/flatstore.c
+++ b/modules/db_flatstore/flatstore.c
@@ -162,6 +162,11 @@ int flat_db_insert(db_con_t* h, db_key_t* k, db_val_t* v, int n)
return -1;
}
+ if (local_timestamp < *flat_rotate) {
+ flat_rotate_logs();
+ local_timestamp = *flat_rotate;
+ }
+
for(i = 0; i < n; i++) {
switch(VAL_TYPE(v + i)) {
case DB_INT:
diff --git a/modules/db_flatstore/flatstore_mod.c b/modules/db_flatstore/flatstore_mod.c
index a7106a3..d281992 100644
--- a/modules/db_flatstore/flatstore_mod.c
+++ b/modules/db_flatstore/flatstore_mod.c
@@ -34,7 +34,9 @@
*/
#include "../../sr_module.h"
+#include "../../mem/shm_mem.h"
#include "flatstore.h"
+#include "flat_fifo.h"
#include "flatstore_mod.h"
MODULE_VERSION
@@ -43,6 +45,9 @@ static int child_init(int rank);
static int mod_init(void);
+static void mod_destroy(void);
+
+
/*
* Process number used in filenames
*/
@@ -61,6 +66,14 @@ char* flat_delimiter = "|";
/*
+ * Timestamp of the last log rotation request from
+ * the FIFO interface
+ */
+time_t* flat_rotate;
+
+time_t local_timestamp;
+
+/*
* Flatstore database module interface
*/
static cmd_export_t cmds[] = {
@@ -84,12 +97,12 @@ static param_export_t params[] = {
struct module_exports exports = {
"flatstore",
cmds,
- params, /* module parameters */
- mod_init, /* module initialization function */
- 0, /* response function*/
- 0, /* destroy function */
- 0, /* oncancel function */
- child_init /* per-child init function */
+ params, /* module parameters */
+ mod_init, /* module initialization function */
+ 0, /* response function*/
+ mod_destroy, /* destroy function */
+ 0, /* oncancel function */
+ child_init /* per-child init function */
};
@@ -99,10 +112,32 @@ static int mod_init(void)
LOG(L_ERR, "flatstore:mod_init: Delimiter has to be exactly one character\n");
return -1;
}
+
+ /* Initialize fifo interface */
+ if (init_flat_fifo() < 0) {
+ LOG(L_ERR, "usrloc/fifo initialization failed\n");
+ return -1;
+ }
+
+ flat_rotate = (time_t*)shm_malloc(sizeof(time_t));
+ if (!flat_rotate) {
+ LOG(L_ERR, "flatstore: No shared memory left\n");
+ return -1;
+ }
+
+ *flat_rotate = time(0);
+ local_timestamp = *flat_rotate;
+
return 0;
}
+static void mod_destroy(void)
+{
+ if (flat_rotate) shm_free(flat_rotate);
+}
+
+
static int child_init(int rank)
{
if (rank <= 0) {
diff --git a/modules/db_flatstore/flatstore_mod.h b/modules/db_flatstore/flatstore_mod.h
index 24ea2f5..83bc593 100644
--- a/modules/db_flatstore/flatstore_mod.h
+++ b/modules/db_flatstore/flatstore_mod.h
@@ -36,6 +36,7 @@
#ifndef FLATSTORE_MOD_H
#define FLATSTORE_MOD_H
+#include <time.h>
/*
* Process number used in filenames
@@ -55,4 +56,18 @@ extern int flat_flush;
extern char* flat_delimiter;
+/*
+ * The timestamp of log rotation request from
+ * the FIFO interface
+ */
+extern time_t* flat_rotate;
+
+
+/*
+ * Local timestamp marking the time of the
+ * last log rotation in the process
+ */
+extern time_t local_timestamp;
+
+
#endif /* FLATSTORE_MOD_H */
More information about the sr-dev
mailing list