Author: orudyy
Date: Fri May  2 11:45:54 2014
New Revision: 1591875

URL: http://svn.apache.org/r1591875
Log:
QPID-5715: Restart replicated environment several times before giving up. This 
is due to a race condition on receiving DEATCHED event for a restarting 
environment causing EnvironmentFailureException

Modified:
    
qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/replication/ReplicatedEnvironmentFacade.java
    
qpid/trunk/qpid/java/bdbstore/systests/src/main/java/org/apache/qpid/server/store/berkeleydb/BDBHAVirtualHostNodeRestTest.java

Modified: 
qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/replication/ReplicatedEnvironmentFacade.java
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/replication/ReplicatedEnvironmentFacade.java?rev=1591875&r1=1591874&r2=1591875&view=diff
==============================================================================
--- 
qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/replication/ReplicatedEnvironmentFacade.java
 (original)
+++ 
qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/replication/ReplicatedEnvironmentFacade.java
 Fri May  2 11:45:54 2014
@@ -56,7 +56,6 @@ import com.sleepycat.je.Database;
 import com.sleepycat.je.DatabaseConfig;
 import com.sleepycat.je.DatabaseException;
 import com.sleepycat.je.Durability;
-import com.sleepycat.je.Environment;
 import com.sleepycat.je.EnvironmentConfig;
 import com.sleepycat.je.EnvironmentFailureException;
 import com.sleepycat.je.Transaction;
@@ -96,6 +95,7 @@ public class ReplicatedEnvironmentFacade
     private static final int MASTER_TRANSFER_TIMEOUT = 
Integer.getInteger(MASTER_TRANSFER_TIMEOUT_PROPERTY_NAME, 
DEFAULT_MASTER_TRANSFER_TIMEOUT);
     private static final int DB_PING_SOCKET_TIMEOUT = 
Integer.getInteger(DB_PING_SOCKET_TIMEOUT_PROPERTY_NAME, 
DEFAULT_DB_PING_SOCKET_TIMEOUT);
     private static final int REMOTE_NODE_MONITOR_INTERVAL = 
Integer.getInteger(REMOTE_NODE_MONITOR_INTERVAL_PROPERTY_NAME, 
DEFAULT_REMOTE_NODE_MONITOR_INTERVAL);
+    private static final int RESTART_TRY_LIMIT = 3;
 
     @SuppressWarnings("serial")
     private static final Map<String, String> REPCONFIG_DEFAULTS = 
Collections.unmodifiableMap(new HashMap<String, String>()
@@ -280,17 +280,26 @@ public class ReplicatedEnvironmentFacade
                 @Override
                 public void run()
                 {
-                    try
-                    {
-                        restartEnvironment();
-                    }
-                    catch (Exception e)
+                    for (int i = 0; i < RESTART_TRY_LIMIT; i++)
                     {
-                        LOGGER.error("Exception on environment restart", e);
+                        try
+                        {
+                            restartEnvironment();
+                            break;
+                        }
+                        catch(EnvironmentFailureException e)
+                        {
+                            // log exception and try again
+                            LOGGER.warn("Unexpected failure on environment 
restart. Restart iteration: " + i, e);
+                        }
+                        catch (Exception e)
+                        {
+                            LOGGER.error("Exception on environment restart", 
e);
+                            break;
+                        }
                     }
                 }
             });
-
         }
         else
         {
@@ -794,13 +803,24 @@ public class ReplicatedEnvironmentFacade
 
     private void closeEnvironmentOnRestart()
     {
-        Environment environment = _environment;
+        ReplicatedEnvironment environment = _environment;
         if (environment != null)
         {
             try
             {
                 if (environment.isValid())
                 {
+                    environment.setStateChangeListener(new 
StateChangeListener()
+                    {
+                        @Override
+                        public void stateChange(StateChangeEvent 
stateChangeEvent) throws RuntimeException
+                        {
+                            if (LOGGER.isInfoEnabled())
+                            {
+                                LOGGER.debug("When restarting a state change 
event is recieved on NOOP listener for state:" + stateChangeEvent.getState());
+                            }
+                        }
+                    });
                     try
                     {
                         closeDatabases();
@@ -823,7 +843,10 @@ public class ReplicatedEnvironmentFacade
                         }
                     }
                 }
+
+                LOGGER.debug("Closing environent");
                 environment.close();
+                LOGGER.debug("Environent is closed");
             }
             catch (EnvironmentFailureException efe)
             {

Modified: 
qpid/trunk/qpid/java/bdbstore/systests/src/main/java/org/apache/qpid/server/store/berkeleydb/BDBHAVirtualHostNodeRestTest.java
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/java/bdbstore/systests/src/main/java/org/apache/qpid/server/store/berkeleydb/BDBHAVirtualHostNodeRestTest.java?rev=1591875&r1=1591874&r2=1591875&view=diff
==============================================================================
--- 
qpid/trunk/qpid/java/bdbstore/systests/src/main/java/org/apache/qpid/server/store/berkeleydb/BDBHAVirtualHostNodeRestTest.java
 (original)
+++ 
qpid/trunk/qpid/java/bdbstore/systests/src/main/java/org/apache/qpid/server/store/berkeleydb/BDBHAVirtualHostNodeRestTest.java
 Fri May  2 11:45:54 2014
@@ -136,7 +136,7 @@ public class BDBHAVirtualHostNodeRestTes
         if (isMaster)
         {
             assertEquals("Unexpected role", "MASTER", 
nodeData.get(BDBHAVirtualHostNode.ROLE));
-            Map<String, Object> hostData = 
getRestTestHelper().getJsonAsSingletonList("/rest/virtualhost/" + masterNode + 
"/" + _hostName);
+            Map<String, Object> hostData = 
getRestTestHelper().getJsonAsSingletonList("/rest/virtualhost/" + masterNode + 
"/" + _hostName + "?depth=0");
             assertEquals("Unexpected host name", _hostName, 
hostData.get(VirtualHost.NAME));
         }
         else



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to