[jboss-jira] [JBoss JIRA] (JGRP-1877) System.nanoTime() can be negative
Bela Ban (JIRA)
issues at jboss.org
Tue Sep 9 10:46:04 EDT 2014
[ https://issues.jboss.org/browse/JGRP-1877?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12998467#comment-12998467 ]
Bela Ban edited comment on JGRP-1877 at 9/9/14 10:45 AM:
---------------------------------------------------------
Thanks David, one of our JGroups users has actually run into problems with {{System.currentTimeMillis()}} when the system time was adjusted via NTP.
I misread the javadoc: {{nanoTime()}} doesn't return negative values, but the origin might be in the future, so I'll use your suggestion.
h5. Correction
{{System.nanoTime()}} can indeed wrap around and become negative when reaching {{Long.MAX_VALUE}}.
was (Author: belaban):
Thanks David, one of our JGroups users has actually run into problems with {{System.currentTimeMillis()}} when the system time was adjusted via NTP.
I misread the javadoc: {{nanoTime()}} doesn't return negative values, but the origin might be in the future, so I'll use your suggestion.
> System.nanoTime() can be negative
> ---------------------------------
>
> Key: JGRP-1877
> URL: https://issues.jboss.org/browse/JGRP-1877
> Project: JGroups
> Issue Type: Bug
> Reporter: Bela Ban
> Assignee: Bela Ban
> Priority: Critical
> Fix For: 3.5.1, 3.6
>
>
> According to the javadoc, {{System.nanoTime()}} should only be used to measure _elapsed time_, but not compute a _target time in the future_, as {{nanoTime()}} might return a a time in the future.
> Code like the one below might fail:
> {code:title=Responses.waitFor()|borderStyle=solid}
> public boolean waitFor(long timeout) {
> long wait_time;
> final long target_time=System.nanoTime() + TimeUnit.NANOSECONDS.convert(timeout, TimeUnit.MILLISECONDS); // ns
> lock.lock();
> try {
> while(!done && (wait_time=target_time - System.nanoTime()) > 0) {
> try {
> cond.await(wait_time,TimeUnit.NANOSECONDS);
> }
> catch(InterruptedException e) {
> }
> }
> return done;
> }
> finally {
> lock.unlock();
> }
> }
> {code}
> When computing {{target_time}}, {{System.nanoTime()}} could return a negative value (numeric overflow) or a value in the future. In the first case, {{target_time}} could be negative, so the method would not block at all. In the latter case, {{target_time}} could be huge, so the method would block for a long time.
> Investigate all occurrences where we use {{nanoTime()}} to compute a time in the future, and see what impact a future value value could have. Possibly replace with {{System.currentTimeMillis()}} or the _time service_.
--
This message was sent by Atlassian JIRA
(v6.3.1#6329)
More information about the jboss-jira
mailing list