Print

Print


Author: [log in to unmask]
Date: Tue Mar 10 15:32:04 2015
New Revision: 2392

Log:
Improve disconnection code (still needs comprehensive testing).

Modified:
    java/trunk/monitoring-app/src/main/java/org/hps/monitoring/application/EventProcessing.java

Modified: java/trunk/monitoring-app/src/main/java/org/hps/monitoring/application/EventProcessing.java
 =============================================================================
--- java/trunk/monitoring-app/src/main/java/org/hps/monitoring/application/EventProcessing.java	(original)
+++ java/trunk/monitoring-app/src/main/java/org/hps/monitoring/application/EventProcessing.java	Tue Mar 10 15:32:04 2015
@@ -24,6 +24,8 @@
 import org.hps.record.enums.DataSourceType;
 import org.hps.record.et.EtConnection;
 import org.hps.record.evio.EvioDetectorConditionsProcessor;
+import org.jlab.coda.et.exception.EtClosedException;
+import org.jlab.coda.et.exception.EtException;
 import org.lcsim.conditions.ConditionsManager;
 import org.lcsim.conditions.ConditionsReader;
 import org.lcsim.util.Driver;
@@ -251,57 +253,57 @@
         sessionState.jobManager.setup(is);
         is.close();
     }
-    
-    /**
-     * Stop the event processing by executing a <code>STOP</code> command on the record loop and
-     * killing the event processing thread. This is executed after the ET system is disconnected so
-     * that the event processing does not potentially hang in a call to
-     * <code>EtSystem.getEvents()</code> forever.
-     */
+        
     synchronized void stop() {
-
-        logger.info("event processing is stopping");
-        
-        // Disconnect from ET system.
+        
+        // Kill session watchdog thread.
+        logger.fine("killing watchdog thread ...");
+        killWatchdogThread();
+        logger.fine("watchdog thread killed");
+        
+        // Wake up ET system in case it is blocked in a getEvents() call.
+        if (sessionState.connection != null) {
+            try {
+                logger.fine("waking up ET stations ...");
+                sessionState.connection.getEtSystem().wakeUpAll(sessionState.connection.getEtStation());
+                logger.fine("ET stations woken up");
+            } catch (IOException | EtException | EtClosedException e) {
+                e.printStackTrace();
+            }
+        }
+        
+        // Stop event processing.
+        logger.fine("commanding event processing to stop ...");
+        sessionState.loop.execute(Command.STOP);
+        logger.fine("event processing commanded to stop");
+        
+        // Cleanup the event processing thread.
+        try {
+            logger.fine("joining on event processing thread ...");
+            sessionState.processingThread.join();
+            logger.fine("event processing thread joined");
+            
+            // Invalidate event processing thread.
+            sessionState.processingThread = null;
+        } catch (InterruptedException e) {
+            e.printStackTrace();
+        }
+        
+        // Notify of last error that occurred in event processing.
+        if (sessionState.loop.getLastError() != null) {
+            // Log the error.
+            application.errorHandler.setError(sessionState.loop.getLastError()).log();
+        }
+        
+        // Invalidate loop.
+        sessionState.loop = null;
+               
+        // Disconnect from the ET system.
+        logger.fine("disconnecting from ET system ...");
         disconnect();
-        
-        // Is the event processing thread not null?
-        if (sessionState.processingThread != null) {
-
-            // Is the event processing thread actually still alive?
-            if (sessionState.processingThread.isAlive()) {
-
-                // Request the event processing loop to execute stop.
-                sessionState.loop.execute(Command.STOP);
-
-                try {
-                    logger.info("waiting for event processing thread to finish");
-                    // This should always work, because the ET system is disconnected before this.
-                    sessionState.processingThread.interrupt();
-                    sessionState.processingThread.stop();
-                    sessionState.processingThread.join();
-                    logger.info("event processing thread finished");
-                } catch (InterruptedException e) {
-                    // Don't know when this would ever happen.
-                    e.printStackTrace();
-                }
-            }
-
-            // Notify of last error that occurred in event processing.
-            if (sessionState.loop.getLastError() != null) {
-                application.errorHandler.setError(sessionState.loop.getLastError()).log().printStackTrace();
-            }
-
-            // Set the event processing thread to null as it is unusable now.
-            sessionState.processingThread = null;
-        }
-
-        // Set the loop to null as a new one will be created for next session.
-        sessionState.loop = null;
-        
-        logger.info("event processing stopped");
-    }    
-           
+        logger.fine("ET system disconnected");
+    }
+    
     /**
      * Start event processing on the event processing thread
      * and start the watchdog thread.
@@ -388,14 +390,25 @@
      * Cleanup the ET connection.
      */
     synchronized void closeEtConnection() {
-        logger.fine("closing ET connection");
         if (sessionState.connection != null) {
+            logger.fine("closing ET connection");
             if (sessionState.connection.getEtSystem().alive()) {
+                try {
+                    logger.fine("waking up the ET station");
+                    sessionState.connection.getEtSystem().wakeUpAll(sessionState.connection.getEtStation());                    
+                    sessionState.connection.getEtStation().getStatus();
+                } catch (Exception e) {
+                    logger.warning(e.getMessage());
+                    e.printStackTrace();
+                }
+                logger.fine("cleaning up the connection");
                 sessionState.connection.cleanup();
+                logger.fine("connection cleanup successful");
             }
             sessionState.connection = null;
-        }
-        logger.fine("ET connection closed");
+            logger.fine("connection invalid now");
+            logger.fine("ET connection closed");
+        }
     }
     
     /**
@@ -458,10 +471,7 @@
     synchronized void disconnect() {
         
         logger.fine("disconnecting");
-        
-        // Kill the session watch dog thread.
-        killWatchdogThread();
-
+                
         // Cleanup the ET connection.
         closeEtConnection();
                               
@@ -489,9 +499,11 @@
                 processingThread.join();
                                 
                 // Activate a disconnect using the ActionEvent which is used by the disconnect button.
+                logger.fine("processing thread ended so automatic disconnect is happening");
                 application.actionPerformed(new ActionEvent(Thread.currentThread(), 0, Commands.DISCONNECT));
                                
             } catch (InterruptedException e) {
+                logger.fine("SessionWatchdogThread got interrupted");
                 // This happens when the thread is interrupted by the user pressing the disconnect button.
             }            
         }