Ignore entries from constant tables in P4Runtime

Change-Id: I6ba8591a9674287832a18e258c5dd3801c588a32
(cherry picked from commit ba73da5bd09a6b40ab5727ef4a03767d437687e8)
diff --git a/drivers/p4runtime/src/main/java/org/onosproject/drivers/p4runtime/P4RuntimeFlowRuleProgrammable.java b/drivers/p4runtime/src/main/java/org/onosproject/drivers/p4runtime/P4RuntimeFlowRuleProgrammable.java
index d655132..5e3e155 100644
--- a/drivers/p4runtime/src/main/java/org/onosproject/drivers/p4runtime/P4RuntimeFlowRuleProgrammable.java
+++ b/drivers/p4runtime/src/main/java/org/onosproject/drivers/p4runtime/P4RuntimeFlowRuleProgrammable.java
@@ -16,11 +16,9 @@
 
 package org.onosproject.drivers.p4runtime;
 
-import com.google.common.cache.CacheBuilder;
-import com.google.common.cache.CacheLoader;
-import com.google.common.cache.LoadingCache;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Lists;
+import com.google.common.util.concurrent.Striped;
 import org.onlab.util.SharedExecutors;
 import org.onosproject.drivers.p4runtime.mirror.P4RuntimeTableMirror;
 import org.onosproject.drivers.p4runtime.mirror.TimedEntry;
@@ -46,9 +44,7 @@
 import java.util.Optional;
 import java.util.Set;
 import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.TimeUnit;
 import java.util.concurrent.locks.Lock;
-import java.util.concurrent.locks.ReentrantLock;
 import java.util.stream.Collectors;
 
 import static com.google.common.collect.Lists.newArrayList;
@@ -94,18 +90,9 @@
     // FIXME: set to true as soon as the feature is implemented in P4Runtime.
     private static final boolean DEFAULT_READ_ALL_DIRECT_COUNTERS = false;
 
-    private static final int TABLE_ENTRY_LOCK_EXPIRE_TIME_IN_MIN = 10;
-
     // Needed to synchronize operations over the same table entry.
-    private static final LoadingCache<PiTableEntryHandle, Lock>
-            ENTRY_LOCKS = CacheBuilder.newBuilder()
-            .expireAfterAccess(TABLE_ENTRY_LOCK_EXPIRE_TIME_IN_MIN, TimeUnit.MINUTES)
-            .build(new CacheLoader<PiTableEntryHandle, Lock>() {
-                @Override
-                public Lock load(PiTableEntryHandle handle) {
-                    return new ReentrantLock();
-                }
-            });
+    private static final Striped<Lock> ENTRY_LOCKS = Striped.lock(30);
+
     private PiPipelineModel pipelineModel;
     private P4RuntimeTableMirror tableMirror;
     private PiFlowRuleTranslator translator;
@@ -141,7 +128,11 @@
         // TODO: ONOS-7596 read counters with table entries
         final Collection<PiTableEntry> installedEntries = getFutureWithDeadline(
                 client.dumpAllTables(pipeconf), "dumping all tables",
-                Collections.emptyList());
+                Collections.emptyList())
+                // Filter out entries from constant table.
+                .stream()
+                .filter(e -> !tableIsConstant(e.table()))
+                .collect(Collectors.toList());
 
         if (installedEntries.isEmpty()) {
             return Collections.emptyList();
@@ -170,7 +161,7 @@
         }
 
         if (inconsistentEntries.size() > 0) {
-            // Async clean up inconsistent entries.
+            // Trigger clean up of inconsistent entries.
             SharedExecutors.getSingleThreadExecutor().execute(
                     () -> cleanUpInconsistentEntries(inconsistentEntries));
         }
@@ -261,14 +252,14 @@
                     .of(deviceId, piEntryToApply);
 
             // Serialize operations over the same match key/table/device ID.
-            ENTRY_LOCKS.getUnchecked(handle).lock();
+            ENTRY_LOCKS.get(handle).lock();
             try {
                 if (applyEntry(handle, piEntryToApply,
                                ruleToApply, driverOperation)) {
                     result.add(ruleToApply);
                 }
             } finally {
-                ENTRY_LOCKS.getUnchecked(handle).unlock();
+                ENTRY_LOCKS.get(handle).unlock();
             }
         }
 
@@ -398,6 +389,11 @@
                 !pipelineModel.table(tableId).get().counters().isEmpty();
     }
 
+    private boolean tableIsConstant(PiTableId tableId) {
+        return pipelineModel.table(tableId).isPresent() &&
+                pipelineModel.table(tableId).get().isConstantTable();
+    }
+
     enum Operation {
         APPLY, REMOVE
     }