Optimize the OvsdbPortUpdateCommand during the ODL reboot/Ovsdb connection 19/86819/3
authorChandra Shekar S <chandra.shekar.s@ericsson.com>
Thu, 9 Jan 2020 06:41:18 +0000 (12:11 +0530)
committerChetan Arakere Gowdru <chetan.arakere@altencalsoftlabs.com>
Mon, 13 Jan 2020 06:32:16 +0000 (06:32 +0000)
JIRA: OVSDB-491

When the Compute is connected or flapped, ODL will retrieve all the Ovsdb
configuration from the Compute with MonitorCallBack and process the these configurations
and updates them into the topology operational datastore.
Currently OvsdbPortUpdateCommand will extract the port information that retrieved from
compute and update the same to topology operational datastore. Each port update is resulting in
one database operations.
In scale setup the number ports will be in big number and will result in huge number of
database operations to update these port informations.
It will give us the perfomance improvement if the number of database operations for the
port updates is done per bridge instead of per port, during Ovsdb connection.
This will reduce the number of db operations to number bridges instead of number of port

This review is collect all the Port create commands and update the datastore with
single merge on bridge node.

Signed-off-by: Chandra Shekar S <chandra.shekar.s@ericsson.com>
Change-Id: Ie3ab258fb665d40e92177b4435b1bd72c07fdb81

southbound/southbound-impl/pom.xml
southbound/southbound-impl/src/main/java/org/opendaylight/ovsdb/southbound/OvsdbMonitorCallback.java
southbound/southbound-impl/src/main/java/org/opendaylight/ovsdb/southbound/transactions/md/OvsdbBridgeUpdateCommand.java
southbound/southbound-impl/src/main/java/org/opendaylight/ovsdb/southbound/transactions/md/OvsdbInitialPortUpdateCommand.java [new file with mode: 0644]
southbound/southbound-impl/src/main/java/org/opendaylight/ovsdb/southbound/transactions/md/OvsdbOperationalCommandAggregator.java
southbound/southbound-impl/src/main/java/org/opendaylight/ovsdb/southbound/transactions/md/OvsdbPortUpdateCommand.java
southbound/southbound-impl/src/test/java/org/opendaylight/ovsdb/southbound/OvsdbMonitorCallbackTest.java
southbound/southbound-impl/src/test/java/org/opendaylight/ovsdb/southbound/transactions/md/OvsdbBridgeUpdateCommandTest.java
southbound/southbound-impl/src/test/java/org/opendaylight/ovsdb/southbound/transactions/md/OvsdbOperationalCommandAggregatorTest.java

index ad62ea7d0d4dddbbc790fece080971b960fa9c44..df14ff7930f3a9c7a835cf7aa905bba3ae03f628 100644 (file)
@@ -51,6 +51,11 @@ and is available at http://www.eclipse.org/legal/epl-v10.html
       <artifactId>southbound-api</artifactId>
       <version>${project.version}</version>
     </dependency>
+    <dependency>
+      <groupId>${project.groupId}</groupId>
+      <artifactId>utils.mdsal-utils</artifactId>
+      <version>${project.version}</version>
+    </dependency>
     <dependency>
       <groupId>${project.groupId}</groupId>
       <artifactId>library</artifactId>
index f9d49392dedf5369645cc05d39e5e4d448c49583..d550c6653008afbd941df0e0a884beedfe4798d6 100644 (file)
@@ -7,6 +7,8 @@
  */
 package org.opendaylight.ovsdb.southbound;
 
+import java.util.concurrent.atomic.AtomicBoolean;
+
 import org.opendaylight.ovsdb.lib.MonitorCallBack;
 import org.opendaylight.ovsdb.lib.message.TableUpdates;
 import org.opendaylight.ovsdb.lib.schema.DatabaseSchema;
@@ -21,6 +23,7 @@ public class OvsdbMonitorCallback implements MonitorCallBack {
     private final InstanceIdentifierCodec instanceIdentifierCodec;
     private TransactionInvoker txInvoker;
     private OvsdbConnectionInstance key;
+    private AtomicBoolean intialUpdate = new AtomicBoolean(false);
 
     OvsdbMonitorCallback(InstanceIdentifierCodec instanceIdentifierCodec, OvsdbConnectionInstance key,
             TransactionInvoker txInvoker) {
@@ -31,7 +34,9 @@ public class OvsdbMonitorCallback implements MonitorCallBack {
 
     @Override
     public void update(TableUpdates result, DatabaseSchema dbSchema) {
-        txInvoker.invoke(new OvsdbOperationalCommandAggregator(instanceIdentifierCodec, key, result, dbSchema));
+        boolean isFirstUpdate = intialUpdate.compareAndSet(false, true);
+        txInvoker.invoke(new OvsdbOperationalCommandAggregator(instanceIdentifierCodec, key, result,
+                dbSchema, isFirstUpdate));
         LOG.trace("Updated dbSchema: {} and result: {}", dbSchema, result);
     }
 
index e21410997e10261534a846da331fb4c56cfad541..0678c112689cf996486408ffcf2f02ef895edd5a 100644 (file)
@@ -75,13 +75,16 @@ public class OvsdbBridgeUpdateCommand extends AbstractTransactionCommand {
     private final Map<UUID,Bridge> updatedBridgeRows;
     private final Map<UUID, Bridge> oldBridgeRows;
     private final List<InstanceIdentifier<Node>> updatedBridges = new ArrayList<>();
+    private final Map<NodeId, Node> updatedBridgeNodes;
 
     public OvsdbBridgeUpdateCommand(InstanceIdentifierCodec instanceIdentifierCodec, OvsdbConnectionInstance key,
-            TableUpdates updates, DatabaseSchema dbSchema) {
+            TableUpdates updates, DatabaseSchema dbSchema,
+                                    Map<NodeId, Node> updatedBridgeNodes) {
         super(key,updates,dbSchema);
         this.instanceIdentifierCodec = instanceIdentifierCodec;
         updatedBridgeRows = TyperUtils.extractRowsUpdated(Bridge.class, getUpdates(), getDbSchema());
         oldBridgeRows = TyperUtils.extractRowsOld(Bridge.class, getUpdates(), getDbSchema());
+        this.updatedBridgeNodes = updatedBridgeNodes;
     }
 
     @Override
@@ -113,6 +116,7 @@ public class OvsdbBridgeUpdateCommand extends AbstractTransactionCommand {
         Node bridgeNode = buildBridgeNode(bridge);
         transaction.merge(LogicalDatastoreType.OPERATIONAL, bridgeIid, bridgeNode);
         updatedBridges.add(bridgeIid);
+        updatedBridgeNodes.put(getNodeId(bridge), bridgeNode);
         deleteEntries(transaction, protocolEntriesToRemove(bridgeIid, bridge));
         deleteEntries(transaction, externalIdsToRemove(bridgeIid,bridge));
         deleteEntries(transaction, bridgeOtherConfigsToRemove(bridgeIid,bridge));
diff --git a/southbound/southbound-impl/src/main/java/org/opendaylight/ovsdb/southbound/transactions/md/OvsdbInitialPortUpdateCommand.java b/southbound/southbound-impl/src/main/java/org/opendaylight/ovsdb/southbound/transactions/md/OvsdbInitialPortUpdateCommand.java
new file mode 100644 (file)
index 0000000..bd80e94
--- /dev/null
@@ -0,0 +1,95 @@
+/*
+ * Copyright (c) 2020 Ericsson India Global Services Pvt Ltd and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.ovsdb.southbound.transactions.md;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;
+import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.ovsdb.lib.message.TableUpdates;
+import org.opendaylight.ovsdb.lib.schema.DatabaseSchema;
+import org.opendaylight.ovsdb.southbound.InstanceIdentifierCodec;
+import org.opendaylight.ovsdb.southbound.OvsdbConnectionInstance;
+import org.opendaylight.ovsdb.southbound.SouthboundMapper;
+import org.opendaylight.ovsdb.utils.mdsal.utils.TransactionType;
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId;
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.NodeBuilder;
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPoint;
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPointBuilder;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+public class OvsdbInitialPortUpdateCommand extends OvsdbPortUpdateCommand {
+    private static final Logger LOG = LoggerFactory.getLogger(OvsdbInitialPortUpdateCommand.class);
+    private final Map<NodeId, Node>  updatedBridgeNodes;
+    private final Map<NodeId, List<TerminationPoint>> brigeToTerminationPointList = new HashMap<>();
+
+    public OvsdbInitialPortUpdateCommand(InstanceIdentifierCodec instanceIdentifierCodec, OvsdbConnectionInstance key,
+                                         TableUpdates updates, DatabaseSchema dbSchema,
+                                         Map<NodeId, Node> updatedBridgeNodes) {
+        super(instanceIdentifierCodec, key, updates, dbSchema);
+        this.updatedBridgeNodes = updatedBridgeNodes;
+    }
+
+    @Override
+    public void execute(ReadWriteTransaction transaction) {
+        super.execute(transaction);
+        mergeToBridgeNode(transaction);
+    }
+
+    @SuppressWarnings("checkstyle:IllegalCatch")
+    protected void updateToDataStore(ReadWriteTransaction transaction, TerminationPointBuilder tpBuilder,
+                                     InstanceIdentifier<TerminationPoint> tpPath, boolean merge) {
+        try {
+            NodeId bridgeNodeId = tpPath.firstKeyOf(Node.class).getNodeId();
+            TerminationPoint terminationPoint = tpBuilder.build();
+            if (updatedBridgeNodes.containsKey(bridgeNodeId)) {
+                if (brigeToTerminationPointList.containsKey(bridgeNodeId)) {
+                    brigeToTerminationPointList.get(bridgeNodeId).add(terminationPoint);
+                } else {
+                    List<TerminationPoint> terminationPointList = new ArrayList<>();
+                    terminationPointList.add(terminationPoint);
+                    brigeToTerminationPointList.put(bridgeNodeId, terminationPointList);
+                }
+                LOG.debug("DEVICE - {} Initial TerminationPoint : {} to Bridge : {}", TransactionType.ADD,
+                        terminationPoint.key().getTpId().getValue(), bridgeNodeId.getValue());
+            }
+        }
+        catch (RuntimeException exp) {
+            LOG.error("Exception in adding the terminationPoint {} to bridge ", tpPath);
+        }
+
+    }
+
+    private void mergeToBridgeNode(ReadWriteTransaction transaction) {
+
+        brigeToTerminationPointList.forEach((nodeId, terminationPoints) -> {
+            InstanceIdentifier<Node> bridgeIid = SouthboundMapper.createInstanceIdentifier(nodeId);
+            StringBuilder terminationPointList = new StringBuilder();
+            Node bridgeNode = updatedBridgeNodes.get(nodeId);
+            if (bridgeNode != null) {
+                NodeBuilder bridgeNodeBuilder = new NodeBuilder(bridgeNode);
+                bridgeNodeBuilder.setTerminationPoint(terminationPoints);
+                Node bridgeNodeWithTerminationPoints = bridgeNodeBuilder.build();
+                transaction.merge(LogicalDatastoreType.OPERATIONAL, bridgeIid, bridgeNodeWithTerminationPoints);
+            }
+            terminationPoints.forEach(terminationPoint -> {
+                terminationPointList.append(terminationPoint.key().getTpId().getValue() +  ",");
+            });
+            LOG.info("DEVICE - {} Initial TerminationPoint List : {} to Bridge : {}", TransactionType.ADD,
+                terminationPointList.toString(), bridgeIid.firstKeyOf(Node.class).getNodeId().getValue());
+        });
+    }
+}
index 8ee27c5344f4c0d9858b4352ac655ca620c7e2e0..57ded1101c2928d2a8e09d87673f2037b04417a3 100644 (file)
@@ -9,7 +9,9 @@
 package org.opendaylight.ovsdb.southbound.transactions.md;
 
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 import java.util.NoSuchElementException;
 import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;
 import org.opendaylight.ovsdb.lib.message.TableUpdates;
@@ -18,6 +20,8 @@ import org.opendaylight.ovsdb.lib.schema.DatabaseSchema;
 import org.opendaylight.ovsdb.southbound.InstanceIdentifierCodec;
 import org.opendaylight.ovsdb.southbound.OvsdbConnectionInstance;
 import org.opendaylight.ovsdb.southbound.SouthboundConstants;
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId;
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -25,9 +29,12 @@ public class OvsdbOperationalCommandAggregator implements TransactionCommand {
 
     private static final Logger LOG = LoggerFactory.getLogger(OvsdbOperationalCommandAggregator.class);
     private final List<TransactionCommand> commands = new ArrayList<>();
+    private final Map<NodeId, Node> updatedBridgeNodes = new HashMap<>();
+    private boolean initialUpdate;
 
     public OvsdbOperationalCommandAggregator(InstanceIdentifierCodec instanceIdentifierCodec,
-            OvsdbConnectionInstance key, TableUpdates updates, DatabaseSchema dbSchema) {
+            OvsdbConnectionInstance key, TableUpdates updates, DatabaseSchema dbSchema, boolean initialUpdate) {
+        this.initialUpdate = initialUpdate;
         commands.add(new OpenVSwitchUpdateCommand(instanceIdentifierCodec, key, updates, dbSchema));
         commands.add(new OvsdbManagersUpdateCommand(key, updates,  dbSchema));
         commands.add(new OvsdbManagersRemovedCommand(key, updates,  dbSchema));
@@ -35,11 +42,17 @@ public class OvsdbOperationalCommandAggregator implements TransactionCommand {
         commands.add(new OvsdbQosRemovedCommand(key, updates,  dbSchema));
         commands.add(new OvsdbQueueUpdateCommand(instanceIdentifierCodec, key, updates,  dbSchema));
         commands.add(new OvsdbQueueRemovedCommand(key, updates,  dbSchema));
-        commands.add(new OvsdbBridgeUpdateCommand(instanceIdentifierCodec, key, updates,  dbSchema));
+        commands.add(new OvsdbBridgeUpdateCommand(instanceIdentifierCodec, key, updates,  dbSchema,
+                updatedBridgeNodes));
         commands.add(new OvsdbBridgeRemovedCommand(instanceIdentifierCodec, key, updates,  dbSchema));
         commands.add(new OvsdbControllerUpdateCommand(key, updates,  dbSchema));
         commands.add(new OvsdbControllerRemovedCommand(instanceIdentifierCodec, key, updates,  dbSchema));
-        commands.add(new OvsdbPortUpdateCommand(instanceIdentifierCodec, key, updates, dbSchema));
+        if (initialUpdate) {
+            commands.add(new OvsdbInitialPortUpdateCommand(instanceIdentifierCodec, key, updates, dbSchema,
+                    updatedBridgeNodes));
+        } else {
+            commands.add(new OvsdbPortUpdateCommand(instanceIdentifierCodec, key, updates, dbSchema));
+        }
         commands.add(new OvsdbPortRemoveCommand(instanceIdentifierCodec, key, updates, dbSchema));
 
         if (dbSchema.getVersion().compareTo(
index 6ae80b2ebe4eb789b2101da86b893f034b3a3f11..00a1a6121847371d191c2a9c0f816d4edd0aa7e6 100644 (file)
@@ -39,6 +39,7 @@ import org.opendaylight.ovsdb.southbound.OvsdbConnectionInstance;
 import org.opendaylight.ovsdb.southbound.SouthboundConstants;
 import org.opendaylight.ovsdb.southbound.SouthboundMapper;
 import org.opendaylight.ovsdb.southbound.SouthboundUtil;
+import org.opendaylight.ovsdb.utils.mdsal.utils.TransactionType;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Uri;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.MacAddress;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid;
@@ -136,6 +137,7 @@ public class OvsdbPortUpdateCommand extends AbstractTransactionCommand {
                 bridgeIid = getTerminationPointBridge(transaction, node, portName);
             }
             if (bridgeIid.isPresent()) {
+                NodeId bridgeId = SouthboundMapper.createManagedNodeId(bridgeIid.get());
                 TerminationPointKey tpKey = new TerminationPointKey(new TpId(portName));
                 TerminationPointBuilder tpBuilder = new TerminationPointBuilder();
                 tpBuilder.withKey(tpKey);
@@ -153,11 +155,13 @@ public class OvsdbPortUpdateCommand extends AbstractTransactionCommand {
                 }
                 tpBuilder.addAugmentation(OvsdbTerminationPointAugmentation.class, tpAugmentationBuilder.build());
                 if (portOldRows.containsKey(portUpdate.getKey()) && !portQosCleared(portUpdate)) {
-                    transaction.merge(LogicalDatastoreType.OPERATIONAL,
-                            tpPath, tpBuilder.build());
+                    updateToDataStore(transaction, tpBuilder, tpPath, true);
+                    LOG.info("DEVICE - {} TerminationPoint : {} to Bridge : {}", TransactionType.ADD,
+                            tpKey.getTpId().getValue(), bridgeId.getValue());
                 } else {
-                    transaction.put(LogicalDatastoreType.OPERATIONAL,
-                            tpPath, tpBuilder.build());
+                    updateToDataStore(transaction, tpBuilder, tpPath, false);
+                    LOG.debug("DEVICE - {} TerminationPoint : {} to Bridge : {}", TransactionType.UPDATE,
+                            tpKey.getTpId().getValue(), bridgeId.getValue());
                 }
             }
         }
@@ -180,13 +184,23 @@ public class OvsdbPortUpdateCommand extends AbstractTransactionCommand {
                         .child(Topology.class, new TopologyKey(SouthboundConstants.OVSDB_TOPOLOGY_ID))
                         .child(Node.class,new NodeKey(bridgeId))
                         .child(TerminationPoint.class,tpKey);
-                transaction.merge(LogicalDatastoreType.OPERATIONAL,
-                        tpPath, tpBuilder.build());
+                updateToDataStore(transaction, tpBuilder, tpPath, true);
             }
         }
 
     }
 
+    protected void updateToDataStore(ReadWriteTransaction transaction, TerminationPointBuilder tpBuilder,
+                                     InstanceIdentifier<TerminationPoint> tpPath, boolean merge) {
+        if (merge) {
+            transaction.merge(LogicalDatastoreType.OPERATIONAL,
+                    tpPath, tpBuilder.build());
+        } else {
+            transaction.put(LogicalDatastoreType.OPERATIONAL,
+                    tpPath, tpBuilder.build());
+        }
+    }
+
     @VisibleForTesting
     void buildTerminationPoint(ReadWriteTransaction transaction,
             InstanceIdentifier<TerminationPoint> tpPath,
index cc1bc38630a519310f731721bb79966f7213da5e..786f5de038a8bd237471e9dea9044394bb602f11 100644 (file)
@@ -13,6 +13,7 @@ import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
+import java.util.concurrent.atomic.AtomicBoolean;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.InjectMocks;
@@ -25,6 +26,7 @@ import org.opendaylight.ovsdb.lib.schema.DatabaseSchema;
 import org.opendaylight.ovsdb.southbound.transactions.md.OvsdbOperationalCommandAggregator;
 import org.opendaylight.ovsdb.southbound.transactions.md.TransactionInvoker;
 
+
 @RunWith(MockitoJUnitRunner.class)
 
 public class OvsdbMonitorCallbackTest {
@@ -36,6 +38,8 @@ public class OvsdbMonitorCallbackTest {
     private TransactionInvoker txInvoker;
     @Mock
     private OvsdbConnectionInstance key;
+    @Mock
+    private AtomicBoolean intialUpdate;
 
     @Test
     public void testUpdate() {
index 27332a01f8be8ed5d226ef306797d7e15942b24c..b1a4c531d344dfacf3e2c8a76bdd762b2f0080cb 100644 (file)
@@ -87,6 +87,7 @@ public class OvsdbBridgeUpdateCommandTest {
     private final Map<UUID,Bridge> updatedBridgeRows = new HashMap<>();
     private final Map<UUID, Bridge> oldBridgeRows = new HashMap<>();
     private OvsdbBridgeUpdateCommand ovsdbBridgeUpdateCommand;
+    private Map<NodeId, Node> updatedBridgeNodes = new HashMap<>();
 
     @Before
     public void setUp() throws Exception {
@@ -95,6 +96,8 @@ public class OvsdbBridgeUpdateCommandTest {
                 .set(ovsdbBridgeUpdateCommand, new ArrayList<>());
         MemberModifier.field(OvsdbBridgeUpdateCommand.class, "updatedBridgeRows").set(ovsdbBridgeUpdateCommand,
                 updatedBridgeRows);
+        MemberModifier.field(OvsdbBridgeUpdateCommand.class, "updatedBridgeNodes").set(
+                ovsdbBridgeUpdateCommand,updatedBridgeNodes);
     }
 
     @Test
@@ -103,7 +106,8 @@ public class OvsdbBridgeUpdateCommandTest {
         TableUpdates updates = mock(TableUpdates.class);
         DatabaseSchema dbSchema = mock(DatabaseSchema.class);
         OvsdbBridgeUpdateCommand ovsdbBridgeUpdateCommand1 =
-                new OvsdbBridgeUpdateCommand(mock(InstanceIdentifierCodec.class), key, updates, dbSchema);
+                new OvsdbBridgeUpdateCommand(mock(InstanceIdentifierCodec.class), key, updates, dbSchema,
+                        updatedBridgeNodes);
         assertEquals(key, Whitebox.getInternalState(ovsdbBridgeUpdateCommand1, "key"));
         assertEquals(updates, Whitebox.getInternalState(ovsdbBridgeUpdateCommand1, "updates"));
         assertEquals(dbSchema, Whitebox.getInternalState(ovsdbBridgeUpdateCommand1, "dbSchema"));
@@ -150,6 +154,8 @@ public class OvsdbBridgeUpdateCommandTest {
                 InstanceIdentifier.class, Bridge.class));
         MemberModifier.suppress(MemberMatcher.method(OvsdbBridgeUpdateCommand.class, "bridgeOtherConfigsToRemove",
                 InstanceIdentifier.class, Bridge.class));
+        MemberModifier.suppress(MemberMatcher.method(OvsdbBridgeUpdateCommand.class, "getNodeId",
+                Bridge.class));
 
         Bridge bridge = mock(Bridge.class);
         InstanceIdentifier<Node> connectionIId = mock(InstanceIdentifier.class);
index 81895a4736fd79bde2f9290c7a097fe2d5683f54..cd5bc10d78c65900af56bd831ae60c23f1002f34 100644 (file)
@@ -71,7 +71,7 @@ public class OvsdbOperationalCommandAggregatorTest {
         when(dbSchema.getVersion())
                 .thenReturn(Version.fromString(SouthboundConstants.AUTOATTACH_SUPPORTED_OVS_SCHEMA_VERSION));
         OvsdbOperationalCommandAggregator ovsdbOperationalCommandAggregator1 = new OvsdbOperationalCommandAggregator(
-                mock(InstanceIdentifierCodec.class), key, updates, dbSchema);
+                mock(InstanceIdentifierCodec.class), key, updates, dbSchema, false);
         List<TransactionCommand> testCommands = Whitebox.getInternalState(ovsdbOperationalCommandAggregator1,
                 "commands");
         assertEquals(NUMBER_OF_COMMANDS, testCommands.size());