ONOS-5271 pendingDevices is used to track installation progress,
thus it is mutable.

This reverts commit e38b866af5ad7ec3938ad662a46798f535a9fad8.

Change-Id: Ie71a4cf2d795e2fd781e96fc1274cfcbfc659cb5
diff --git a/core/net/src/main/java/org/onosproject/net/flow/impl/FlowRuleManager.java b/core/net/src/main/java/org/onosproject/net/flow/impl/FlowRuleManager.java
index f1de6fa..9e0db6a 100644
--- a/core/net/src/main/java/org/onosproject/net/flow/impl/FlowRuleManager.java
+++ b/core/net/src/main/java/org/onosproject/net/flow/impl/FlowRuleManager.java
@@ -16,7 +16,6 @@
 package org.onosproject.net.flow.impl;
 
 import com.google.common.collect.ArrayListMultimap;
-import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
@@ -601,22 +600,22 @@
     private class FlowOperationsProcessor implements Runnable {
         // Immutable
         private final FlowRuleOperations fops;
-        private final ImmutableSet<DeviceId> pendingDevices;
 
         // Mutable
         private final List<Set<FlowRuleOperation>> stages;
+        private final Set<DeviceId> pendingDevices;
         private boolean hasFailed = false;
 
         FlowOperationsProcessor(FlowRuleOperations ops) {
             this.stages = Lists.newArrayList(ops.stages());
             this.fops = ops;
-            this.pendingDevices = ImmutableSet.of();
+            this.pendingDevices = new HashSet<>();
         }
 
-        FlowOperationsProcessor(FlowOperationsProcessor src, boolean hasFailed, Set<DeviceId> pendingDevices) {
+        FlowOperationsProcessor(FlowOperationsProcessor src, boolean hasFailed) {
             this.fops = src.fops;
             this.stages = Lists.newArrayList(src.stages);
-            this.pendingDevices = ImmutableSet.copyOf(pendingDevices);
+            this.pendingDevices = new HashSet<>(src.pendingDevices);
             this.hasFailed = hasFailed;
         }
 
@@ -636,33 +635,28 @@
                 perDeviceBatches.put(op.rule().deviceId(),
                         new FlowRuleBatchEntry(mapOperationType(op.type()), op.rule()));
             }
-            ImmutableSet<DeviceId> newPendingDevices = ImmutableSet.<DeviceId>builder()
-                    .addAll(pendingDevices)
-                    .addAll(perDeviceBatches.keySet())
-                    .build();
+            pendingDevices.addAll(perDeviceBatches.keySet());
 
             for (DeviceId deviceId : perDeviceBatches.keySet()) {
                 long id = idGenerator.getNewId();
                 final FlowRuleBatchOperation b = new FlowRuleBatchOperation(perDeviceBatches.get(deviceId),
                                                deviceId, id);
-                pendingFlowOperations.put(id, new FlowOperationsProcessor(this, hasFailed, newPendingDevices));
+                pendingFlowOperations.put(id, this);
                 deviceInstallers.execute(() -> store.storeBatch(b));
             }
         }
 
         synchronized void satisfy(DeviceId devId) {
-            Set<DeviceId> newPendingDevices = new HashSet<>(pendingDevices);
-            newPendingDevices.remove(devId);
-            if (newPendingDevices.isEmpty()) {
-                operationsService.execute(new FlowOperationsProcessor(this, hasFailed, newPendingDevices));
+            pendingDevices.remove(devId);
+            if (pendingDevices.isEmpty()) {
+                operationsService.execute(new FlowOperationsProcessor(this, hasFailed));
             }
         }
 
         synchronized void fail(DeviceId devId, Set<? extends FlowRule> failures) {
-            Set<DeviceId> newPendingDevices = new HashSet<>(pendingDevices);
-            newPendingDevices.remove(devId);
-            if (newPendingDevices.isEmpty()) {
-                operationsService.execute(new FlowOperationsProcessor(this, true, newPendingDevices));
+            pendingDevices.remove(devId);
+            if (pendingDevices.isEmpty()) {
+                operationsService.execute(new FlowOperationsProcessor(this, true));
             }
 
             FlowRuleOperations.Builder failedOpsBuilder = FlowRuleOperations.builder();