Author: orudyy
Date: Tue Oct 28 21:57:48 2014
New Revision: 1634996

URL: http://svn.apache.org/r1634996
Log:
QPID-6195: Stop recovering records being updated in one upgrader and removed in 
another upgrader

Modified:
    
qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/store/NonNullUpgrader.java
    
qpid/trunk/qpid/java/broker-core/src/test/java/org/apache/qpid/server/store/VirtualHostStoreUpgraderAndRecovererTest.java

Modified: 
qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/store/NonNullUpgrader.java
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/store/NonNullUpgrader.java?rev=1634996&r1=1634995&r2=1634996&view=diff
==============================================================================
--- 
qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/store/NonNullUpgrader.java
 (original)
+++ 
qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/store/NonNullUpgrader.java
 Tue Oct 28 21:57:48 2014
@@ -61,6 +61,7 @@ public abstract class NonNullUpgrader im
     {
         final Map<UUID, ConfiguredObjectRecord> updates = new HashMap<UUID, 
ConfiguredObjectRecord>(_updates);
         updates.putAll(_nextUpgrader.getUpdatedRecords());
+        updates.keySet().removeAll(getDeletedRecords().keySet());
         return updates;
     }
 

Modified: 
qpid/trunk/qpid/java/broker-core/src/test/java/org/apache/qpid/server/store/VirtualHostStoreUpgraderAndRecovererTest.java
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-core/src/test/java/org/apache/qpid/server/store/VirtualHostStoreUpgraderAndRecovererTest.java?rev=1634996&r1=1634995&r2=1634996&view=diff
==============================================================================
--- 
qpid/trunk/qpid/java/broker-core/src/test/java/org/apache/qpid/server/store/VirtualHostStoreUpgraderAndRecovererTest.java
 (original)
+++ 
qpid/trunk/qpid/java/broker-core/src/test/java/org/apache/qpid/server/store/VirtualHostStoreUpgraderAndRecovererTest.java
 Tue Oct 28 21:57:48 2014
@@ -35,6 +35,7 @@ import java.util.UUID;
 
 import org.apache.qpid.server.configuration.updater.CurrentThreadTaskExecutor;
 import org.apache.qpid.server.logging.EventLogger;
+import org.apache.qpid.server.model.Binding;
 import org.apache.qpid.server.model.Broker;
 import org.apache.qpid.server.model.BrokerModel;
 import org.apache.qpid.server.model.Exchange;
@@ -142,8 +143,56 @@ public class VirtualHostStoreUpgraderAnd
         assertEquals("Unexpected alternative exchange", recoveredDLE, 
recoveredQueue.getAlternateExchange());
     }
 
+    public void 
testRecordUpdatedInOneUpgraderAndRemovedInAnotherUpgraderIsNotRecovered()
+    {
+        ConfiguredObjectRecord queue = mockQueue("test-queue", null);
+        ConfiguredObjectRecord exchange = mockExchange("test-direct", 
"direct");
+        ConfiguredObjectRecord queueBinding1 =  mockBinding("test-binding", 
queue, exchange);
+        ConfiguredObjectRecord nonExistingExchange = 
mock(ConfiguredObjectRecord.class);
+
+        // selector on non-topic exchange should be removed from binding 
arguments in upgrader 0.0->0.1
+        // binding to non-existing exchange is removed in upgrader 0.1->0.2
+        
when(nonExistingExchange.getId()).thenReturn(UUIDGenerator.generateExchangeUUID("non-existing",
 "test"));
+        Map<String, Object> arguments = Collections.<String, 
Object>singletonMap("x-filter-jms-selector", "id=1");
+        ConfiguredObjectRecord queueBinding2 =  
mockBinding("test-non-existing", queue, nonExistingExchange, arguments);
+        setUpVisit(_hostRecord, queue, exchange, queueBinding1, queueBinding2);
+
+        VirtualHostStoreUpgraderAndRecoverer upgraderAndRecoverer = new 
VirtualHostStoreUpgraderAndRecoverer(_virtualHostNode);
+        upgraderAndRecoverer.perform(_durableConfigurationStore);
+
+        final VirtualHost<?,?,?>  host = _virtualHostNode.getVirtualHost();
+        
Subject.doAs(org.apache.qpid.server.security.SecurityManager.getSubjectWithAddedSystemRights(),
 new PrivilegedAction<Void>()
+                {
+                    @Override
+                    public Void run()
+                    {
+                        host.open();
+                        return null;
+                    }
+                }
+        );
+
+        assertNotNull("Virtual host is not recovered", host);
+        Queue<?> recoveredQueue = host.findConfiguredObject(Queue.class, 
"test-queue");
+        assertNotNull("Queue is not recovered", recoveredQueue);
+
+        Exchange<?> recoveredExchange= 
host.findConfiguredObject(Exchange.class, "test-direct");
+        assertNotNull("Exchange is not recovered", recoveredExchange);
+
+        Binding<?> recoveredBinding1 = 
recoveredQueue.findConfiguredObject(Binding.class, "test-binding");
+        assertNotNull("Correct binding is not recovered", recoveredBinding1);
+
+        Binding<?> recoveredBinding2 = 
recoveredQueue.findConfiguredObject(Binding.class, "test-non-existing");
+        assertNull("Incorrect binding is recovered", recoveredBinding2);
+    }
+
     private ConfiguredObjectRecord mockBinding(String bindingName, 
ConfiguredObjectRecord queue, ConfiguredObjectRecord exchange)
     {
+        return mockBinding(bindingName, queue, exchange, null);
+    }
+
+    private ConfiguredObjectRecord mockBinding(String bindingName, 
ConfiguredObjectRecord queue, ConfiguredObjectRecord exchange, Map<String, 
Object> arguments)
+    {
         ConfiguredObjectRecord binding = mock(ConfiguredObjectRecord.class);
         when(binding.getId()).thenReturn(UUID.randomUUID());
         
when(binding.getType()).thenReturn("org.apache.qpid.server.model.Binding");
@@ -156,6 +205,10 @@ public class VirtualHostStoreUpgraderAnd
         Map<String, Object> attributes = new HashMap<>();
         attributes.put("durable", true);
         attributes.put("name", bindingName);
+        if (arguments != null)
+        {
+            attributes.put("arguments", arguments);
+        }
         when(binding.getAttributes()).thenReturn(attributes);
         return binding;
     }



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

Reply via email to