Scheduler: BUGFIX: Restart itimer after clock-skew detection
g0dil [Tue, 28 Aug 2007 07:23:52 +0000 (07:23 +0000)]
git-svn-id: https://svn.berlios.de/svnroot/repos/senf/trunk@411 270642c3-0616-0410-b53a-bc976706d245

Scheduler/ClockService.cc
Scheduler/ClockService.hh
Scheduler/ClockService.test.cc

index a614462..f31ec4f 100644 (file)
@@ -125,14 +125,19 @@ prefix_ void senf::ClockService::restart_m(bool restart)
     action.sa_flags = SA_RESTART;
     CheckError( sigaction, (SIGALRM, &action, restart ? 0 : &impl_->oldaction) );
 
+    restartTimer(restart);
+    
+    impl_->unblock();
+}
+
+prefix_ void senf::ClockService::restartTimer(bool restart)
+{
     struct itimerval itimer;
     itimer.it_interval.tv_sec = CheckInterval;
     itimer.it_interval.tv_usec = 0;
     itimer.it_value.tv_sec = CheckInterval;
     itimer.it_value.tv_usec = 0;
     CheckError( setitimer, (ITIMER_REAL, &itimer, restart ? 0 : &impl_->olditimer) );
-    
-    impl_->unblock();
 }
 
 prefix_ void senf::ClockService::updateSkew(boost::posix_time::ptime time)
@@ -149,6 +154,8 @@ prefix_ void senf::ClockService::updateSkew(boost::posix_time::ptime time)
                          + boost::posix_time::seconds(CheckInterval) 
                          - boost::posix_time::seconds(itimer.it_value.tv_sec)
                          - boost::posix_time::microseconds(itimer.it_value.tv_usec)));
+        heartbeat_ = time;
+        restartTimer();
     }
 }
 
index 21a15eb..b2cf6db 100644 (file)
@@ -154,6 +154,8 @@ namespace senf {
         void updateSkew(boost::posix_time::ptime time);
         void clockSkew(boost::posix_time::ptime time, boost::posix_time::ptime expected);
 
+        void restartTimer(bool restart = true);
+
         boost::posix_time::ptime base_;
         boost::posix_time::ptime heartbeat_;
 
index 88c68e9..fbbe5ab 100644 (file)
@@ -117,10 +117,13 @@ BOOST_AUTO_UNIT_TEST(clockService)
     BOOST_CHECK_PREDICATE( is_close_clock,
                            (t1 + senf::ClockService::milliseconds(200))
                            (senf::ClockService::now()) );
-    
-    // We need restart the clock-service here to fix up the bad heartbeat value. That's faster
-    // than waiting another CheckInterval seconds for SIGALRM
-    senf::ClockService::restart();
+
+    // The next check validates that the clock service itimer/heartbeat_ is correctly reset after a
+    // clock-skew is detected
+
+    BOOST_CHECK_PREDICATE( is_close_clock,
+                           (t1 + senf::ClockService::milliseconds(200))
+                           (senf::ClockService::now()) );
 }
 
 ///////////////////////////////cc.e////////////////////////////////////////