Committed by
Gerrit Code Review
Default ConsistentMap consistency level to SEQUENTIAL and reenable all Atomix unit tests
Change-Id: Ic04ff81fbaaa7c007f20077391a72fdfa9fd382a
Showing
6 changed files
with
63 additions
and
69 deletions
... | @@ -236,12 +236,9 @@ public class AtomixConsistentMap extends Resource<AtomixConsistentMap> | ... | @@ -236,12 +236,9 @@ public class AtomixConsistentMap extends Resource<AtomixConsistentMap> |
236 | @Override | 236 | @Override |
237 | public synchronized CompletableFuture<Void> addListener(MapEventListener<String, byte[]> listener) { | 237 | public synchronized CompletableFuture<Void> addListener(MapEventListener<String, byte[]> listener) { |
238 | if (!mapEventListeners.isEmpty()) { | 238 | if (!mapEventListeners.isEmpty()) { |
239 | - if (mapEventListeners.add(listener)) { | 239 | + mapEventListeners.add(listener); |
240 | - return CompletableFuture.completedFuture(new ChangeListener(listener)).thenApply(v -> null); | ||
241 | - } else { | ||
242 | return CompletableFuture.completedFuture(null); | 240 | return CompletableFuture.completedFuture(null); |
243 | } | 241 | } |
244 | - } | ||
245 | mapEventListeners.add(listener); | 242 | mapEventListeners.add(listener); |
246 | return submit(new AtomixConsistentMapCommands.Listen()).thenApply(v -> null); | 243 | return submit(new AtomixConsistentMapCommands.Listen()).thenApply(v -> null); |
247 | } | 244 | } | ... | ... |
... | @@ -52,7 +52,7 @@ public final class AtomixConsistentMapCommands { | ... | @@ -52,7 +52,7 @@ public final class AtomixConsistentMapCommands { |
52 | 52 | ||
53 | @Override | 53 | @Override |
54 | public ConsistencyLevel consistency() { | 54 | public ConsistencyLevel consistency() { |
55 | - return ConsistencyLevel.LINEARIZABLE; | 55 | + return ConsistencyLevel.SEQUENTIAL; |
56 | } | 56 | } |
57 | 57 | ||
58 | @Override | 58 | @Override |
... | @@ -78,7 +78,7 @@ public final class AtomixConsistentMapCommands { | ... | @@ -78,7 +78,7 @@ public final class AtomixConsistentMapCommands { |
78 | 78 | ||
79 | @Override | 79 | @Override |
80 | public ConsistencyLevel consistency() { | 80 | public ConsistencyLevel consistency() { |
81 | - return ConsistencyLevel.BOUNDED_LINEARIZABLE; | 81 | + return ConsistencyLevel.SEQUENTIAL; |
82 | } | 82 | } |
83 | 83 | ||
84 | @Override | 84 | @Override | ... | ... |
... | @@ -337,10 +337,9 @@ public class AtomixConsistentMapState extends ResourceStateMachine implements Se | ... | @@ -337,10 +337,9 @@ public class AtomixConsistentMapState extends ResourceStateMachine implements Se |
337 | * | 337 | * |
338 | * @param commit unlisten commit | 338 | * @param commit unlisten commit |
339 | */ | 339 | */ |
340 | - protected void unlisten( | 340 | + protected void unlisten(Commit<? extends Unlisten> commit) { |
341 | - Commit<? extends Unlisten> commit) { | ||
342 | try { | 341 | try { |
343 | - Commit<? extends Listen> listener = listeners.remove(commit.session()); | 342 | + Commit<? extends Listen> listener = listeners.remove(commit.session().id()); |
344 | if (listener != null) { | 343 | if (listener != null) { |
345 | listener.close(); | 344 | listener.close(); |
346 | } | 345 | } | ... | ... |
... | @@ -21,10 +21,11 @@ import static org.junit.Assert.*; | ... | @@ -21,10 +21,11 @@ import static org.junit.Assert.*; |
21 | import java.util.Arrays; | 21 | import java.util.Arrays; |
22 | import java.util.ConcurrentModificationException; | 22 | import java.util.ConcurrentModificationException; |
23 | import java.util.List; | 23 | import java.util.List; |
24 | +import java.util.concurrent.ArrayBlockingQueue; | ||
25 | +import java.util.concurrent.BlockingQueue; | ||
24 | import java.util.concurrent.CompletionException; | 26 | import java.util.concurrent.CompletionException; |
25 | import java.util.stream.Collectors; | 27 | import java.util.stream.Collectors; |
26 | 28 | ||
27 | -import org.junit.Ignore; | ||
28 | import org.junit.Test; | 29 | import org.junit.Test; |
29 | import org.onlab.util.Tools; | 30 | import org.onlab.util.Tools; |
30 | import org.onosproject.store.primitives.MapUpdate; | 31 | import org.onosproject.store.primitives.MapUpdate; |
... | @@ -34,12 +35,12 @@ import org.onosproject.store.service.MapEventListener; | ... | @@ -34,12 +35,12 @@ import org.onosproject.store.service.MapEventListener; |
34 | import org.onosproject.store.service.MapTransaction; | 35 | import org.onosproject.store.service.MapTransaction; |
35 | import org.onosproject.store.service.Versioned; | 36 | import org.onosproject.store.service.Versioned; |
36 | 37 | ||
38 | +import com.google.common.base.Throwables; | ||
37 | import com.google.common.collect.Sets; | 39 | import com.google.common.collect.Sets; |
38 | 40 | ||
39 | /** | 41 | /** |
40 | * Unit tests for {@link AtomixConsistentMap}. | 42 | * Unit tests for {@link AtomixConsistentMap}. |
41 | */ | 43 | */ |
42 | -@Ignore | ||
43 | public class AtomixConsistentMapTest extends AtomixTestBase { | 44 | public class AtomixConsistentMapTest extends AtomixTestBase { |
44 | 45 | ||
45 | @Override | 46 | @Override |
... | @@ -285,55 +286,52 @@ public class AtomixConsistentMapTest extends AtomixTestBase { | ... | @@ -285,55 +286,52 @@ public class AtomixConsistentMapTest extends AtomixTestBase { |
285 | TestMapEventListener listener = new TestMapEventListener(); | 286 | TestMapEventListener listener = new TestMapEventListener(); |
286 | 287 | ||
287 | // add listener; insert new value into map and verify an INSERT event is received. | 288 | // add listener; insert new value into map and verify an INSERT event is received. |
288 | - map.addListener(listener).join(); | 289 | + map.addListener(listener).thenCompose(v -> map.put("foo", value1)).join(); |
289 | - map.put("foo", value1).join(); | 290 | + MapEvent<String, byte[]> event = listener.event(); |
290 | - assertNotNull(listener.event()); | 291 | + assertNotNull(event); |
291 | - assertEquals(MapEvent.Type.INSERT, listener.event().type()); | 292 | + assertEquals(MapEvent.Type.INSERT, event.type()); |
292 | - assertTrue(Arrays.equals(value1, listener.event().newValue().value())); | 293 | + assertTrue(Arrays.equals(value1, event.newValue().value())); |
293 | - listener.clearEvent(); | ||
294 | 294 | ||
295 | // remove listener and verify listener is not notified. | 295 | // remove listener and verify listener is not notified. |
296 | - map.removeListener(listener).join(); | 296 | + map.removeListener(listener).thenCompose(v -> map.put("foo", value2)).join(); |
297 | - map.put("foo", value2).join(); | 297 | + assertFalse(listener.eventReceived()); |
298 | - assertNull(listener.event()); | ||
299 | 298 | ||
300 | // add the listener back and verify UPDATE events are received correctly | 299 | // add the listener back and verify UPDATE events are received correctly |
301 | - map.addListener(listener).join(); | 300 | + map.addListener(listener).thenCompose(v -> map.put("foo", value3)).join(); |
302 | - map.put("foo", value3).join(); | 301 | + event = listener.event(); |
303 | - assertNotNull(listener.event()); | 302 | + assertNotNull(event); |
304 | - assertEquals(MapEvent.Type.UPDATE, listener.event().type()); | 303 | + assertEquals(MapEvent.Type.UPDATE, event.type()); |
305 | - assertTrue(Arrays.equals(value3, listener.event().newValue().value())); | 304 | + assertTrue(Arrays.equals(value3, event.newValue().value())); |
306 | - listener.clearEvent(); | ||
307 | 305 | ||
308 | // perform a non-state changing operation and verify no events are received. | 306 | // perform a non-state changing operation and verify no events are received. |
309 | map.putIfAbsent("foo", value1).join(); | 307 | map.putIfAbsent("foo", value1).join(); |
310 | - assertNull(listener.event()); | 308 | + assertFalse(listener.eventReceived()); |
311 | 309 | ||
312 | // verify REMOVE events are received correctly. | 310 | // verify REMOVE events are received correctly. |
313 | map.remove("foo").join(); | 311 | map.remove("foo").join(); |
314 | - assertNotNull(listener.event()); | 312 | + event = listener.event(); |
315 | - assertEquals(MapEvent.Type.REMOVE, listener.event().type()); | 313 | + assertNotNull(event); |
316 | - assertTrue(Arrays.equals(value3, listener.event().oldValue().value())); | 314 | + assertEquals(MapEvent.Type.REMOVE, event.type()); |
317 | - listener.clearEvent(); | 315 | + assertTrue(Arrays.equals(value3, event.oldValue().value())); |
318 | 316 | ||
319 | // verify compute methods also generate events. | 317 | // verify compute methods also generate events. |
320 | map.computeIf("foo", v -> v == null, (k, v) -> value1).join(); | 318 | map.computeIf("foo", v -> v == null, (k, v) -> value1).join(); |
321 | - assertNotNull(listener.event()); | 319 | + event = listener.event(); |
322 | - assertEquals(MapEvent.Type.INSERT, listener.event().type()); | 320 | + assertNotNull(event); |
323 | - assertTrue(Arrays.equals(value1, listener.event().newValue().value())); | 321 | + assertEquals(MapEvent.Type.INSERT, event.type()); |
324 | - listener.clearEvent(); | 322 | + assertTrue(Arrays.equals(value1, event.newValue().value())); |
325 | 323 | ||
326 | map.compute("foo", (k, v) -> value2).join(); | 324 | map.compute("foo", (k, v) -> value2).join(); |
327 | - assertNotNull(listener.event()); | 325 | + event = listener.event(); |
328 | - assertEquals(MapEvent.Type.UPDATE, listener.event().type()); | 326 | + assertNotNull(event); |
329 | - assertTrue(Arrays.equals(value2, listener.event().newValue().value())); | 327 | + assertEquals(MapEvent.Type.UPDATE, event.type()); |
330 | - listener.clearEvent(); | 328 | + assertTrue(Arrays.equals(value2, event.newValue().value())); |
331 | 329 | ||
332 | map.computeIf("foo", v -> Arrays.equals(v, value2), (k, v) -> null).join(); | 330 | map.computeIf("foo", v -> Arrays.equals(v, value2), (k, v) -> null).join(); |
333 | - assertNotNull(listener.event()); | 331 | + event = listener.event(); |
334 | - assertEquals(MapEvent.Type.REMOVE, listener.event().type()); | 332 | + assertNotNull(event); |
335 | - assertTrue(Arrays.equals(value2, listener.event().oldValue().value())); | 333 | + assertEquals(MapEvent.Type.REMOVE, event.type()); |
336 | - listener.clearEvent(); | 334 | + assertTrue(Arrays.equals(value2, event.oldValue().value())); |
337 | 335 | ||
338 | map.removeListener(listener).join(); | 336 | map.removeListener(listener).join(); |
339 | } | 337 | } |
... | @@ -359,7 +357,7 @@ public class AtomixConsistentMapTest extends AtomixTestBase { | ... | @@ -359,7 +357,7 @@ public class AtomixConsistentMapTest extends AtomixTestBase { |
359 | map.prepare(tx).thenAccept(result -> { | 357 | map.prepare(tx).thenAccept(result -> { |
360 | assertEquals(true, result); | 358 | assertEquals(true, result); |
361 | }).join(); | 359 | }).join(); |
362 | - assertNull(listener.event()); | 360 | + assertFalse(listener.eventReceived()); |
363 | 361 | ||
364 | map.size().thenAccept(result -> { | 362 | map.size().thenAccept(result -> { |
365 | assertTrue(result == 0); | 363 | assertTrue(result == 0); |
... | @@ -376,21 +374,21 @@ public class AtomixConsistentMapTest extends AtomixTestBase { | ... | @@ -376,21 +374,21 @@ public class AtomixConsistentMapTest extends AtomixTestBase { |
376 | assertEquals(ConcurrentModificationException.class, e.getCause().getClass()); | 374 | assertEquals(ConcurrentModificationException.class, e.getCause().getClass()); |
377 | } | 375 | } |
378 | 376 | ||
379 | - assertNull(listener.event()); | 377 | + assertFalse(listener.eventReceived()); |
380 | 378 | ||
381 | map.commit(tx.transactionId()).join(); | 379 | map.commit(tx.transactionId()).join(); |
382 | - assertNotNull(listener.event()); | 380 | + MapEvent<String, byte[]> event = listener.event(); |
383 | - assertEquals(MapEvent.Type.INSERT, listener.event().type()); | 381 | + assertNotNull(event); |
384 | - assertTrue(Arrays.equals(value1, listener.event().newValue().value())); | 382 | + assertEquals(MapEvent.Type.INSERT, event.type()); |
385 | - listener.clearEvent(); | 383 | + assertTrue(Arrays.equals(value1, event.newValue().value())); |
386 | 384 | ||
387 | map.put("foo", value2).thenAccept(result -> { | 385 | map.put("foo", value2).thenAccept(result -> { |
388 | assertTrue(Arrays.equals(Versioned.valueOrElse(result, null), value1)); | 386 | assertTrue(Arrays.equals(Versioned.valueOrElse(result, null), value1)); |
389 | }).join(); | 387 | }).join(); |
390 | - assertNotNull(listener.event()); | 388 | + event = listener.event(); |
391 | - assertEquals(MapEvent.Type.UPDATE, listener.event().type()); | 389 | + assertNotNull(event); |
392 | - assertTrue(Arrays.equals(value2, listener.event().newValue().value())); | 390 | + assertEquals(MapEvent.Type.UPDATE, event.type()); |
393 | - listener.clearEvent(); | 391 | + assertTrue(Arrays.equals(value2, event.newValue().value())); |
394 | } | 392 | } |
395 | 393 | ||
396 | protected void transactionRollbackTests(int clusterSize) throws Throwable { | 394 | protected void transactionRollbackTests(int clusterSize) throws Throwable { |
... | @@ -412,10 +410,10 @@ public class AtomixConsistentMapTest extends AtomixTestBase { | ... | @@ -412,10 +410,10 @@ public class AtomixConsistentMapTest extends AtomixTestBase { |
412 | map.prepare(tx).thenAccept(result -> { | 410 | map.prepare(tx).thenAccept(result -> { |
413 | assertEquals(true, result); | 411 | assertEquals(true, result); |
414 | }).join(); | 412 | }).join(); |
415 | - assertNull(listener.event()); | 413 | + assertFalse(listener.eventReceived()); |
416 | 414 | ||
417 | map.rollback(tx.transactionId()).join(); | 415 | map.rollback(tx.transactionId()).join(); |
418 | - assertNull(listener.event()); | 416 | + assertFalse(listener.eventReceived()); |
419 | 417 | ||
420 | map.get("foo").thenAccept(result -> { | 418 | map.get("foo").thenAccept(result -> { |
421 | assertNull(result); | 419 | assertNull(result); |
... | @@ -424,27 +422,31 @@ public class AtomixConsistentMapTest extends AtomixTestBase { | ... | @@ -424,27 +422,31 @@ public class AtomixConsistentMapTest extends AtomixTestBase { |
424 | map.put("foo", value2).thenAccept(result -> { | 422 | map.put("foo", value2).thenAccept(result -> { |
425 | assertNull(result); | 423 | assertNull(result); |
426 | }).join(); | 424 | }).join(); |
427 | - assertNotNull(listener.event()); | 425 | + MapEvent<String, byte[]> event = listener.event(); |
428 | - assertEquals(MapEvent.Type.INSERT, listener.event().type()); | 426 | + assertNotNull(event); |
429 | - assertTrue(Arrays.equals(value2, listener.event().newValue().value())); | 427 | + assertEquals(MapEvent.Type.INSERT, event.type()); |
430 | - listener.clearEvent(); | 428 | + assertTrue(Arrays.equals(value2, event.newValue().value())); |
431 | } | 429 | } |
432 | 430 | ||
433 | private static class TestMapEventListener implements MapEventListener<String, byte[]> { | 431 | private static class TestMapEventListener implements MapEventListener<String, byte[]> { |
434 | 432 | ||
435 | - MapEvent<String, byte[]> event; | 433 | + private final BlockingQueue<MapEvent<String, byte[]>> queue = new ArrayBlockingQueue<>(1); |
436 | 434 | ||
437 | @Override | 435 | @Override |
438 | public void event(MapEvent<String, byte[]> event) { | 436 | public void event(MapEvent<String, byte[]> event) { |
439 | - this.event = event; | 437 | + try { |
438 | + queue.put(event); | ||
439 | + } catch (InterruptedException e) { | ||
440 | + Throwables.propagate(e); | ||
441 | + } | ||
440 | } | 442 | } |
441 | 443 | ||
442 | - public MapEvent<String, byte[]> event() { | 444 | + public boolean eventReceived() { |
443 | - return event; | 445 | + return !queue.isEmpty(); |
444 | } | 446 | } |
445 | 447 | ||
446 | - public void clearEvent() { | 448 | + public MapEvent<String, byte[]> event() throws InterruptedException { |
447 | - event = null; | 449 | + return queue.take(); |
448 | } | 450 | } |
449 | } | 451 | } |
450 | } | 452 | } | ... | ... |
... | @@ -20,7 +20,6 @@ import java.util.Queue; | ... | @@ -20,7 +20,6 @@ import java.util.Queue; |
20 | import java.util.concurrent.CompletableFuture; | 20 | import java.util.concurrent.CompletableFuture; |
21 | import java.util.function.Consumer; | 21 | import java.util.function.Consumer; |
22 | 22 | ||
23 | -import org.junit.Ignore; | ||
24 | import org.junit.Test; | 23 | import org.junit.Test; |
25 | 24 | ||
26 | import static org.junit.Assert.*; | 25 | import static org.junit.Assert.*; |
... | @@ -35,7 +34,6 @@ import io.atomix.resource.ResourceType; | ... | @@ -35,7 +34,6 @@ import io.atomix.resource.ResourceType; |
35 | /** | 34 | /** |
36 | * Unit tests for {@link AtomixLeaderElector}. | 35 | * Unit tests for {@link AtomixLeaderElector}. |
37 | */ | 36 | */ |
38 | -@Ignore | ||
39 | public class AtomixLeaderElectorTest extends AtomixTestBase { | 37 | public class AtomixLeaderElectorTest extends AtomixTestBase { |
40 | 38 | ||
41 | NodeId node1 = new NodeId("node1"); | 39 | NodeId node1 = new NodeId("node1"); | ... | ... |
... | @@ -17,7 +17,6 @@ package org.onosproject.store.primitives.resources.impl; | ... | @@ -17,7 +17,6 @@ package org.onosproject.store.primitives.resources.impl; |
17 | 17 | ||
18 | import static org.junit.Assert.*; | 18 | import static org.junit.Assert.*; |
19 | 19 | ||
20 | -import org.junit.Ignore; | ||
21 | import org.junit.Test; | 20 | import org.junit.Test; |
22 | 21 | ||
23 | import io.atomix.Atomix; | 22 | import io.atomix.Atomix; |
... | @@ -27,7 +26,6 @@ import io.atomix.variables.DistributedLong; | ... | @@ -27,7 +26,6 @@ import io.atomix.variables.DistributedLong; |
27 | /** | 26 | /** |
28 | * Unit tests for {@link AtomixCounter}. | 27 | * Unit tests for {@link AtomixCounter}. |
29 | */ | 28 | */ |
30 | -@Ignore | ||
31 | public class AtomixLongTest extends AtomixTestBase { | 29 | public class AtomixLongTest extends AtomixTestBase { |
32 | 30 | ||
33 | @Override | 31 | @Override | ... | ... |
-
Please register or login to post a comment