blob: c9dd5df1b9cfaf8e5ede2a554200bd501e7871b2 [file] [log] [blame]
Aaron Kruglikov47047b22016-03-31 16:52:48 -07001/*
Brian O'Connora09fe5b2017-08-03 21:12:30 -07002 * Copyright 2016-present Open Networking Foundation
Aaron Kruglikov47047b22016-03-31 16:52:48 -07003 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package org.onosproject.store.primitives;
18
19import com.google.common.base.Throwables;
Aaron Kruglikov47047b22016-03-31 16:52:48 -070020import org.onosproject.store.service.AsyncConsistentTreeMap;
Ray Milkey6a51cb92018-03-06 09:03:03 -080021import org.onosproject.store.service.ConsistentMapException;
22import org.onosproject.store.service.ConsistentTreeMap;
Aaron Kruglikov47047b22016-03-31 16:52:48 -070023import org.onosproject.store.service.MapEventListener;
24import org.onosproject.store.service.Synchronous;
Aaron Kruglikov47047b22016-03-31 16:52:48 -070025import org.onosproject.store.service.Versioned;
26
27import java.util.Collection;
28import java.util.Map;
Aaron Kruglikov6a164352016-07-25 11:46:17 -070029import java.util.NavigableMap;
Aaron Kruglikov47047b22016-03-31 16:52:48 -070030import java.util.NavigableSet;
31import java.util.Set;
32import java.util.concurrent.CompletableFuture;
33import java.util.concurrent.ExecutionException;
Madan Jampani0463cf92016-05-04 14:46:08 -070034import java.util.concurrent.Executor;
Aaron Kruglikov47047b22016-03-31 16:52:48 -070035import java.util.concurrent.TimeUnit;
36import java.util.concurrent.TimeoutException;
37import java.util.function.BiFunction;
38import java.util.function.Function;
39import java.util.function.Predicate;
40
41/**
42 * Implementation of the {@link ConsistentTreeMap} interface.
43 */
Aaron Kruglikov6a164352016-07-25 11:46:17 -070044public class DefaultConsistentTreeMap<V>
45 extends Synchronous<AsyncConsistentTreeMap<V>>
46 implements ConsistentTreeMap<V> {
Aaron Kruglikov6a164352016-07-25 11:46:17 -070047 private final AsyncConsistentTreeMap<V> treeMap;
Aaron Kruglikov47047b22016-03-31 16:52:48 -070048 private final long operationTimeoutMillis;
Aaron Kruglikov6a164352016-07-25 11:46:17 -070049 private Map<String, V> javaMap;
Aaron Kruglikov47047b22016-03-31 16:52:48 -070050
Aaron Kruglikov6a164352016-07-25 11:46:17 -070051 public DefaultConsistentTreeMap(AsyncConsistentTreeMap<V> treeMap,
52 long operationTimeoutMillis) {
Aaron Kruglikov47047b22016-03-31 16:52:48 -070053 super(treeMap);
54 this.treeMap = treeMap;
55 this.operationTimeoutMillis = operationTimeoutMillis;
56 }
57
58 private <T> T complete(CompletableFuture<T> future) {
59 try {
60 return future.get(operationTimeoutMillis, TimeUnit.MILLISECONDS);
61 } catch (InterruptedException e) {
62 Thread.currentThread().interrupt();
63 throw new ConsistentMapException.Interrupted();
64 } catch (ExecutionException e) {
Ray Milkey6a51cb92018-03-06 09:03:03 -080065 Throwables.throwIfUnchecked(e.getCause());
Aaron Kruglikov47047b22016-03-31 16:52:48 -070066 throw new ConsistentMapException(e.getCause());
Yuta HIGUCHIf13b3df2016-07-25 12:13:22 -070067 } catch (TimeoutException e) {
68 throw new ConsistentMapException.Timeout();
Aaron Kruglikov47047b22016-03-31 16:52:48 -070069 }
70 }
71
72 @Override
Aaron Kruglikov6a164352016-07-25 11:46:17 -070073 public String firstKey() {
Aaron Kruglikov47047b22016-03-31 16:52:48 -070074 return complete(treeMap.firstKey());
75 }
76
77 @Override
Aaron Kruglikov6a164352016-07-25 11:46:17 -070078 public String lastKey() {
Aaron Kruglikov47047b22016-03-31 16:52:48 -070079 return complete(treeMap.lastKey());
80 }
81
82 @Override
Aaron Kruglikov6a164352016-07-25 11:46:17 -070083 public Map.Entry<String, Versioned<V>> ceilingEntry(String key) {
Aaron Kruglikov47047b22016-03-31 16:52:48 -070084 return complete(treeMap.ceilingEntry(key));
85 }
86
87 @Override
Aaron Kruglikov6a164352016-07-25 11:46:17 -070088 public Map.Entry<String, Versioned<V>> floorEntry(String key) {
Aaron Kruglikov47047b22016-03-31 16:52:48 -070089 return complete(treeMap.floorEntry(key));
90 }
91
92 @Override
Aaron Kruglikov6a164352016-07-25 11:46:17 -070093 public Map.Entry<String, Versioned<V>> higherEntry(String key) {
Aaron Kruglikov47047b22016-03-31 16:52:48 -070094 return complete(treeMap.higherEntry(key));
95 }
96
97 @Override
Aaron Kruglikov6a164352016-07-25 11:46:17 -070098 public Map.Entry<String, Versioned<V>> lowerEntry(String key) {
Aaron Kruglikov47047b22016-03-31 16:52:48 -070099 return complete(treeMap.lowerEntry(key));
100 }
101
102 @Override
Aaron Kruglikov6a164352016-07-25 11:46:17 -0700103 public Map.Entry<String, Versioned<V>> firstEntry() {
Aaron Kruglikov47047b22016-03-31 16:52:48 -0700104 return complete(treeMap.firstEntry());
105 }
106
107 @Override
Aaron Kruglikov6a164352016-07-25 11:46:17 -0700108 public Map.Entry<String, Versioned<V>> lastEntry() {
Aaron Kruglikov47047b22016-03-31 16:52:48 -0700109 return complete(treeMap.lastEntry());
110 }
111
112 @Override
Aaron Kruglikov6a164352016-07-25 11:46:17 -0700113 public Map.Entry<String, Versioned<V>> pollFirstEntry() {
Aaron Kruglikov47047b22016-03-31 16:52:48 -0700114 return complete(treeMap.pollFirstEntry());
115 }
116
117 @Override
Aaron Kruglikov6a164352016-07-25 11:46:17 -0700118 public Map.Entry<String, Versioned<V>> pollLastEntry() {
Aaron Kruglikov47047b22016-03-31 16:52:48 -0700119 return complete(treeMap.pollLastEntry());
120 }
121
122 @Override
Aaron Kruglikov6a164352016-07-25 11:46:17 -0700123 public String lowerKey(String key) {
Aaron Kruglikov47047b22016-03-31 16:52:48 -0700124 return complete(treeMap.lowerKey(key));
125 }
126
127 @Override
Aaron Kruglikov6a164352016-07-25 11:46:17 -0700128 public String floorKey(String key) {
Aaron Kruglikov47047b22016-03-31 16:52:48 -0700129 return complete(treeMap.floorKey(key));
130 }
131
132 @Override
Aaron Kruglikov6a164352016-07-25 11:46:17 -0700133 public String ceilingKey(String key) {
Aaron Kruglikov47047b22016-03-31 16:52:48 -0700134 return complete(treeMap.ceilingKey(key));
135 }
136
137 @Override
Aaron Kruglikov6a164352016-07-25 11:46:17 -0700138 public String higherKey(String key) {
Aaron Kruglikov47047b22016-03-31 16:52:48 -0700139 return complete(treeMap.higherKey(key));
140 }
141
142
143 @Override
144 /**
145 * {@inheritDoc}
146 * <p>This may be a long operation with greater risk of timeout.</p>
147 */
Aaron Kruglikov6a164352016-07-25 11:46:17 -0700148 public NavigableSet<String> navigableKeySet() {
Aaron Kruglikov47047b22016-03-31 16:52:48 -0700149 return complete(treeMap.navigableKeySet());
150 }
151
152 @Override
153 public int size() {
154 return complete(treeMap.size());
155 }
156
157 @Override
158 public boolean isEmpty() {
159 return complete(treeMap.isEmpty());
160 }
161
162 @Override
Aaron Kruglikov6a164352016-07-25 11:46:17 -0700163 public boolean containsKey(String key) {
Aaron Kruglikov47047b22016-03-31 16:52:48 -0700164 return complete(treeMap.containsKey(key));
165 }
166
167 @Override
168 public boolean containsValue(V value) {
169 return complete(treeMap.containsValue(value));
170 }
171
172 @Override
Aaron Kruglikov6a164352016-07-25 11:46:17 -0700173 public Versioned<V> get(String key) {
Aaron Kruglikov47047b22016-03-31 16:52:48 -0700174 return complete(treeMap.get(key));
175 }
176
177 @Override
Jordan Haltermanf6272442017-04-20 02:18:08 -0700178 public Versioned<V> getOrDefault(String key, V defaultValue) {
179 return complete(treeMap.getOrDefault(key, defaultValue));
180 }
181
182 @Override
Aaron Kruglikov6a164352016-07-25 11:46:17 -0700183 public Versioned<V> computeIfAbsent(String key,
184 Function<? super String,
185 ? extends V> mappingFunction) {
Aaron Kruglikov47047b22016-03-31 16:52:48 -0700186 return complete(treeMap.computeIfAbsent(key, mappingFunction));
187 }
188
189 @Override
Aaron Kruglikov6a164352016-07-25 11:46:17 -0700190 public Versioned<V> compute(String key,
191 BiFunction<? super String,
192 ? super V,
193 ? extends V> remappingFunction) {
Aaron Kruglikov47047b22016-03-31 16:52:48 -0700194 return complete(treeMap.compute(key, remappingFunction));
195 }
196
197 @Override
Aaron Kruglikov6a164352016-07-25 11:46:17 -0700198 public Versioned<V> computeIfPresent(
199 String key,
200 BiFunction<? super String,
201 ? super V,
202 ? extends V> remappingFunction) {
Aaron Kruglikov47047b22016-03-31 16:52:48 -0700203 return complete(treeMap.computeIfPresent(key, remappingFunction));
204 }
205
206 @Override
Aaron Kruglikov6a164352016-07-25 11:46:17 -0700207 public Versioned<V> computeIf(String key, Predicate<? super V> condition,
208 BiFunction<? super String,
209 ? super V,
210 ? extends V> remappingFunction) {
Aaron Kruglikov47047b22016-03-31 16:52:48 -0700211 return complete(treeMap.computeIf(key, condition, remappingFunction));
212 }
213
214 @Override
Aaron Kruglikov6a164352016-07-25 11:46:17 -0700215 public Versioned<V> put(String key, V value) {
Aaron Kruglikov47047b22016-03-31 16:52:48 -0700216 return complete(treeMap.put(key, value));
217 }
218
219 @Override
Aaron Kruglikov6a164352016-07-25 11:46:17 -0700220 public Versioned<V> putAndGet(String key, V value) {
Aaron Kruglikov47047b22016-03-31 16:52:48 -0700221 return complete(treeMap.putAndGet(key, value));
222 }
223
224 @Override
Aaron Kruglikov6a164352016-07-25 11:46:17 -0700225 public Versioned<V> remove(String key) {
Aaron Kruglikov47047b22016-03-31 16:52:48 -0700226 return complete(treeMap.remove(key));
227 }
228
229 @Override
230 public void clear() {
231 complete(treeMap.clear());
232 }
233
234 @Override
Aaron Kruglikov6a164352016-07-25 11:46:17 -0700235 public Set<String> keySet() {
Aaron Kruglikov47047b22016-03-31 16:52:48 -0700236 return complete(treeMap.keySet());
237 }
238
239 @Override
240 public Collection<Versioned<V>> values() {
241 return complete(treeMap.values());
242 }
243
244 @Override
Aaron Kruglikov6a164352016-07-25 11:46:17 -0700245 public Set<Map.Entry<String, Versioned<V>>> entrySet() {
Aaron Kruglikov47047b22016-03-31 16:52:48 -0700246 return complete(treeMap.entrySet());
247 }
248
249 @Override
Aaron Kruglikov6a164352016-07-25 11:46:17 -0700250 public Versioned<V> putIfAbsent(String key, V value) {
Aaron Kruglikov47047b22016-03-31 16:52:48 -0700251 return complete(treeMap.putIfAbsent(key, value));
252 }
253
254 @Override
Aaron Kruglikov6a164352016-07-25 11:46:17 -0700255 public boolean remove(String key, V value) {
Aaron Kruglikov47047b22016-03-31 16:52:48 -0700256 return complete(treeMap.remove(key, value));
257 }
258
259 @Override
Aaron Kruglikov6a164352016-07-25 11:46:17 -0700260 public boolean remove(String key, long version) {
Aaron Kruglikov47047b22016-03-31 16:52:48 -0700261 return complete(treeMap.remove(key, version));
262 }
263
264 @Override
Aaron Kruglikov6a164352016-07-25 11:46:17 -0700265 public Versioned<V> replace(String key, V value) {
Aaron Kruglikov47047b22016-03-31 16:52:48 -0700266 return complete(treeMap.replace(key, value));
267 }
268
269 @Override
Aaron Kruglikov6a164352016-07-25 11:46:17 -0700270 public boolean replace(String key, V oldValue, V newValue) {
Aaron Kruglikov47047b22016-03-31 16:52:48 -0700271 return complete(treeMap.replace(key, oldValue, newValue));
272 }
273
274 @Override
Aaron Kruglikov6a164352016-07-25 11:46:17 -0700275 public boolean replace(String key, long oldVersion, V newValue) {
Aaron Kruglikov47047b22016-03-31 16:52:48 -0700276 return complete(treeMap.replace(key, oldVersion, newValue));
277 }
278
279 @Override
Aaron Kruglikov6a164352016-07-25 11:46:17 -0700280 public void addListener(MapEventListener<String, V> listener,
281 Executor executor) {
Madan Jampani0463cf92016-05-04 14:46:08 -0700282 complete(treeMap.addListener(listener, executor));
Aaron Kruglikov47047b22016-03-31 16:52:48 -0700283 }
284
285 @Override
Aaron Kruglikov6a164352016-07-25 11:46:17 -0700286 public void removeListener(MapEventListener<String, V> listener) {
Aaron Kruglikov47047b22016-03-31 16:52:48 -0700287 complete(treeMap.removeListener(listener));
288 }
289
290 @Override
Aaron Kruglikov6a164352016-07-25 11:46:17 -0700291 public Map<String, V> asJavaMap() {
Aaron Kruglikov47047b22016-03-31 16:52:48 -0700292 synchronized (this) {
293 if (javaMap == null) {
294 javaMap = new ConsistentMapBackedJavaMap<>(this);
295 }
296 }
297 return javaMap;
298 }
Aaron Kruglikov6a164352016-07-25 11:46:17 -0700299
300 @Override
301 public NavigableMap<String, V> subMap(String upperKey,
302 String lowerKey,
303 boolean inclusiveUpper,
304 boolean inclusiveLower) {
305 return complete(treeMap.subMap(upperKey, lowerKey,
306 inclusiveUpper, inclusiveLower));
307 }
Aaron Kruglikov47047b22016-03-31 16:52:48 -0700308}