heart : multi-user logging : classify sub-modules with DB type. 25/81125/9
authorKichan Kwon <k_c.kwon@samsung.com>
Fri, 22 Jul 2016 07:12:49 +0000 (16:12 +0900)
committerKichan Kwon <k_c.kwon@samsung.com>
Thu, 11 Aug 2016 03:51:53 +0000 (12:51 +0900)
- SYSTEM_DEFAULT : use default SQLite3 DB
- SYSTEM_OWN : use their own DB
- USER_DEFAULT and USER_OWN will be implemented

Change-Id: I172b677bf01ebb9a8bf88c3c673f1b2638e03d95
Signed-off-by: Kichan Kwon <k_c.kwon@samsung.com>
packaging/resourced.spec
src/heart/dump_heart_data.sh.in
src/heart/heart-abnormal.c
src/heart/heart-appopt.c
src/heart/heart-battery.c
src/heart/heart-cpu.c
src/heart/heart-memory.c
src/heart/heart-storage.c
src/heart/include/logging.h
src/heart/logging.c

index 4d546c2..a845e58 100644 (file)
@@ -48,8 +48,7 @@ Source2:    resourced-cpucgroup.service
 %define exclude_list_opt_full_path %{TZ_SYS_ETC}/%{exclude_list_file_name}
 %define database_full_path %{TZ_SYS_GLOBALUSER_DB}/.resourced-datausage.db
 
-%define logging_db_full_path %{TZ_SYS_GLOBALUSER_DB}/.resourced-logging.db
-%define logging_storage_db_full_path %{TZ_SYS_GLOBALUSER_DB}/.resourced-logging-storage.db
+%define logging_storage_db_full_path %{TZ_SYS_GLOBALUSER_DB}/.resourced-heart-storage.db
 
 %define rd_config_path /etc/resourced
 
@@ -162,7 +161,6 @@ cp -f LICENSE %{buildroot}/usr/share/license/%{name}
 %if %{?heart_module} == ON
        mkdir -p %{buildroot}/%{TZ_SYS_GLOBALUSER_DATA}/heart
        mkdir -p %{buildroot}/%{TZ_SYS_GLOBALUSER_DB}
-       sqlite3 %{buildroot}%{logging_db_full_path}
        sqlite3 --line %{buildroot}%{logging_storage_db_full_path} 'PRAGMA journal_mode = WAL'
        touch %{buildroot}%{logging_storage_db_full_path}-shm
        touch %{buildroot}%{logging_storage_db_full_path}-wal
index c842056..412abf3 100755 (executable)
@@ -1,5 +1,5 @@
 HEART_DEBUG=$1/heart
 /bin/mkdir -p ${HEART_DEBUG}
-/bin/cp -rf @RD_SYS_DB@/.resourced-logging-leveldb/ ${HEART_DEBUG}
-/bin/cp -rf @RD_SYS_DB@/.resourced-logging.db ${HEART_DEBUG}
+/bin/cp -rf @RD_SYS_DB@/.resourced-heart-leveldb/ ${HEART_DEBUG}
+/bin/cp -rf @RD_SYS_DB@/.resourced-heart-*.db ${HEART_DEBUG}
 /bin/cp -rf @RD_SYS_DATA@/heart/ ${HEART_DEBUG}
index cd31ae4..6ffdf32 100644 (file)
@@ -343,7 +343,7 @@ static int heart_abnormal_init(void *data)
 {
        int ret;
 
-       ret = logging_module_init(ABNORMAL_NAME, ONE_WEEK, HALF_HOUR, NULL, 0);
+       ret = logging_module_init(ABNORMAL_NAME, ONE_WEEK, HALF_HOUR, NULL, 0, SYSTEM_DEFAULT);
        if (ret != RESOURCED_ERROR_NONE) {
                _E("logging module init failed");
                return RESOURCED_ERROR_FAIL;
index 3c19421..d783fe9 100644 (file)
@@ -44,7 +44,7 @@
 #include "proc-common.h"
 #include "edbus-handler.h"
 
-#define APPOPT_DB_FILE_NAME    RD_SYS_DB"/.resourced-appopt.db"
+#define APPOPT_DB_FILE_NAME    RD_SYS_DB"/.resourced-heart-appopt.db"
 #define APP_NAMES_TABLE                "appnames"
 #define APP_OPTS_TABLE         "appopts"
 #define QUERY_CREATE_APPNAMES  "CREATE TABLE IF NOT EXISTS "APP_NAMES_TABLE" (appkey INTEGER PRIMARY KEY AUTOINCREMENT, appname TEXT NOT NULL UNIQUE);"
index 35f55a8..1b66fc3 100644 (file)
@@ -1940,7 +1940,7 @@ static int heart_battery_init(void *data)
        int ret;
 
        ret = logging_module_init(BATTERY_NAME, ONE_DAY, TEN_MINUTE,
-                       heart_battery_update, HEART_BATTERY_UPDATE_INTERVAL);
+                       heart_battery_update, HEART_BATTERY_UPDATE_INTERVAL, SYSTEM_DEFAULT);
        if (ret != RESOURCED_ERROR_NONE) {
                _E("logging module init failed");
                return RESOURCED_ERROR_FAIL;
index 46da071..dcdf216 100644 (file)
@@ -1339,7 +1339,8 @@ static int heart_cpu_init(void *data)
 {
        int ret;
 
-       ret = logging_module_init(CPU_NAME, ONE_DAY, TEN_MINUTE, heart_cpu_update, TEN_MINUTE);
+       ret = logging_module_init(CPU_NAME, ONE_DAY, TEN_MINUTE, heart_cpu_update,
+                       TEN_MINUTE, SYSTEM_DEFAULT);
        if (ret != RESOURCED_ERROR_NONE) {
                _E("logging module init failed");
                return RESOURCED_ERROR_FAIL;
index d55e3d4..5ebb471 100644 (file)
@@ -433,7 +433,7 @@ int heart_memory_get_query(GArray *arrays, enum heart_data_period period)
 {
        int count, result;
        time_t curr_time = time(NULL);
-       sqlite3 *heart_db;
+       sqlite3 *heart_db = NULL;
        sqlite3_stmt *stmt = NULL;
        gpointer value;
        gpointer key;
@@ -464,11 +464,8 @@ int heart_memory_get_query(GArray *arrays, enum heart_data_period period)
                return RESOURCED_ERROR_FAIL;
        }
 
-       result = sqlite3_open(LOGGING_DB_FILE_NAME, &heart_db);
-       if (result != SQLITE_OK) {
-               _E("Can't open database %s: %s\n", MEM_NAME,
-                               sqlite3_errmsg(heart_db));
-               sqlite3_close(heart_db);
+       if (logging_get_db(MEM_NAME, heart_db) != RESOURCED_ERROR_NONE) {
+               _E("Fail to get DB path");
                return RESOURCED_ERROR_FAIL;
        }
 
@@ -1426,7 +1423,8 @@ static int heart_memory_init(void *data)
 {
        int ret;
 
-       ret = logging_module_init(MEM_NAME, ONE_DAY, TEN_MINUTE, heart_memory_update, TEN_MINUTE);
+       ret = logging_module_init(MEM_NAME, ONE_DAY, TEN_MINUTE,
+                       heart_memory_update, TEN_MINUTE, SYSTEM_DEFAULT);
 
        if (ret != RESOURCED_ERROR_NONE) {
                _E("logging module init failed");
index 57c3b81..234cab1 100644 (file)
@@ -234,7 +234,7 @@ static int heart_storage_init(void *data)
        }
        g_queue_init(queue);
 
-       ret = logging_module_init_with_db_path(STORAGE_NAME, FOUR_MONTH, FIVE_MINUTE, NULL, 0, HEART_STORAGE_DB);
+       ret = logging_module_init(STORAGE_NAME, FOUR_MONTH, FIVE_MINUTE, NULL, 0, SYSTEM_OWN);
        if (ret != RESOURCED_ERROR_NONE) {
                _E("logging module init failed");
                return RESOURCED_ERROR_FAIL;
index 8298d4f..ee3aeb1 100644 (file)
@@ -27,6 +27,7 @@
 
 #include <stdio.h>
 #include <time.h>
+#include <sqlite3.h>
 #include "const.h"
 
 #ifndef CLOCK_BOOTTIME
 #define STRINGFY(x) #x
 #define KEY_TO_STRING(x) STRINGFY(x)
 
-#define LOGGING_DB_FILE_NAME                   RD_SYS_DB"/.resourced-logging.db"
-#define LOGGING_LEVEL_DB_FILE_NAME             RD_SYS_DB"/.resourced-logging-leveldb"
+#define SYSTEM_DEFAULT_DB_NAME RD_SYS_DB"/.resourced-heart-default.db"
+#define SYSTEM_OWN_DB_NAME             RD_SYS_DB"/.resourced-heart-%s.db"
+#define SYSTEM_LEVEL_DB_DIR            RD_SYS_DB"/.resourced-heart-leveldb"
+
 #define HOUR_TO_SEC(x)                         (x*3600)
 #define DAY_TO_SEC(x)                          (x*HOUR_TO_SEC(24))
 #define MONTH_TO_SEC(x)                                (x*DAY_TO_SEC(30))
@@ -65,6 +68,13 @@ enum logging_operation {
        DELETE
 };
 
+enum logging_db_type {
+       SYSTEM_DEFAULT = 0,     /* Use system default SQLite3 DB */
+       SYSTEM_OWN,                     /* Use their own DB(schema) in the system area */
+       USER_DEFAULT,           /* TODO : implement per user DB */
+       USER_OWN,
+};
+
 struct logging_table_form {
        char appid[MAX_APPID_LENGTH];
        char pkgid[MAX_PKGNAME_LENGTH];
@@ -90,11 +100,10 @@ int logging_init(void *data);
 int logging_exit(void *data);
 time_t logging_get_time(int clk_id);
 long logging_get_time_ms(void);
+int logging_get_db(char *name, sqlite3 *db);
 int logging_module_init(char *name, enum logging_period max_period,
-               enum logging_interval save_interval, logging_info_cb func, enum logging_interval update_interval);
-int logging_module_init_with_db_path(char *name, enum logging_period max_period,
-               enum logging_interval save_interval, logging_info_cb func, enum logging_interval update_interval,
-               const char *db_path);
+               enum logging_interval save_interval, logging_info_cb func,
+               enum logging_interval update_interval, enum logging_db_type db_type);
 int logging_module_exit(void);
 int logging_register_listener(char *name, logging_listener_cb listener);
 int logging_unregister_listener(char *name, logging_listener_cb listener);
index 47c54b7..c877c1b 100644 (file)
@@ -27,7 +27,6 @@
 
 #include <leveldb/c.h>
 #include <Ecore.h>
-#include <sqlite3.h>
 #include <unistd.h>
 #include <pthread.h>
 #include <glib.h>
@@ -88,6 +87,7 @@ struct logging_module {
        char *name;
        char *db_path;
        sqlite3 *db;
+       enum logging_db_type db_type;
        enum logging_period max_period;
        pthread_mutex_t cache_mutex;
        logging_info_cb func;
@@ -126,7 +126,7 @@ static pthread_cond_t logging_update_cond = PTHREAD_COND_INITIALIZER;
 static Ecore_Timer *logging_update_timer = NULL;
 
 static GArray *logging_modules;
-static sqlite3 *logging_db;
+static sqlite3 *system_default_db;
 static leveldb_t *logging_leveldb;
 static leveldb_options_t *options;
 static leveldb_readoptions_t *roptions;
@@ -184,13 +184,27 @@ static int logging_db_busy(void * UNUSED user, int attempts)
        return 1;
 }
 
-int logging_module_init_with_db_path(char *name, enum logging_period max_period,
-               enum logging_interval save_interval, logging_info_cb func, enum logging_interval update_interval, const char *db_path)
+int logging_get_db(char *name, sqlite3 *db)
+{
+       struct logging_module *module = logging_find_module(name);
+       if (!module) {
+               _E("HEART-%s is disabled", name);
+               return RESOURCED_ERROR_FAIL;
+       }
+
+       db = module->db;
+       return RESOURCED_ERROR_NONE;
+}
+
+int logging_module_init(char *name, enum logging_period max_period,
+               enum logging_interval save_interval, logging_info_cb func,
+               enum logging_interval update_interval, enum logging_db_type db_type)
 {
        int ret;
        sqlite3 *db = NULL;
        const char *path = NULL;
        sqlite3_stmt *stmt = NULL;
+       char db_path[LOGGING_BUF_MAX];
        char buf[LOGGING_BUF_MAX] = {0, };
        struct logging_module *module;
 
@@ -206,52 +220,65 @@ int logging_module_init_with_db_path(char *name, enum logging_period max_period,
 
        logging_instance->ref++;
 
-       /* check*/
        if (logging_find_module(name)) {
                _E("%s is already exist", name);
                return RESOURCED_ERROR_INVALID_PARAMETER;
        }
 
-       if (db_path) {
-               /* DB create */
+       /* DB create */
+       switch (db_type) {
+       case SYSTEM_DEFAULT:
+               db = system_default_db;
+               path = SYSTEM_DEFAULT_DB_NAME;
+               break;
+       case SYSTEM_OWN:
+               snprintf(db_path, LOGGING_BUF_MAX, SYSTEM_OWN_DB_NAME, name);
                if (sqlite3_open(db_path, &db) != SQLITE_OK) {
                        _E("%s DB open failed (%s)", db_path, sqlite3_errmsg(db));
-                       return RESOURCED_ERROR_FAIL;
+                       return RESOURCED_ERROR_DB_FAILED;
                }
-
                ret = sqlite3_exec(db, "PRAGMA locking_mode = NORMAL", 0, 0, 0);
                if (ret != SQLITE_OK) {
                        _E("Can't set locking mode %s", sqlite3_errmsg(db));
                        _E("Skip set busy handler.");
                } else {
                        /* Set how many times we'll repeat our attempts for sqlite_step */
-                       if (sqlite3_busy_handler(db, logging_db_busy, NULL) != SQLITE_OK)
+                       if (sqlite3_busy_handler(system_default_db, logging_db_busy, NULL) != SQLITE_OK)
                                _E("Couldn't set busy handler!");
                }
-
                path = db_path;
-       } else {
-               db = logging_db;
-               path = LOGGING_DB_FILE_NAME;
+               /* You MUST define schema at the sub-module */
+               break;
+       case USER_DEFAULT:
+       case USER_OWN:
+               _E("Not implemented yet");
+               return RESOURCED_ERROR_NOTIMPL;
+               break;
+       default:
+               _E("Unknown DB type");
+               return RESOURCED_ERROR_INVALID_PARAMETER;
+               break;
        }
 
-       /* create table using module name and field_forms */
-       snprintf(buf, LOGGING_BUF_MAX, CREATE_QUERY, name);
-       ret = sqlite3_prepare_v2(db, buf, read_until_null, &stmt, NULL);
-       if (ret != SQLITE_OK) {
-               _E("create %s table failed %s", name, sqlite3_errmsg(db));
-               sqlite3_finalize(stmt);
-               return RESOURCED_ERROR_DB_FAILED;
-       }
+       if (db_type == SYSTEM_DEFAULT) {
+               /* create table using module name and field_forms */
+               snprintf(buf, LOGGING_BUF_MAX, CREATE_QUERY, name);
+               ret = sqlite3_prepare_v2(db, buf, read_until_null, &stmt, NULL);
+               if (ret != SQLITE_OK) {
+                       _E("create %s table failed %s", name, sqlite3_errmsg(db));
+                       sqlite3_finalize(stmt);
+                       return RESOURCED_ERROR_DB_FAILED;
+               }
+
+               if (sqlite3_step(stmt) != SQLITE_DONE) {
+                       _E("create %s table failed %s", name, sqlite3_errmsg(db));
+                       sqlite3_finalize(stmt);
+                       return RESOURCED_ERROR_DB_FAILED;
+               }
 
-       if (sqlite3_step(stmt) != SQLITE_DONE) {
-               _E("create %s table failed %s", name, sqlite3_errmsg(db));
                sqlite3_finalize(stmt);
-               return RESOURCED_ERROR_DB_FAILED;
        }
 
-       sqlite3_finalize(stmt);
-
        module = malloc(sizeof(struct logging_module));
 
        if (!module) {
@@ -261,6 +288,7 @@ int logging_module_init_with_db_path(char *name, enum logging_period max_period,
 
        /* make logging_module_inform and set module_inform */
        module->db = db;
+       module->db_type = db_type;
        module->func = func;
        module->latest_update_time = time(NULL);
        module->save_interval = save_interval;
@@ -309,12 +337,6 @@ int logging_module_init_with_db_path(char *name, enum logging_period max_period,
        return RESOURCED_ERROR_NONE;
 }
 
-int logging_module_init(char *name, enum logging_period max_period,
-               enum logging_interval save_interval, logging_info_cb func, enum logging_interval update_interval)
-{
-       return logging_module_init_with_db_path(name, max_period, save_interval, func, update_interval, NULL);
-}
-
 int logging_module_exit(void)
 {
        if (!logging_instance)
@@ -961,7 +983,7 @@ void logging_save_to_storage(int force)
                pthread_mutex_lock(&(module->cache_mutex));
                len = g_queue_get_length(module->cache);
                if (!len) {
-                       _I("%s cache is empty", module->name);
+                       _D("%s cache is empty", module->name);
                        pthread_mutex_unlock(&(module->cache_mutex));
                        continue;
                }
@@ -1027,6 +1049,10 @@ void logging_save_to_storage(int force)
        for (i = 0; i < logging_modules->len; i++) {
                module = g_array_index(logging_modules, struct logging_module *, i);
 
+               /* Ignore sub-module using their own DB */
+               if (module->db == NULL)
+                       continue;
+
                /* Check storage limitation by maximum period and storage size (50MiB) */
                if (logging_check_storage_size(module->db_path) == RESOURCED_ERROR_FAIL) {
                        logging_reset(module->name);
@@ -1248,26 +1274,26 @@ int logging_init(void *data)
                return RESOURCED_ERROR_OUT_OF_MEMORY;
        }
 
-       /* DB create */
-       if (sqlite3_open(LOGGING_DB_FILE_NAME, &logging_db) != SQLITE_OK) {
-               _E("%s DB open failed (%s)", LOGGING_DB_FILE_NAME, sqlite3_errmsg(logging_db));
-               return RESOURCED_ERROR_FAIL;
+       /* Create default DB */
+       if (sqlite3_open(SYSTEM_DEFAULT_DB_NAME, &system_default_db) != SQLITE_OK) {
+               _E("%s DB open failed (%s)", SYSTEM_DEFAULT_DB_NAME,
+                               sqlite3_errmsg(system_default_db));
+               return RESOURCED_ERROR_DB_FAILED;
        }
-
-       ret = sqlite3_exec(logging_db, "PRAGMA locking_mode = NORMAL", 0, 0, 0);
+       ret = sqlite3_exec(system_default_db, "PRAGMA locking_mode = NORMAL", 0, 0, 0);
        if (ret != SQLITE_OK) {
-               _E("Can't set locking mode %s", sqlite3_errmsg(logging_db));
+               _E("Can't set locking mode %s", sqlite3_errmsg(system_default_db));
                _E("Skip set busy handler.");
                return RESOURCED_ERROR_DB_FAILED;
        }
-
        /* Set how many times we'll repeat our attempts for sqlite_step */
-       if (sqlite3_busy_handler(logging_db, logging_db_busy, NULL) != SQLITE_OK)
+       if (sqlite3_busy_handler(system_default_db, logging_db_busy, NULL) != SQLITE_OK)
                _E("Couldn't set busy handler!");
 
+       /* Create leveldb */
        options = leveldb_options_create();
        leveldb_options_set_create_if_missing(options, 1);
-       logging_leveldb = leveldb_open(options, LOGGING_LEVEL_DB_FILE_NAME, &err);
+       logging_leveldb = leveldb_open(options, SYSTEM_LEVEL_DB_DIR, &err);
        if (err != NULL) {
                _E("Failed to open leveldb");
                free(err);
@@ -1325,7 +1351,7 @@ int logging_exit(void *data)
        g_array_free(logging_modules, true);
 
        /* DB close */
-       sqlite3_close(logging_db);
+       sqlite3_close(system_default_db);
        if (logging_leveldb)
                leveldb_close(logging_leveldb);
        _D("logging_exit");