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]