Derby
  1. Derby
  2. DERBY-4859

Missing doPrivileged in DatabaseClasses.WriteClassFile()

    Details

    • Type: Bug Bug
    • Status: Closed
    • Priority: Minor Minor
    • Resolution: Fixed
    • Affects Version/s: 10.7.1.1
    • Fix Version/s: 10.7.1.1
    • Component/s: Services
    • Labels:
      None

      Description

      One of my test runs failed with the following error:

      1) testAllUncommittedReclaim(org.apache.derbyTesting.functionTests.tests.store.AccessTest)java.sql.SQLException: Java exception: 'access denied (java.io.FilePermission /export/home/tmp/kh160127/derbyall/system/ac72985692x012bxc9d4x9594xffffa08cb27a0.class write): java.security.AccessControlException'.
      at org.apache.derby.impl.jdbc.SQLExceptionFactory40.getSQLException(Unknown Source)
      (...)
      Caused by: java.security.AccessControlException: access denied (java.io.FilePermission /export/home/tmp/kh160127/derbyall/system/ac72985692x012bxc9d4x9594xffffa08cb27a0.class write)
      at java.security.AccessControlContext.checkPermission(AccessControlContext.java:323)
      at java.security.AccessController.checkPermission(AccessController.java:546)
      at java.lang.SecurityManager.checkPermission(SecurityManager.java:532)
      at java.lang.SecurityManager.checkWrite(SecurityManager.java:962)
      at java.io.FileOutputStream.<init>(FileOutputStream.java:169)
      at java.io.FileOutputStream.<init>(FileOutputStream.java:131)
      at org.apache.derby.impl.services.reflect.DatabaseClasses.WriteClassFile(Unknown Source)
      at org.apache.derby.impl.services.reflect.DatabaseClasses.loadGeneratedClass(Unknown Source)
      (...)

      I think the underlying error is an OutOfMemoryError, because I have seen tests running out of permgen space with the same configuration lately. But that error never gets all the way out to the test framework because of the above file permission error.

      When DatabaseClasses.loadGeneratedClass() fails with a LinkageError or a VirtualMachineError (the super-class of OutOfMemoryError), it attempts to dump the generated class to disk. But since the tests run under a security manager, and the code writes the class to disk isn't wrapped in a privileged block, the dumping of extra debug info fails and hides the original error.

      1. diff.diff
        2 kB
        Knut Anders Hatlen

        Activity

        Transition Time In Source Status Execution Times Last Executer Last Execution Date
        Open Open In Progress In Progress
        56m 50s 1 Knut Anders Hatlen 20/Oct/10 19:05
        In Progress In Progress Closed Closed
        14h 49m 1 Knut Anders Hatlen 21/Oct/10 09:55
        Gavin made changes -
        Workflow jira [ 12524771 ] Default workflow, editable Closed status [ 12800488 ]
        Rick Hillegas made changes -
        Affects Version/s 10.7.1.1 [ 12315564 ]
        Affects Version/s 10.7.1.0 [ 12314971 ]
        Fix Version/s 10.7.1.1 [ 12315564 ]
        Fix Version/s 10.7.1.0 [ 12314971 ]
        Knut Anders Hatlen made changes -
        Status In Progress [ 3 ] Closed [ 6 ]
        Issue & fix info [Patch Available]
        Fix Version/s 10.7.0.0 [ 12314971 ]
        Resolution Fixed [ 1 ]
        Hide
        Knut Anders Hatlen added a comment -

        Thanks, Dag.
        Committed revision 1025888.

        Show
        Knut Anders Hatlen added a comment - Thanks, Dag. Committed revision 1025888.
        Hide
        Dag H. Wanvik added a comment -

        Seems a good incremental improvement, +1

        Show
        Dag H. Wanvik added a comment - Seems a good incremental improvement, +1
        Knut Anders Hatlen made changes -
        Issue & fix info [Patch Available]
        Hide
        Knut Anders Hatlen added a comment -

        With the patch, I got the expected OutOfMemoryError instead:

        1) testCSBug735(org.apache.derbyTesting.functionTests.tests.store.AccessTest)jav
        a.sql.SQLException: Java exception: 'PermGen space: java.lang.OutOfMemoryError'.
        at org.apache.derby.impl.jdbc.SQLExceptionFactory40.getSQLException(Unkn
        own Source)
        (...)
        Caused by: java.lang.OutOfMemoryError: PermGen space
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClassCond(ClassLoader.java:632)
        at java.lang.ClassLoader.defineClass(ClassLoader.java:616)
        at java.lang.ClassLoader.defineClass(ClassLoader.java:466)
        at org.apache.derby.impl.services.reflect.ReflectLoaderJava2.loadGeneratedClass(Unknown Source)
        at org.apache.derby.impl.services.reflect.ReflectClassesJava2.loadGeneratedClassFromData(Unknown Source)
        at org.apache.derby.impl.services.reflect.DatabaseClasses.loadGeneratedClass(Unknown Source)

        It didn't happen in the exact same test case, but it was still in DatabaseClasses.loadGeneratedClass(), so the code modified by the patch was exercised. I also see that the generated class did get written to disk this time, so it seems to work as expected now.

        Show
        Knut Anders Hatlen added a comment - With the patch, I got the expected OutOfMemoryError instead: 1) testCSBug735(org.apache.derbyTesting.functionTests.tests.store.AccessTest)jav a.sql.SQLException: Java exception: 'PermGen space: java.lang.OutOfMemoryError'. at org.apache.derby.impl.jdbc.SQLExceptionFactory40.getSQLException(Unkn own Source) (...) Caused by: java.lang.OutOfMemoryError: PermGen space at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClassCond(ClassLoader.java:632) at java.lang.ClassLoader.defineClass(ClassLoader.java:616) at java.lang.ClassLoader.defineClass(ClassLoader.java:466) at org.apache.derby.impl.services.reflect.ReflectLoaderJava2.loadGeneratedClass(Unknown Source) at org.apache.derby.impl.services.reflect.ReflectClassesJava2.loadGeneratedClassFromData(Unknown Source) at org.apache.derby.impl.services.reflect.DatabaseClasses.loadGeneratedClass(Unknown Source) It didn't happen in the exact same test case, but it was still in DatabaseClasses.loadGeneratedClass(), so the code modified by the patch was exercised. I also see that the generated class did get written to disk this time, so it seems to work as expected now.
        Knut Anders Hatlen made changes -
        Status Open [ 1 ] In Progress [ 3 ]
        Knut Anders Hatlen made changes -
        Attachment diff.diff [ 12457682 ]
        Hide
        Knut Anders Hatlen added a comment -

        I'm rerunning the tests on the same configuration with the attached patch applied to see if that'll make the tests report the original error. The patch puts a doPrivileged around the code that opens a new FileOutputStream.

        Show
        Knut Anders Hatlen added a comment - I'm rerunning the tests on the same configuration with the attached patch applied to see if that'll make the tests report the original error. The patch puts a doPrivileged around the code that opens a new FileOutputStream.
        Knut Anders Hatlen made changes -
        Field Original Value New Value
        Assignee Knut Anders Hatlen [ knutanders ]
        Knut Anders Hatlen created issue -

          People

          • Assignee:
            Knut Anders Hatlen
            Reporter:
            Knut Anders Hatlen
          • Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

            Dates

            • Created:
              Updated:
              Resolved:

              Development