summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIngo Huerner <ingo_huerner@mentor.com>2017-03-30 10:47:27 +0200
committerIngo Huerner <ingo_huerner@mentor.com>2017-03-30 10:47:27 +0200
commit3b28999fa9a1f7f8cd9b55ba6f8165e2447038fc (patch)
treea2323194b15537a6628a81b94f120dbeec9afba2
parent445fc7836f886964a48947b1302db4dc4e7172d3 (diff)
downloadpersistence-common-object-3b28999fa9a1f7f8cd9b55ba6f8165e2447038fc.tar.gz
Added configure switch --enable-fsync to use fsync instead fdatasync.
Added library constructor/destructor to call DLT_REGISTER_CONTEXT/DLT_UNREGISTER_CONTEXT
-rw-r--r--configure.ac20
-rw-r--r--src/key-value-store/database/kissdb.c8
-rw-r--r--src/key-value-store/pers_low_level_db_access.c56
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);