From 3b28999fa9a1f7f8cd9b55ba6f8165e2447038fc Mon Sep 17 00:00:00 2001 From: Ingo Huerner Date: Thu, 30 Mar 2017 10:47:27 +0200 Subject: Added configure switch --enable-fsync to use fsync instead fdatasync. Added library constructor/destructor to call DLT_REGISTER_CONTEXT/DLT_UNREGISTER_CONTEXT --- configure.ac | 20 +++++++++ src/key-value-store/database/kissdb.c | 8 ++++ src/key-value-store/pers_low_level_db_access.c | 56 ++++++++++++++++++-------- 3 files changed, 68 insertions(+), 16 deletions(-) diff --git a/configure.ac b/configure.ac index e3564ba..ca2cd10 100644 --- a/configure.ac +++ b/configure.ac @@ -191,6 +191,26 @@ esac], AM_CONDITIONAL(DEBUG, test x"$debug" = x"true") +dnl ************************************* +dnl *** enable to use fsync instead of fdatasync for write through +dnl ************************************* +AC_ARG_ENABLE([fsync], + [AS_HELP_STRING([--enable-fsync],[Enable fsync instead of fdatasync])], + [use_fsync=$enableval], + [use_fsync="no"]) + +AM_CONDITIONAL([USE_FSYNC], [test x"$use_fsync" = "no"]) + +if test "$use_fsync" != "yes" -a "$use_fsync" != "no"; then + AC_MSG_ERROR([Invalid fsync check check: $use_fsync. Only "yes" or "no" is valid]) +else + AC_MSG_NOTICE([Use fsync: $use_fsync]) + + if test "$use_fsync" = "yes"; then + AC_DEFINE_UNQUOTED([USE_FSYNC], [1], [fsync is anabled]) + fi +fi + dnl ************************************* dnl *** Define extra paths *** diff --git a/src/key-value-store/database/kissdb.c b/src/key-value-store/database/kissdb.c index 63088f8..98df052 100644 --- a/src/key-value-store/database/kissdb.c +++ b/src/key-value-store/database/kissdb.c @@ -623,6 +623,7 @@ int KISSDB_close(KISSDB* db) //unmap shared hashtables munmap(db->hashTables, db->htMappedSize); db->hashTables = NULL; + //close shared memory for hashtables if( kdbShmemClose(db->htFd, db->htName) == Kdb_false) { @@ -662,8 +663,15 @@ int KISSDB_close(KISSDB* db) free(db->cacheName); //free memory for name obtained by kdbGetShmName() function db->cacheName = NULL; } + if( db->fd) { + // sync data to non volatile memory device +#if USE_FSYNC + fsync(db->fd); +#else + fdatasync(db->fd); +#endif close(db->fd); db->fd = 0; } diff --git a/src/key-value-store/pers_low_level_db_access.c b/src/key-value-store/pers_low_level_db_access.c index f1c1a42..cfc5ffc 100644 --- a/src/key-value-store/pers_low_level_db_access.c +++ b/src/key-value-store/pers_low_level_db_access.c @@ -155,6 +155,29 @@ static int openCache(KISSDB* db); //static int addCache(KISSDB* db); static int closeCache(KISSDB* db); + + +__attribute__((constructor)) +static void pco_library_init() +{ + pid_t pid = getpid(); + str_t dltContextID[16]; /* should be at most 4 characters string, but colissions occure */ + + /* init DLT */ + (void) snprintf(dltContextID, sizeof(dltContextID), "Pers_%04d", pid); + DLT_REGISTER_CONTEXT(persComLldbDLTCtx, dltContextID, "PersCommonLLDB"); + //DLT_SET_APPLICATION_LL_TS_LIMIT(DLT_LOG_DEBUG, DLT_TRACE_STATUS_OFF); + DLT_LOG(persComLldbDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR); DLT_STRING(__FUNCTION__); DLT_STRING(":"); DLT_STRING("register context PersCommonLLDB ContextID="); DLT_STRING(dltContextID)); +} + +__attribute__((destructor)) +static void pco_library_destroy() +{ + DLT_UNREGISTER_CONTEXT(persComLldbDLTCtx); +} + + + /** * \open or create a key-value database * \note : DB type is identified from dbPathname (based on extension) @@ -177,25 +200,9 @@ sint_t pers_lldb_open(str_t const* dbPathname, pers_lldb_purpose_e ePurpose, boo int writeMode = KISSDB_WRITE_MODE_WC; //default is write cached lldb_handler_s* pLldbHandler = NIL; sint_t returnValue = PERS_COM_FAILURE; - static bool_t bFirstCall = true; path = dbPathname; - if (bFirstCall) - { - pid_t pid = getpid(); - str_t dltContextID[16]; /* should be at most 4 characters string, but colissions occure */ - - /* set an error handler - the default one will cause the termination of the calling process */ - bFirstCall = false; - /* init DLT */ - (void) snprintf(dltContextID, sizeof(dltContextID), "Pers_%04d", pid); - DLT_REGISTER_CONTEXT(persComLldbDLTCtx, dltContextID, "PersCommonLLDB"); - //DLT_SET_APPLICATION_LL_TS_LIMIT(DLT_LOG_DEBUG, DLT_TRACE_STATUS_OFF); - DLT_LOG(persComLldbDLTCtx, DLT_LOG_DEBUG, - DLT_STRING(LT_HDR); DLT_STRING(__FUNCTION__); DLT_STRING(":"); DLT_STRING("register context PersCommonLLDB ContextID="); DLT_STRING(dltContextID)); - } - DLT_LOG(persComLldbDLTCtx, DLT_LOG_DEBUG, DLT_STRING(LT_HDR); DLT_STRING(__FUNCTION__); DLT_STRING("Begin opening:"); DLT_STRING("<"); DLT_STRING(dbPathname); DLT_STRING(">, "); ((PersLldbPurpose_RCT == ePurpose) ? DLT_STRING("RCT, ") : DLT_STRING("DB, ")); ((true == bForceCreationIfNotPresent) ? DLT_STRING("forced, ") : DLT_STRING("unforced, "))); @@ -1005,7 +1012,12 @@ static sint_t DeleteDataFromKissDB(sint_t dbHandler, pconststr_t key) } } + +#if USE_FSYNC + fsync(pLldbHandler->kissDb.fd); +#else fdatasync(pLldbHandler->kissDb.fd); +#endif } Kdb_unlock(&pLldbHandler->kissDb.shared->rwlock); } @@ -1079,7 +1091,11 @@ static sint_t DeleteDataFromKissRCT(sint_t dbHandler, pconststr_t key) } } +#if USE_FSYNC + fsync(pLldbHandler->kissDb.fd); +#else fdatasync(pLldbHandler->kissDb.fd); +#endif } Kdb_unlock(&pLldbHandler->kissDb.shared->rwlock); } @@ -1300,7 +1316,11 @@ static sint_t SetDataInKissLocalDB(sint_t dbHandler, pconststr_t key, pconststr_ DLT_STRING(__FUNCTION__); DLT_STRING(":"); DLT_STRING("KISSDB_put: key=<"); DLT_STRING(metaKey); DLT_STRING(">, "); DLT_STRING("WriteThrough to file failed with retval=<"); DLT_INT(bytesWritten); DLT_STRING(">")); } +#if USE_FSYNC + fsync(pLldbHandler->kissDb.fd); +#else fdatasync(pLldbHandler->kissDb.fd); +#endif } } Kdb_unlock(&pLldbHandler->kissDb.shared->rwlock); @@ -1387,7 +1407,11 @@ static sint_t SetDataInKissRCT(sint_t dbHandler, pconststr_t key, PersistenceCon DLT_STRING(__FUNCTION__); DLT_STRING(":"); DLT_STRING("KISSDB_put: RCT key=<"); DLT_STRING(metaKey); DLT_STRING(">, "); DLT_STRING("WriteThrough to file failed with retval=<"); DLT_INT(bytesWritten); DLT_STRING(">")); } +#if USE_FSYNC + fsync(pLldbHandler->kissDb.fd); +#else fdatasync(pLldbHandler->kissDb.fd); +#endif } } Kdb_unlock(&pLldbHandler->kissDb.shared->rwlock); -- cgit v1.2.1