Repository: incubator-trafodion
Updated Branches:
  refs/heads/master d0951c3d8 -> 96ce1f35e


Fix for JIRA [TRAFODION-1713]
IDs returned from IDTMSRV process should be periodically re-calibrated
so that they are a better approximation of a logical time


Project: http://git-wip-us.apache.org/repos/asf/incubator-trafodion/repo
Commit: 
http://git-wip-us.apache.org/repos/asf/incubator-trafodion/commit/bc46f3df
Tree: http://git-wip-us.apache.org/repos/asf/incubator-trafodion/tree/bc46f3df
Diff: http://git-wip-us.apache.org/repos/asf/incubator-trafodion/diff/bc46f3df

Branch: refs/heads/master
Commit: bc46f3df818651a6dae180689bb298551399be0d
Parents: a8743f2
Author: Sean Broeder <sbroeder@edev03.esgyn.local>
Authored: Tue Feb 2 21:13:18 2016 +0000
Committer: Sean Broeder <sbroeder@edev03.esgyn.local>
Committed: Tue Feb 2 21:13:18 2016 +0000

----------------------------------------------------------------------
 core/sqf/sql/scripts/genms  |  1 +
 core/sqf/src/tm/idtmsrv.cpp | 48 +++++++++++++++++++++++++++++++++++++++-
 2 files changed, 48 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/bc46f3df/core/sqf/sql/scripts/genms
----------------------------------------------------------------------
diff --git a/core/sqf/sql/scripts/genms b/core/sqf/sql/scripts/genms
index 13839db..8357a88 100755
--- a/core/sqf/sql/scripts/genms
+++ b/core/sqf/sql/scripts/genms
@@ -33,6 +33,7 @@ echo "#TM_TLOG_MAX_VERSIONS less than 3 will be ignored"
 echo "TM_TLOG_MAX_VERSIONS=5"
 echo "TM_ENABLE_DDL_TRANS=0"
 echo "TM_USE_SSCC=0"
+echo "TM_IDTMSRV_REFRESH_DELAY_SECONDS=3"
 
 echo "TSE_CONVERT_NOUNDO_TRANS=1"
 

http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/bc46f3df/core/sqf/src/tm/idtmsrv.cpp
----------------------------------------------------------------------
diff --git a/core/sqf/src/tm/idtmsrv.cpp b/core/sqf/src/tm/idtmsrv.cpp
index a53ab90..f6fdef4 100644
--- a/core/sqf/src/tm/idtmsrv.cpp
+++ b/core/sqf/src/tm/idtmsrv.cpp
@@ -37,9 +37,12 @@
 #include "seabed/ms.h"
 #include "seabed/pctl.h"
 #include "seabed/pevents.h"
-
+#include "seabed/timer.h"
+#include "seabed/thread.h"
 #include "idtmsrv.h"
 
+short          gv_tleid;
+short          gv_time_refresh_delay; // time in tics (10ms)
 char           ga_name[BUFSIZ];
 char          *gp_shm;
 unsigned long *gp_shml;
@@ -53,6 +56,37 @@ void do_reply(BMS_SRE *pp_sre, char *pp_reply, int pv_len, 
short pv_ec);
 
 
 //
+// Reset the global time counter
+//
+void reset_time_counter() {
+
+    struct timespec lv_new_ts;
+
+    clock_gettime(CLOCK_REALTIME, &lv_new_ts);
+    unsigned long lv_new_tsl = ((unsigned long) lv_new_ts.tv_sec << 20) |
+                               ((unsigned long) lv_new_ts.tv_nsec / 1000);
+
+    unsigned long lv_existing_tsl = __sync_add_and_fetch_8(gp_shm, 0);
+    __sync_add_and_fetch_8(gp_shm, lv_new_tsl - lv_existing_tsl);
+
+    if (gv_verbose)
+       printf("srv: reset_time_counter, adjustment=0x%lx, shm=0x%lx\n", 
lv_new_tsl - lv_existing_tsl, *gp_shml);
+}
+
+//
+// Timer callback
+//
+void timer_callback(int tleid, int toval, short parm1, long parm2) {
+    int   ferr;
+
+    if (gv_verbose)
+        printf("timer_callback \n");
+    reset_time_counter();
+    ferr = timer_start_cb(gv_time_refresh_delay, 0, 0, &gv_tleid, 
&timer_callback);
+    assert(ferr == XZFIL_ERR_OK);
+}
+
+//
 // initialize
 //
 void do_init(int pv_argc, char **ppp_argv) {
@@ -60,6 +94,7 @@ void do_init(int pv_argc, char **ppp_argv) {
     int   lv_arg;
     bool  lv_attach;
     int   lv_ferr;
+    char *lv_delay_s;
 
     lv_attach = false;
     for (lv_arg = 1; lv_arg < pv_argc; lv_arg++) {
@@ -77,6 +112,15 @@ void do_init(int pv_argc, char **ppp_argv) {
         lv_ferr = msg_init(&pv_argc, &ppp_argv);
     assert(lv_ferr == XZFIL_ERR_OK);
 
+    gv_time_refresh_delay = 200;  // 2 seconds
+    lv_delay_s = getenv("TM_IDTMSRV_REFRESH_DELAY_SECONDS");
+    if (lv_delay_s != NULL) {
+       gv_time_refresh_delay = 100 * (atoi(lv_delay_s));      
+    }
+    if (gv_verbose){
+        printf("TM_IDTMSRV_REFRESH_DELAY_SECONDS is %s.  Setting 
gv_time_refresh_delay to %d \n", lv_delay_s, gv_time_refresh_delay);
+    }   
+
     if (gv_shook)
         msg_debug_hook("s", "s");
 }
@@ -296,6 +340,8 @@ int main(int pv_argc, char *pa_argv[]) {
     assert(lv_ferr == XZFIL_ERR_OK);
 
     do_shm();
+    lv_ferr = timer_start_cb(gv_time_refresh_delay, 0, 0, &gv_tleid, 
&timer_callback);
+    assert(lv_ferr == XZFIL_ERR_OK);
 
     lv_done = false;
     while (!lv_done) {

Reply via email to