Committed by
Gerrit Code Review
Adding an option for persistent flow storage.
Change-Id: I1dd70c9f2ea9cd99ef5a55eaa4b54968f7d3c55f
Showing
1 changed file
with
28 additions
and
1 deletions
... | @@ -59,6 +59,7 @@ import org.onosproject.net.flow.FlowRuleStore; | ... | @@ -59,6 +59,7 @@ import org.onosproject.net.flow.FlowRuleStore; |
59 | import org.onosproject.net.flow.FlowRuleStoreDelegate; | 59 | import org.onosproject.net.flow.FlowRuleStoreDelegate; |
60 | import org.onosproject.net.flow.StoredFlowEntry; | 60 | import org.onosproject.net.flow.StoredFlowEntry; |
61 | import org.onosproject.net.flow.TableStatisticsEntry; | 61 | import org.onosproject.net.flow.TableStatisticsEntry; |
62 | +import org.onosproject.persistence.PersistenceService; | ||
62 | import org.onosproject.store.AbstractStore; | 63 | import org.onosproject.store.AbstractStore; |
63 | import org.onosproject.store.cluster.messaging.ClusterCommunicationService; | 64 | import org.onosproject.store.cluster.messaging.ClusterCommunicationService; |
64 | import org.onosproject.store.cluster.messaging.ClusterMessage; | 65 | import org.onosproject.store.cluster.messaging.ClusterMessage; |
... | @@ -74,6 +75,7 @@ import org.onosproject.store.serializers.custom.DistributedStoreSerializers; | ... | @@ -74,6 +75,7 @@ import org.onosproject.store.serializers.custom.DistributedStoreSerializers; |
74 | import org.onosproject.store.service.EventuallyConsistentMap; | 75 | import org.onosproject.store.service.EventuallyConsistentMap; |
75 | import org.onosproject.store.service.EventuallyConsistentMapEvent; | 76 | import org.onosproject.store.service.EventuallyConsistentMapEvent; |
76 | import org.onosproject.store.service.EventuallyConsistentMapListener; | 77 | import org.onosproject.store.service.EventuallyConsistentMapListener; |
78 | +import org.onosproject.store.service.Serializer; | ||
77 | import org.onosproject.store.service.StorageService; | 79 | import org.onosproject.store.service.StorageService; |
78 | import org.onosproject.store.service.WallClockTimestamp; | 80 | import org.onosproject.store.service.WallClockTimestamp; |
79 | import org.osgi.service.component.ComponentContext; | 81 | import org.osgi.service.component.ComponentContext; |
... | @@ -113,6 +115,7 @@ public class NewDistributedFlowRuleStore | ... | @@ -113,6 +115,7 @@ public class NewDistributedFlowRuleStore |
113 | 115 | ||
114 | private static final int MESSAGE_HANDLER_THREAD_POOL_SIZE = 8; | 116 | private static final int MESSAGE_HANDLER_THREAD_POOL_SIZE = 8; |
115 | private static final boolean DEFAULT_BACKUP_ENABLED = true; | 117 | private static final boolean DEFAULT_BACKUP_ENABLED = true; |
118 | + private static final boolean DEFAULT_PERSISTENCE_ENABLED = false; | ||
116 | private static final int DEFAULT_BACKUP_PERIOD_MILLIS = 2000; | 119 | private static final int DEFAULT_BACKUP_PERIOD_MILLIS = 2000; |
117 | private static final long FLOW_RULE_STORE_TIMEOUT_MILLIS = 5000; | 120 | private static final long FLOW_RULE_STORE_TIMEOUT_MILLIS = 5000; |
118 | // number of devices whose flow entries will be backed up in one communication round | 121 | // number of devices whose flow entries will be backed up in one communication round |
... | @@ -129,6 +132,9 @@ public class NewDistributedFlowRuleStore | ... | @@ -129,6 +132,9 @@ public class NewDistributedFlowRuleStore |
129 | @Property(name = "backupPeriod", intValue = DEFAULT_BACKUP_PERIOD_MILLIS, | 132 | @Property(name = "backupPeriod", intValue = DEFAULT_BACKUP_PERIOD_MILLIS, |
130 | label = "Delay in ms between successive backup runs") | 133 | label = "Delay in ms between successive backup runs") |
131 | private int backupPeriod = DEFAULT_BACKUP_PERIOD_MILLIS; | 134 | private int backupPeriod = DEFAULT_BACKUP_PERIOD_MILLIS; |
135 | + @Property(name = "persistenceEnabled", boolValue = false, | ||
136 | + label = "Indicates whether or not changes in the flow table should be persisted to disk.") | ||
137 | + private boolean persistenceEnabled = DEFAULT_PERSISTENCE_ENABLED; | ||
132 | 138 | ||
133 | private InternalFlowTable flowTable = new InternalFlowTable(); | 139 | private InternalFlowTable flowTable = new InternalFlowTable(); |
134 | 140 | ||
... | @@ -153,6 +159,9 @@ public class NewDistributedFlowRuleStore | ... | @@ -153,6 +159,9 @@ public class NewDistributedFlowRuleStore |
153 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) | 159 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) |
154 | protected MastershipService mastershipService; | 160 | protected MastershipService mastershipService; |
155 | 161 | ||
162 | + @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) | ||
163 | + protected PersistenceService persistenceService; | ||
164 | + | ||
156 | private Map<Long, NodeId> pendingResponses = Maps.newConcurrentMap(); | 165 | private Map<Long, NodeId> pendingResponses = Maps.newConcurrentMap(); |
157 | private ExecutorService messageHandlingExecutor; | 166 | private ExecutorService messageHandlingExecutor; |
158 | 167 | ||
... | @@ -716,7 +725,25 @@ public class NewDistributedFlowRuleStore | ... | @@ -716,7 +725,25 @@ public class NewDistributedFlowRuleStore |
716 | * @return Map representing Flow Table of given device. | 725 | * @return Map representing Flow Table of given device. |
717 | */ | 726 | */ |
718 | private Map<FlowId, Set<StoredFlowEntry>> getFlowTable(DeviceId deviceId) { | 727 | private Map<FlowId, Set<StoredFlowEntry>> getFlowTable(DeviceId deviceId) { |
719 | - return flowEntries.computeIfAbsent(deviceId, id -> Maps.newConcurrentMap()); | 728 | + if (persistenceEnabled) { |
729 | + return flowEntries.computeIfAbsent(deviceId, id -> persistenceService | ||
730 | + .<FlowId, Set<StoredFlowEntry>>persistentMapBuilder() | ||
731 | + .withName("FlowTable:" + deviceId.toString()) | ||
732 | + .withSerializer(new Serializer() { | ||
733 | + @Override | ||
734 | + public <T> byte[] encode(T object) { | ||
735 | + return SERIALIZER.encode(object); | ||
736 | + } | ||
737 | + | ||
738 | + @Override | ||
739 | + public <T> T decode(byte[] bytes) { | ||
740 | + return SERIALIZER.decode(bytes); | ||
741 | + } | ||
742 | + }) | ||
743 | + .build()); | ||
744 | + } else { | ||
745 | + return flowEntries.computeIfAbsent(deviceId, id -> Maps.newConcurrentMap()); | ||
746 | + } | ||
720 | } | 747 | } |
721 | 748 | ||
722 | private Set<StoredFlowEntry> getFlowEntriesInternal(DeviceId deviceId, FlowId flowId) { | 749 | private Set<StoredFlowEntry> getFlowEntriesInternal(DeviceId deviceId, FlowId flowId) { | ... | ... |
-
Please register or login to post a comment