Uploaded image for project: 'Oozie'
  1. Oozie
  2. OOZIE-2775

Oozie server does not stop if there is an exception during service initalization at startup

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Closed
    • Major
    • Resolution: Fixed
    • None
    • 5.0.0
    • None
    • None

    Description

      OOZIE-2666 brought in embedded jetty in Oozie. com.google.inject.guice was selected for dependency management. Unfortunately if there is an exception at starting Oozie services (e.g. JPAService initialization, called via https://github.com/apache/oozie/blob/master/server/src/main/java/org/apache/oozie/server/EmbeddedOozieServer.java#L194), Oozie won't stop if it cannot destroy Oozie services.

      In OOZIE-2666 a shutdown hook (https://github.com/apache/oozie/blob/master/server/src/main/java/org/apache/oozie/server/EmbeddedOozieServer.java#L184) was added to print out startup errors and exceptions, destroy pending oozie services, and exit eventually, but it does not work.

      Steps to reproduce a startup failure (for example simulate that Oozie cannot find required database driver):

      $ cd oozie
      $ mvn clean install assembly:single -DskipTests -DjavaVersion=1.8 -DtargetVersion=1.7  -Phadoop-2 -Dhadoop.version=2.6.0 -Puber;
      $ cd distro/target/oozie-4.4.0-SNAPSHOT-distro/oozie-4.4.0-SNAPSHOT/ 
      $ export JETTY_OPTS="-Djavax.net.debug=all -agentlib:jdwp=transport=dt_socket,server=y,address=8000,suspend=y  -Dlog4j.logger.org.eclipse.jetty=TRACE -Dlog4j.configuration=./conf/oozie-log4j.properties"
      $ bin/oozied.sh run
      $ mv embedded-oozie-server/webapp/WEB-INF/lib/derby-10.10.1.1.jar ..
      <attach to the process with a debugger and continue execution>
      

      Exception is printed to stdout

      <openjpa-2.4.1-r422266:1730418 fatal general error> org.apache.openjpa.persistence.PersistenceException: Cannot load JDBC driver class 'org.apache.derby.jdbc.EmbeddedDriver'
      	at org.apache.openjpa.jdbc.sql.DBDictionaryFactory.newDBDictionary(DBDictionaryFactory.java:106)
      	at org.apache.openjpa.jdbc.conf.JDBCConfigurationImpl.getDBDictionaryInstance(JDBCConfigurationImpl.java:603)
      	at org.apache.openjpa.jdbc.meta.MappingRepository.endConfiguration(MappingRepository.java:1520)
      	at org.apache.openjpa.lib.conf.Configurations.configureInstance(Configurations.java:533)
      	at org.apache.openjpa.lib.conf.Configurations.configureInstance(Configurations.java:458)
      	at org.apache.openjpa.lib.conf.PluginValue.instantiate(PluginValue.java:121)
      	at org.apache.openjpa.conf.MetaDataRepositoryValue.instantiate(MetaDataRepositoryValue.java:68)
      	at org.apache.openjpa.lib.conf.ObjectValue.instantiate(ObjectValue.java:83)
      	at org.apache.openjpa.conf.OpenJPAConfigurationImpl.newMetaDataRepositoryInstance(OpenJPAConfigurationImpl.java:967)
      	at org.apache.openjpa.conf.OpenJPAConfigurationImpl.getMetaDataRepositoryInstance(OpenJPAConfigurationImpl.java:958)
      	at org.apache.openjpa.kernel.AbstractBrokerFactory.makeReadOnly(AbstractBrokerFactory.java:642)
      	at org.apache.openjpa.kernel.AbstractBrokerFactory.newBroker(AbstractBrokerFactory.java:202)
      	at org.apache.openjpa.kernel.DelegatingBrokerFactory.newBroker(DelegatingBrokerFactory.java:154)
      	at org.apache.openjpa.persistence.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:226)
      	at org.apache.openjpa.persistence.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:153)
      	at org.apache.openjpa.persistence.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:59)
      	at org.apache.oozie.service.JPAService.getEntityManager(JPAService.java:514)
      	at org.apache.oozie.service.JPAService.init(JPAService.java:215)
      	at org.apache.oozie.service.Services.setServiceInternal(Services.java:387)
      	at org.apache.oozie.service.Services.setService(Services.java:373)
      	at org.apache.oozie.service.Services.loadServices(Services.java:305)
      	at org.apache.oozie.service.Services.init(Services.java:213)
      	at org.apache.oozie.server.guice.ServicesProvider.get(ServicesProvider.java:31)
      	at org.apache.oozie.server.guice.ServicesProvider.get(ServicesProvider.java:25)
      	at com.google.inject.internal.BoundProviderFactory.get(BoundProviderFactory.java:55)
      	at com.google.inject.internal.ProviderToInternalFactoryAdapter$1.call(ProviderToInternalFactoryAdapter.java:46)
      	at com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1031)
      	at com.google.inject.internal.ProviderToInternalFactoryAdapter.get(ProviderToInternalFactoryAdapter.java:40)
      	at com.google.inject.Scopes$1$1.get(Scopes.java:65)
      	at com.google.inject.internal.InternalFactoryToProviderAdapter.get(InternalFactoryToProviderAdapter.java:40)
      	at com.google.inject.internal.SingleParameterInjector.inject(SingleParameterInjector.java:38)
      	at com.google.inject.internal.SingleParameterInjector.getAll(SingleParameterInjector.java:62)
      	at com.google.inject.internal.ConstructorInjector.construct(ConstructorInjector.java:84)
      	at com.google.inject.internal.ConstructorBindingImpl$Factory.get(ConstructorBindingImpl.java:254)
      	at com.google.inject.internal.BoundProviderFactory.get(BoundProviderFactory.java:53)
      	at com.google.inject.internal.ProviderToInternalFactoryAdapter$1.call(ProviderToInternalFactoryAdapter.java:46)
      	at com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1031)
      	at com.google.inject.internal.ProviderToInternalFactoryAdapter.get(ProviderToInternalFactoryAdapter.java:40)
      	at com.google.inject.Scopes$1$1.get(Scopes.java:65)
      	at com.google.inject.internal.InternalFactoryToProviderAdapter.get(InternalFactoryToProviderAdapter.java:40)
      	at com.google.inject.internal.SingleParameterInjector.inject(SingleParameterInjector.java:38)
      	at com.google.inject.internal.SingleParameterInjector.getAll(SingleParameterInjector.java:62)
      	at com.google.inject.internal.ConstructorInjector.construct(ConstructorInjector.java:84)
      	at com.google.inject.internal.ConstructorBindingImpl$Factory.get(ConstructorBindingImpl.java:254)
      	at com.google.inject.internal.InjectorImpl$4$1.call(InjectorImpl.java:978)
      	at com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1024)
      	at com.google.inject.internal.InjectorImpl$4.get(InjectorImpl.java:974)
      	at com.google.inject.internal.InjectorImpl.getInstance(InjectorImpl.java:1013)
      	at org.apache.oozie.server.EmbeddedOozieServer.main(EmbeddedOozieServer.java:194)
      Caused by: org.apache.commons.dbcp.SQLNestedException: Cannot load JDBC driver class 'org.apache.derby.jdbc.EmbeddedDriver'
      	at org.apache.commons.dbcp.BasicDataSource.createConnectionFactory(BasicDataSource.java:1429)
      	at org.apache.commons.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:1371)
      	at org.apache.commons.dbcp.BasicDataSource.getConnection(BasicDataSource.java:1044)
      	at org.apache.openjpa.lib.jdbc.DelegatingDataSource.getConnection(DelegatingDataSource.java:110)
      	at org.apache.openjpa.lib.jdbc.DecoratingDataSource.getConnection(DecoratingDataSource.java:86)
      	at org.apache.openjpa.jdbc.sql.DBDictionaryFactory.newDBDictionary(DBDictionaryFactory.java:90)
      	... 48 more
      Caused by: java.lang.ClassNotFoundException: org.apache.derby.jdbc.EmbeddedDriver
      	at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
      	at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
      	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
      	at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
      	at org.apache.commons.dbcp.BasicDataSource.createConnectionFactory(BasicDataSource.java:1420)
      	... 53 more
      Exception in thread "main" java.lang.ExceptionInInitializerError: Could not instantiate Oozie services. [e.message=E0103: Could not load service classes, Cannot load JDBC driver class 'org.apache.derby.jdbc.EmbeddedDriver']
      	at org.apache.oozie.server.guice.ServicesProvider.get(ServicesProvider.java:36)
      	at org.apache.oozie.server.guice.ServicesProvider.get(ServicesProvider.java:25)
      	at com.google.inject.internal.BoundProviderFactory.get(BoundProviderFactory.java:55)
      	at com.google.inject.internal.ProviderToInternalFactoryAdapter$1.call(ProviderToInternalFactoryAdapter.java:46)
      	at com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1031)
      	at com.google.inject.internal.ProviderToInternalFactoryAdapter.get(ProviderToInternalFactoryAdapter.java:40)
      	at com.google.inject.Scopes$1$1.get(Scopes.java:65)
      	at com.google.inject.internal.InternalFactoryToProviderAdapter.get(InternalFactoryToProviderAdapter.java:40)
      	at com.google.inject.internal.SingleParameterInjector.inject(SingleParameterInjector.java:38)
      	at com.google.inject.internal.SingleParameterInjector.getAll(SingleParameterInjector.java:62)
      	at com.google.inject.internal.ConstructorInjector.construct(ConstructorInjector.java:84)
      	at com.google.inject.internal.ConstructorBindingImpl$Factory.get(ConstructorBindingImpl.java:254)
      	at com.google.inject.internal.BoundProviderFactory.get(BoundProviderFactory.java:53)
      	at com.google.inject.internal.ProviderToInternalFactoryAdapter$1.call(ProviderToInternalFactoryAdapter.java:46)
      	at com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1031)
      	at com.google.inject.internal.ProviderToInternalFactoryAdapter.get(ProviderToInternalFactoryAdapter.java:40)
      	at com.google.inject.Scopes$1$1.get(Scopes.java:65)
      	at com.google.inject.internal.InternalFactoryToProviderAdapter.get(InternalFactoryToProviderAdapter.java:40)
      	at com.google.inject.internal.SingleParameterInjector.inject(SingleParameterInjector.java:38)
      	at com.google.inject.internal.SingleParameterInjector.getAll(SingleParameterInjector.java:62)
      	at com.google.inject.internal.ConstructorInjector.construct(ConstructorInjector.java:84)
      	at com.google.inject.internal.ConstructorBindingImpl$Factory.get(ConstructorBindingImpl.java:254)
      	at com.google.inject.internal.InjectorImpl$4$1.call(InjectorImpl.java:978)
      	at com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1024)
      	at com.google.inject.internal.InjectorImpl$4.get(InjectorImpl.java:974)
      	at com.google.inject.internal.InjectorImpl.getInstance(InjectorImpl.java:1013)
      	at org.apache.oozie.server.EmbeddedOozieServer.main(EmbeddedOozieServer.java:194)
      

      I checked the JVM process with jstack and saw:

      "JDWP Transport Listener: dt_socket" #45 daemon prio=10 os_prio=31 tid=0x00007fb70b001000 nid=0x3d0b runnable [0x0000000000000000]
         java.lang.Thread.State: RUNNABLE
      
      "DestroyJavaVM" #44 prio=5 os_prio=31 tid=0x00007fb70ad9b000 nid=0x1003 waiting on condition [0x0000000000000000]
         java.lang.Thread.State: RUNNABLE
      
      "Attach Listener" #39 daemon prio=9 os_prio=31 tid=0x00007fb70b383000 nid=0x670f waiting on condition [0x0000000000000000]
         java.lang.Thread.State: RUNNABLE
      
      "Scheduler-0" #29 prio=5 os_prio=31 tid=0x00007fb70da9b000 nid=0x5e0f waiting on condition [0x0000700001ae4000]
         java.lang.Thread.State: TIMED_WAITING (parking)
      	at sun.misc.Unsafe.park(Native Method)
      	- parking to wait for  <0x00000006c00187f0> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
      	at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:215)
      	at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2078)
      	at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1093)
      	at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:809)
      	at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1067)
      	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1127)
      	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
      	at java.lang.Thread.run(Thread.java:745)
      
      "FileWatchdog" #15 daemon prio=5 os_prio=31 tid=0x00007fb70b2a3000 nid=0x5a03 waiting on condition [0x00007000019e1000]
         java.lang.Thread.State: TIMED_WAITING (sleeping)
      	at java.lang.Thread.sleep(Native Method)
      	at org.apache.log4j.helpers.FileWatchdog.run(FileWatchdog.java:104)
      
      "com.google.inject.internal.util.$Finalizer" #14 daemon prio=5 os_prio=31 tid=0x00007fb70abaf800 nid=0x5803 in Object.wait() [0x00007000018de000]
         java.lang.Thread.State: WAITING (on object monitor)
      	at java.lang.Object.wait(Native Method)
      	- waiting on <0x00000006c00188d8> (a java.lang.ref.ReferenceQueue$Lock)
      	at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:143)
      	- locked <0x00000006c00188d8> (a java.lang.ref.ReferenceQueue$Lock)
      	at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:164)
      	at com.google.inject.internal.util.$Finalizer.run(Finalizer.java:114)
      
      "Service Thread" #12 daemon prio=9 os_prio=31 tid=0x00007fb70e834000 nid=0x5403 runnable [0x0000000000000000]
         java.lang.Thread.State: RUNNABLE
      
      "C1 CompilerThread3" #11 daemon prio=9 os_prio=31 tid=0x00007fb70e00a800 nid=0x5203 waiting on condition [0x0000000000000000]
         java.lang.Thread.State: RUNNABLE
      
      "C2 CompilerThread2" #10 daemon prio=9 os_prio=31 tid=0x00007fb70a80f000 nid=0x5003 waiting on condition [0x0000000000000000]
         java.lang.Thread.State: RUNNABLE
      
      "C2 CompilerThread1" #9 daemon prio=9 os_prio=31 tid=0x00007fb70c002000 nid=0x4e03 waiting on condition [0x0000000000000000]
         java.lang.Thread.State: RUNNABLE
      
      "C2 CompilerThread0" #8 daemon prio=9 os_prio=31 tid=0x00007fb70d81a000 nid=0x1707 waiting on condition [0x0000000000000000]
         java.lang.Thread.State: RUNNABLE
      
      "JDWP Event Helper Thread" #6 daemon prio=10 os_prio=31 tid=0x00007fb70a80e000 nid=0x4c03 runnable [0x0000000000000000]
         java.lang.Thread.State: RUNNABLE
      
      "Signal Dispatcher" #4 daemon prio=9 os_prio=31 tid=0x00007fb70b041000 nid=0x3e0f runnable [0x0000000000000000]
         java.lang.Thread.State: RUNNABLE
      
      "Finalizer" #3 daemon prio=8 os_prio=31 tid=0x00007fb70e002000 nid=0x3803 in Object.wait() [0x0000700000d3a000]
         java.lang.Thread.State: WAITING (on object monitor)
      	at java.lang.Object.wait(Native Method)
      	- waiting on <0x00000006c00265d8> (a java.lang.ref.ReferenceQueue$Lock)
      	at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:143)
      	- locked <0x00000006c00265d8> (a java.lang.ref.ReferenceQueue$Lock)
      	at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:164)
      	at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:209)
      
      "Reference Handler" #2 daemon prio=10 os_prio=31 tid=0x00007fb70d802000 nid=0x3603 in Object.wait() [0x0000700000c37000]
         java.lang.Thread.State: WAITING (on object monitor)
      	at java.lang.Object.wait(Native Method)
      	- waiting on <0x00000006c0026670> (a java.lang.ref.Reference$Lock)
      	at java.lang.Object.wait(Object.java:502)
      	at java.lang.ref.Reference.tryHandlePending(Reference.java:191)
      	- locked <0x00000006c0026670> (a java.lang.ref.Reference$Lock)
      	at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:153)
      
      "VM Thread" os_prio=31 tid=0x00007fb70b82b000 nid=0x3403 runnable 
      
      "GC task thread#0 (ParallelGC)" os_prio=31 tid=0x00007fb70d003800 nid=0x2403 runnable 
      
      "GC task thread#1 (ParallelGC)" os_prio=31 tid=0x00007fb70d004000 nid=0x2603 runnable 
      
      "GC task thread#2 (ParallelGC)" os_prio=31 tid=0x00007fb70d004800 nid=0x2803 runnable 
      
      "GC task thread#3 (ParallelGC)" os_prio=31 tid=0x00007fb70a80a800 nid=0x2a03 runnable 
      
      "GC task thread#4 (ParallelGC)" os_prio=31 tid=0x00007fb70a80b000 nid=0x2c03 runnable 
      
      "GC task thread#5 (ParallelGC)" os_prio=31 tid=0x00007fb70a80b800 nid=0x2e03 runnable 
      
      "GC task thread#6 (ParallelGC)" os_prio=31 tid=0x00007fb70d005000 nid=0x3003 runnable 
      
      "GC task thread#7 (ParallelGC)" os_prio=31 tid=0x00007fb70d006000 nid=0x3203 runnable 
      
      "VM Periodic Task Thread" os_prio=31 tid=0x00007fb70b042000 nid=0x5603 waiting on condition 
      
      JNI global references: 5741
      

      Attachments

        1. OOZIE-2775-01.patch
          2 kB
          Attila Sasvári
        2. OOZIE-2775-02.patch
          5 kB
          Attila Sasvári

        Issue Links

          Activity

            People

              asasvari Attila Sasvári
              asasvari Attila Sasvári
              Votes:
              0 Vote for this issue
              Watchers:
              2 Start watching this issue

              Dates

                Created:
                Updated:
                Resolved: