Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-8015833

Deadlock in handling of zone info file

XMLWordPrintable

    • Icon: Bug Bug
    • Resolution: Not an Issue
    • Icon: P3 P3
    • None
    • 7u10
    • core-libs
    • None

      FULL PRODUCT VERSION :
      java version " 1.7.0_10 "
      Java(TM) SE Runtime Environment (build 1.7.0_10-b18)
      Java HotSpot(TM) Server VM (build 23.6-b04, mixed mode)


      ADDITIONAL OS VERSION INFORMATION :
      Linux ubuntu 2.6.32-21-generic #32-Ubuntu SMP Fri Apr 16 08:10:02 UTC 2010 i686 GNU/Linux


      EXTRA RELEVANT SYSTEM CONFIGURATION :
      just a plain pc-desk-top, running ubuntu.

      A DESCRIPTION OF THE PROBLEM :
      Use the program TimeZonePrintStreamDeadlock.java to firstly compile it using " /usr/local/share/jdk1.7.0_10/bin/javac TimeZonePrintStreamDeadlock.java " , and

      then execute the generated classfiles uding jdb: the command line to be used is rather elaborate: " /usr/local/share/jdk1.7.0_10/bin/jdb -Xshare:off -Xint -Dsun.rmi.server.exceptionTrace=true -Dsun.rmi.log.useOld=true -Duser.timezone=GMT_TimbuckThree -Djava.rmi.server.logCalls=false -Djaxp.debug=true TimeZonePrintStreamDeadlock "

      Moreover, In-order for this deadlock to become reachable as demonstrated below, one more action is necessary: Clobber the contents of the file: /usr/local/share/jdk1.7.0_10/jre/lib/zi/ZoneInfoMappings
      BEFORE: od -c /usr/local/share/jdk1.7.0_10/jre/lib/zi/ZoneInfoMappings | head -n2 (would fetch)
      0000000 j a v a z m \0 001 D \0 \f t z d a t
      0000020 a 2 0 1 2 i \0 @ # 251 002 h
         E t c
      AFTER CLOBBERING: od -c /usr/local/share/jdk1.7.0_10/jre/lib/zi/ZoneInfoMappings | head -n2 (fetches)
      0000000 r a v a z m \0 001 D \0 \f t z d a t
      0000020 a 2 0 1 2 i \0 @ # 251 002 h
         E t c



      STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
      ceems@ubuntu:~/phd-new/thesis/last-minus/deadlocks$ /usr/local/share/jdk1.7.0_10/bin/javac TimeZonePrintStreamDeadlock.java
      TimeZonePrintStreamDeadlock.java:36: warning: UnicastServerRef is internal proprietary API and may be removed in a future release
            try { (new sun.rmi.server.UnicastServerRef (77)).dispatch (null, null); }
                                      ^
      TimeZonePrintStreamDeadlock.java:43: warning: PackerImpl is internal proprietary API and may be removed in a future release
            try { (new com.sun.java.util.jar.pack.PackerImpl()).pack ((java.util.jar.JarFile) null, null); }
                                                 ^
      2 warnings
      ceems@ubuntu:~/phd-new/thesis/last-minus/deadlocks$ /usr/local/share/jdk1.7.0_10/bin/jdb -Xshare:off -Xint -Dsun.rmi.server.exceptionTrace=true -Dsun.rmi.log.useOld=true -Duser.timezone=GMT_TimbuckThree -Djava.rmi.server.logCalls=false -Djaxp.debug=true TimeZonePrintStreamDeadlock
      Initializing jdb ...
      > stop in sun.util.calendar.ZoneInfoFile.getZoneInfoMappings ()
      Deferring breakpoint sun.util.calendar.ZoneInfoFile.getZoneInfoMappings().
      It will be set after the class is loaded.
      > stop in java.io.PrintStream.println (java.lang.String)
      Deferring breakpoint java.io.PrintStream.println(java.lang.String).
      It will be set after the class is loaded.
      > run
      run TimeZonePrintStreamDeadlock
      Set uncaught java.lang.Throwable
      Set deferred breakpoint java.io.PrintStream.println(java.lang.String)
      Set deferred uncaught java.lang.Throwable
      >
      VM Started: Set deferred breakpoint sun.util.calendar.ZoneInfoFile.getZoneInfoMappings()

      Breakpoint hit: " thread=Thread-1 " , sun.util.calendar.ZoneInfoFile.getZoneInfoMappings(), line=1,006 bci=0

      Thread-1[1] threads
      Group system:
        (java.lang.ref.Reference$ReferenceHandler)0x150 Reference Handler cond. waiting
        (java.lang.ref.Finalizer$FinalizerThread)0x14f Finalizer cond. waiting
        (java.lang.Thread)0x14e Signal Dispatcher running
      Group main:
        (TimeZonePrintStreamDeadlock$1)0x176 Thread-0 running
        (TimeZonePrintStreamDeadlock$2)0x177 Thread-1 running (at breakpoint)
        (java.lang.Thread)0x178 DestroyJavaVM running
      Thread-1[1] threadlocks
      Monitor information for thread Thread-1:
        Owned monitor: instance of java.lang.Class(reflected class=sun.util.calendar.ZoneInfo, id=467)
        Owned monitor: instance of java.lang.Class(reflected class=java.util.TimeZone, id=466)
        Not waiting for a monitor
      Thread-1[1] cont
      >
      Breakpoint hit: " thread=Thread-1 " , java.io.PrintStream.println(), line=805 bci=0

      Thread-1[1] threads
      Group system:
        (java.lang.ref.Reference$ReferenceHandler)0x150 Reference Handler cond. waiting
        (java.lang.ref.Finalizer$FinalizerThread)0x14f Finalizer cond. waiting
        (java.lang.Thread)0x14e Signal Dispatcher running
      Group main:
        (TimeZonePrintStreamDeadlock$1)0x176 Thread-0 running
        (TimeZonePrintStreamDeadlock$2)0x177 Thread-1 running (at breakpoint)
        (java.lang.Thread)0x178 DestroyJavaVM running
      Thread-1[1] suspend 0x177
      Thread-1[1] thread 0x176
      Thread-0[1] stop in java.util.Date.normalize ()
      Deferring breakpoint java.util.Date.normalize().
      It will be set after the class is loaded.
      Thread-0[1] cont
      >
      Set deferred breakpoint java.util.Date.normalize()

      Breakpoint hit: " thread=Thread-0 " , java.util.Date.normalize(), line=1,191 bci=0

      Thread-0[1] resume 0x177
      Thread-0[1] cont
      > ^\2013-02-05 06:00:55
      Full thread dump Java HotSpot(TM) Server VM (23.6-b04 mixed mode):
      [ ... ]
      Found one Java-level deadlock:
      =============================
       " Thread-1 " :
        waiting to lock monitor 0x7eb02b54 (object 0xa4a1f620, a java.io.PrintStream),
        which is held by " Thread-0 "
       " Thread-0 " :
        waiting to lock monitor 0x7eb03770 (object 0xa4b4be70, a java.lang.Class),
        which is held by " Thread-1 "

      Java stack information for the threads listed above:
      ===================================================
       " Thread-1 " :
      at java.io.PrintStream.println(PrintStream.java:806)
      - waiting to lock <0xa4a1f620> (a java.io.PrintStream)
      at sun.util.calendar.ZoneInfoFile.getZoneInfoMappings(ZoneInfoFile.java:1023)
      at sun.util.calendar.ZoneInfoFile.getZoneAliases(ZoneInfoFile.java:798)
      at sun.util.calendar.ZoneInfo.getAliasTable(ZoneInfo.java:838)
      - locked <0xa4b4bfa0> (a java.lang.Class for sun.util.calendar.ZoneInfo)
      at sun.util.calendar.ZoneInfo.getTimeZone(ZoneInfo.java:667)
      at java.util.TimeZone.getTimeZone(TimeZone.java:571)
      at java.util.TimeZone.setDefaultZone(TimeZone.java:668)
      - locked <0xa4b4be70> (a java.lang.Class for java.util.TimeZone)
      at java.util.TimeZone.getDefaultRef(TimeZone.java:635)
      at java.util.TimeZone.getDefault(TimeZone.java:622)
      at com.sun.java.util.jar.pack.PackerImpl.pack(PackerImpl.java:89)
      at TimeZonePrintStreamDeadlock$2.run(TimeZonePrintStreamDeadlock.java:43)
       " Thread-0 " :
      at java.util.TimeZone.getDefaultInAppContext(TimeZone.java:734)
      - waiting to lock <0xa4b4be70> (a java.lang.Class for java.util.TimeZone)
      at java.util.TimeZone.getDefaultRef(TimeZone.java:630)
      at java.util.Date.normalize(Date.java:1193)
      at java.util.Date.toString(Date.java:1027)
      at java.lang.String.valueOf(String.java:2854)
      at java.lang.StringBuilder.append(StringBuilder.java:128)
      at sun.rmi.server.UnicastServerRef.logCallException(UnicastServerRef.java:484)
      - locked <0xa4a1f620> (a java.io.PrintStream)
      at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:346)
      at TimeZonePrintStreamDeadlock$1.run(TimeZonePrintStreamDeadlock.java:36)

      Found 1 deadlock.

      EXPECTED VERSUS ACTUAL BEHAVIOR :
      EXPECTED -
      The program need-not deadlock (In the sence that there seems no good reason why the program should deadlock at all), ...
      ACTUAL -
      ..., whereas unfortunately it does !!

      And thankfully, quite close to 'as-predicted' by our analysis!!

      ERROR MESSAGES/STACK TRACES THAT OCCUR :
      Found one Java-level deadlock:
      =============================
       " Thread-1 " :
        waiting to lock monitor 0x7eb02b54 (object 0xa4a1f620, a java.io.PrintStream),
        which is held by " Thread-0 "
       " Thread-0 " :
        waiting to lock monitor 0x7eb03770 (object 0xa4b4be70, a java.lang.Class),
        which is held by " Thread-1 "

      Java stack information for the threads listed above:
      ===================================================
       " Thread-1 " :
      at java.io.PrintStream.println(PrintStream.java:806)
      - waiting to lock <0xa4a1f620> (a java.io.PrintStream)
      at sun.util.calendar.ZoneInfoFile.getZoneInfoMappings(ZoneInfoFile.java:1023)
      at sun.util.calendar.ZoneInfoFile.getZoneAliases(ZoneInfoFile.java:798)
      at sun.util.calendar.ZoneInfo.getAliasTable(ZoneInfo.java:838)
      - locked <0xa4b4bfa0> (a java.lang.Class for sun.util.calendar.ZoneInfo)
      at sun.util.calendar.ZoneInfo.getTimeZone(ZoneInfo.java:667)
      at java.util.TimeZone.getTimeZone(TimeZone.java:571)
      at java.util.TimeZone.setDefaultZone(TimeZone.java:668)
      - locked <0xa4b4be70> (a java.lang.Class for java.util.TimeZone)
      at java.util.TimeZone.getDefaultRef(TimeZone.java:635)
      at java.util.TimeZone.getDefault(TimeZone.java:622)
      at com.sun.java.util.jar.pack.PackerImpl.pack(PackerImpl.java:89)
      at TimeZonePrintStreamDeadlock$2.run(TimeZonePrintStreamDeadlock.java:43)
       " Thread-0 " :
      at java.util.TimeZone.getDefaultInAppContext(TimeZone.java:734)
      - waiting to lock <0xa4b4be70> (a java.lang.Class for java.util.TimeZone)
      at java.util.TimeZone.getDefaultRef(TimeZone.java:630)
      at java.util.Date.normalize(Date.java:1193)
      at java.util.Date.toString(Date.java:1027)
      at java.lang.String.valueOf(String.java:2854)
      at java.lang.StringBuilder.append(StringBuilder.java:128)
      at sun.rmi.server.UnicastServerRef.logCallException(UnicastServerRef.java:484)
      - locked <0xa4a1f620> (a java.io.PrintStream)
      at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:346)
      at TimeZonePrintStreamDeadlock$1.run(TimeZonePrintStreamDeadlock.java:36)

      Found 1 deadlock.


      REPRODUCIBILITY :
      This bug can be reproduced always.

      ---------- BEGIN SOURCE ----------
      ceems@ubuntu:~/phd-new/thesis/last-minus/deadlocks$ cat TimeZonePrintStreamDeadlock.java
      /* Deadlock as predicted by our analysis
       * <Cycle-2 locks= " java.util.TimeZone.class java.io.PrintStream " >
       * <Thread-1>
       * com.sun.java.util.jar.pack.PackerImpl.pack:(Ljava/util/jar/JarFile;Ljava/io/OutputStream;)V
       * <java.util.TimeZone.class>java.util.TimeZone.getTimeZone:(Ljava/lang/String;)Ljava/util/TimeZone;
       * java.util.TimeZone.getTimeZone:(Ljava/lang/String;Z)Ljava/util/TimeZone;
       * java.util.TimeZone.parseCustomTimeZone:(Ljava/lang/String;)Ljava/util/TimeZone;
       * sun.util.calendar.ZoneInfoFile.getZoneInfo:(Ljava/lang/String;)Lsun/util/calendar/ZoneInfo;
       * sun.util.calendar.ZoneInfoFile.createZoneInfo:(Ljava/lang/String;)Lsun/util/calendar/ZoneInfo;
       * sun.util.calendar.ZoneInfoFile.readZoneInfoFile:(Ljava/lang/String;)[B
       * java.io.PrintStream.println:(Ljava/lang/String;)V
       * java.io.PrintStream
       * <java.io.PrintStream>java.io.PrintStream.println:(Ljava/lang/String;)V#Ljava/io/PrintStream;#0
       * =VarientOf=java.io.PrintStream.println:(Ljava/lang/String;)V
       * </Thread-1>
       * <Thread-2>
       * sun.rmi.server.UnicastServerRef.oldDispatch:(Ljava/rmi/Remote;Ljava/rmi/server/RemoteCall;I)V
       * sun.rmi.server.UnicastServerRef.logCallException:(Ljava/lang/Throwable;)V
       * <java.io.PrintStream>sun.rmi.server.UnicastServerRef.logCallException:(Ljava/lang/Throwable;)V#Ljava/io/PrintStream;#0
       * =VarientOf=sun.rmi.server.UnicastServerRef.logCallException:(Ljava/lang/Throwable;)V
       * java.lang.StringBuilder.append:(Ljava/util/Date;)Ljava/lang/StringBuilder;
       * =THROandVarientOf=java.lang.StringBuilder.append:(Ljava/lang/Object;)Ljava/lang/StringBuilder;
       * java.lang.String.valueOf:(Ljava/util/Date;)Ljava/lang/String;=THROandVarientOf=java.lang.String.valueOf:(Ljava/lang/Object;)Ljava/lang/String;
       * java.util.Date.toString:()Ljava/lang/String;
       * java.util.Date.normalize:()Lsun/util/calendar/BaseCalendar$Date;
       * java.util.Date.normalize:(Lsun/util/calendar/BaseCalendar$Date;)Lsun/util/calendar/BaseCalendar$Date;
       * java.util.TimeZone.class
       * <java.util.TimeZone.class>java.util.TimeZone.getTimeZone:(Ljava/lang/String;)Ljava/util/TimeZone;
       * </Thread-2>
       */

      public class TimeZonePrintStreamDeadlock {
       public static void main(String[] args) {
        new Thread() {
         public void run() {
            try { (new sun.rmi.server.UnicastServerRef (77)).dispatch (null, null); }
            catch (java.io.IOException e)
                { System.out.println ( " Exception thrown: " + e); };
         };
        }.start();
        new Thread() {
         public void run() {
            try { (new com.sun.java.util.jar.pack.PackerImpl()).pack ((java.util.jar.JarFile) null, null); }
            catch (java.io.IOException e)
                { System.out.println ( " Exception thrown: " + e); };
         };
        }.start();
       }
      }
      ceems@ubuntu:~/phd-new/thesis/last-minus/deadlocks$
      ---------- END SOURCE ----------

            okutsu Masayoshi Okutsu
            webbuggrp Webbug Group
            Votes:
            1 Vote for this issue
            Watchers:
            2 Start watching this issue

              Created:
              Updated:
              Resolved: