Immutability for getMeters APIs

Change-Id: Iaf908766aa360e84e82306e398fff56c9593d8f1
diff --git a/core/net/src/main/java/org/onosproject/net/meter/impl/MeterManager.java b/core/net/src/main/java/org/onosproject/net/meter/impl/MeterManager.java
index d157260..a06a037 100644
--- a/core/net/src/main/java/org/onosproject/net/meter/impl/MeterManager.java
+++ b/core/net/src/main/java/org/onosproject/net/meter/impl/MeterManager.java
@@ -15,6 +15,7 @@
  */
 package org.onosproject.net.meter.impl;
 
+import com.google.common.collect.Sets;
 import org.onlab.util.PredictableExecutor;
 import org.onlab.util.PredictableExecutor.PickyRunnable;
 import org.onlab.util.Tools;
@@ -385,17 +386,26 @@
                     });
 
             // Update the meter stats in the store (first time move the state from pending to added)
+            Collection<Meter> addedMeters = Sets.newHashSet();
             meterEntries.stream()
                     .filter(m -> allMeters.stream()
                             .anyMatch(sm -> sm.deviceId().equals(deviceId) && sm.id().equals(m.id())))
-                    .forEach(m -> store.updateMeterState(m));
+                    .forEach(m -> {
+                        Meter updatedMeter = store.updateMeterState(m);
+                        if (updatedMeter != null && updatedMeter.state() == MeterState.ADDED) {
+                            addedMeters.add(updatedMeter);
+                        }
+                    });
+            Collection<Meter> newAllMeters = Sets.newHashSet(allMeters);
+            newAllMeters.removeAll(addedMeters);
 
-            allMeters.forEach(m -> {
+            newAllMeters.forEach(m -> {
                 // FIXME: Installing a meter is meaningful for OpenFlow, but not for P4Runtime.
                 // It looks like this flow is used only for p4runtime to emulate the installation
                 // since meters are already instantiated - we need just modify the params.
                 if (m.state() == MeterState.PENDING_ADD && m.meterCellId().type() != MeterCellType.INDEX) {
                     // offload the task to avoid the overloading of the sb threads
+                    log.debug("Modify meter {} in device {}", m.id(), deviceId);
                     meterInstallers.execute(new MeterInstaller(m.deviceId(), m, MeterOperation.Type.MODIFY));
                 // Remove workflow. Regarding OpenFlow, meters have been removed from
                 // the device but they are still in the store, we will purge them definitely.
@@ -403,6 +413,7 @@
                 // for P4Runtime will avoid to send a remove op. Then, we reach this point
                 // and we purge the meter from the store
                 } else if (m.state() == MeterState.PENDING_REMOVE) {
+                    log.debug("Delete meter {} now in store", m.id());
                     store.deleteMeterNow(m);
                 }
             });