[
https://issues.apache.org/jira/browse/ZOOKEEPER-1366?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13189573#comment-13189573
]
Ted Dunning commented on ZOOKEEPER-1366:
----------------------------------------
For the test, I have created a branch in my github fork of zookeeper called
timer-test and one called ZK-1366. Both have the test case below but only
ZK-1366 has the fix.
The test procedure is to do this in one window:
{code}
git checkout timer-test
ant clean compile-test
echo build/test/lib/*.jar build/lib/*.jar build/classes build/test/classes |
sed -e 's/ /:/g' > cp
java -cp $(cat cp) org.apache.zookeeper.common.TimeTest | tee log-without-patch
{code}
After the test program starts, in a second window, do these commands separated
by a second or three
{code}
date -s '+1hour'
date -s '-1hour'
{code}
This will produce output that looks like this
{code}
ubuntu@ip-10-113-27-85:~/zookeeper$ java -cp $(cat cp)
org.apache.zookeeper.common.TimeTest | tee log-without-patch
1
log4j:WARN No appenders could be found for logger
(org.apache.zookeeper.PortAssignment).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more
info.
after construct
server start
client
1 true
1 true
0 true
1 true
3600000 event = WatchedEvent state:Disconnected type:None path:null
3600001 event = WatchedEvent state:Disconnected type:None path:null
3600001 event = WatchedEvent state:Disconnected type:None path:null
3600001 event = WatchedEvent state:Disconnected type:None path:null
3600001 event = WatchedEvent state:Disconnected type:None path:null
3600001 event = WatchedEvent state:Disconnected type:None path:null
3600001 event = WatchedEvent state:Disconnected type:None path:null
3600001 event = WatchedEvent state:Expired type:None path:null
3600001 event = WatchedEvent state:Expired type:None path:null
3600001 event = WatchedEvent state:Expired type:None path:null
3600001 event = WatchedEvent state:Expired type:None path:null
3600001 event = WatchedEvent state:Expired type:None path:null
{code}
The number is the time discrepancy between the system clock and the elapsed
time from start of the program.
With the patch,
{code}
git checkout ZK-1366
ant clean compile-test
echo build/test/lib/*.jar build/lib/*.jar build/classes build/test/classes |
sed -e 's/ /:/g' > cp
java -cp $(cat cp) org.apache.zookeeper.common.TimeTest | tee log-with-patch
{code}
The output looks like this:
{code}
ubuntu@ip-10-113-27-85:~/zookeeper$ less log-with-patch
1
after construct
server start
client
0 true
0 true
1 true
0 true
1 true
0 true
0 true
3600000 true
3600000 true
3600000 true
3600000 true
0 true
0 true
0 true
0 true
-3600000 true
-3600001 true
-3600000 true
-1 true
-1 true
-1 true
-1 true
{code}
As you can see, the timing discrepancy goes up and down but the ephemerals
never disappear.
I will update the patch shortly to match the ZK-1366 branch on my github clone.
> Zookeeper should be tolerant of clock adjustments
> -------------------------------------------------
>
> Key: ZOOKEEPER-1366
> URL: https://issues.apache.org/jira/browse/ZOOKEEPER-1366
> Project: ZooKeeper
> Issue Type: Bug
> Reporter: Ted Dunning
> Fix For: 3.4.3
>
> Attachments: ZOOKEEPER-1366.patch, ZOOKEEPER-1366.patch
>
>
> If you want to wreak havoc on a ZK based system just do [date -s "+1hour"]
> and watch the mayhem as all sessions expire at once.
> This shouldn't happen. Zookeeper could easily know handle elapsed times as
> elapsed times rather than as differences between absolute times. The
> absolute times are subject to adjustment when the clock is set while a timer
> is not subject to this problem. In Java, System.currentTimeMillis() gives
> you absolute time while System.nanoTime() gives you time based on a timer
> from an arbitrary epoch.
> I have done this and have been running tests now for some tens of minutes
> with no failures. I will set up a test machine to redo the build again on
> Ubuntu and post a patch here for discussion.
--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators:
https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira