Defect -- When System Time Change

Defect -- When System Time Change

In product environment, system time may change, and we have to handle this kind of time change and do appropriate action.

And in some JDK, problem may happen when system time is set ahead or back, such as in Thread.sleep, or Object.wait(long timeout), it may hang if time is set back, or it may end ahead of time.

This should be JDK bug, if you encounter this case, you may have to ask support from your JDK vendor.

In development and test, we should consider and cover this case.

In the following example, we set minimum time between queries - , if a notify occurred less than THROTTLE_TIME before the last query, it won't happen at this time.

But in original code, if system time is set 24 hours back , then in the next 24 hours, there would be no query at all.

public class StatusMonitorThread extends Thread {
    private boolean running = true;
    private static final long THROTTLE_TIME = 10000;
    private long lastQueryTime = System.currentTimeMillis();
    private boolean requeryNeeded = false;
  
    private static final long TIME_DIFFERENCE_THRESHOLD = -5000;
    public StatusMonitorThread() {}
    public void run() {
        while(running)
        {
            synchronized (this) {
                try {
                    wait(THROTTLE_TIME);
                } catch (InterruptedException e) {
                    System.out.println("interrupted...shutting down");
                    break;
                }
                // we suppose to limit frequency of query every THROTTLE_TIME seconds
                // but if time is set back, for example 24 hours, then in next 24 hours,
                // System.currentTimeMillis() - lastQueryTime would be less than 0,
                // and in this 24 hours, requeryNeeded would remain false.
                requeryNeeded = System.currentTimeMillis() - lastQueryTime > THROTTLE_TIME;
              
                // the fix is simple, if System.currentTimeMillis() - lastQueryTime is less than 0,
                // then system time must be set back, and if it the time difference is greater than one threshold,
                // we can set requeryNeeded to true.
                //change code above like this:
              
                // long timeDiff = System.currentTimeMillis() - lastQueryTime;
                // if(timeDiff > THROTTLE_TIME || timeDiff < TIME_DIFFERENCE_THRESHOLD)
                // {
                //    requeryNeeded = true;
                // }
              
                if(requeryNeeded){
                    // do whatever you want
                }
            }
        }
    }
}
Post a Comment

Labels

Java (159) Lucene-Solr (112) Interview (61) All (58) J2SE (53) Algorithm (45) Soft Skills (38) Eclipse (33) Code Example (31) Linux (25) JavaScript (23) Spring (22) Windows (22) Web Development (20) Tools (19) Nutch2 (18) Bugs (17) Debug (16) Defects (14) Text Mining (14) J2EE (13) Network (13) Troubleshooting (13) PowerShell (11) Chrome (9) Design (9) How to (9) Learning code (9) Performance (9) Problem Solving (9) UIMA (9) html (9) Http Client (8) Maven (8) Security (8) bat (8) blogger (8) Big Data (7) Continuous Integration (7) Google (7) Guava (7) JSON (7) Shell (7) ANT (6) Coding Skills (6) Database (6) Lesson Learned (6) Programmer Skills (6) Scala (6) Tips (6) css (6) Algorithm Series (5) Cache (5) Dynamic Languages (5) IDE (5) System Design (5) adsense (5) xml (5) AIX (4) Code Quality (4) GAE (4) Git (4) Good Programming Practices (4) Jackson (4) Memory Usage (4) Miscs (4) OpenNLP (4) Project Managment (4) Spark (4) Testing (4) ads (4) regular-expression (4) Android (3) Apache Spark (3) Become a Better You (3) Concurrency (3) Eclipse RCP (3) English (3) Happy Hacking (3) IBM (3) J2SE Knowledge Series (3) JAX-RS (3) Jetty (3) Restful Web Service (3) Script (3) regex (3) seo (3) .Net (2) Android Studio (2) Apache (2) Apache Procrun (2) Architecture (2) Batch (2) Bit Operation (2) Build (2) Building Scalable Web Sites (2) C# (2) C/C++ (2) CSV (2) Career (2) Cassandra (2) Distributed (2) Fiddler (2) Firefox (2) Google Drive (2) Gson (2) How to Interview (2) Html Parser (2) Http (2) Image Tools (2) JQuery (2) Jersey (2) LDAP (2) Life (2) Logging (2) Python (2) Software Issues (2) Storage (2) Text Search (2) xml parser (2) AOP (1) Application Design (1) AspectJ (1) Chrome DevTools (1) Cloud (1) Codility (1) Data Mining (1) Data Structure (1) ExceptionUtils (1) Exif (1) Feature Request (1) FindBugs (1) Greasemonkey (1) HTML5 (1) Httpd (1) I18N (1) IBM Java Thread Dump Analyzer (1) JDK Source Code (1) JDK8 (1) JMX (1) Lazy Developer (1) Mac (1) Machine Learning (1) Mobile (1) My Plan for 2010 (1) Netbeans (1) Notes (1) Operating System (1) Perl (1) Problems (1) Product Architecture (1) Programming Life (1) Quality (1) Redhat (1) Redis (1) Review (1) RxJava (1) Solutions logs (1) Team Management (1) Thread Dump Analyzer (1) Visualization (1) boilerpipe (1) htm (1) ongoing (1) procrun (1) rss (1)

Popular Posts