/** * Atomically decrements the counter and returns the new value * * @return The new value. */ default CompletableFuture<Long> decrementAndGet() { return addAndGet(-1L); }
/** * Atomically increments the counter and returns the new value. * * @return The new value. */ default CompletableFuture<Long> incrementAndGet() { return addAndGet(1L); }
/** * @see StrongCounter#addAndGet(long) */ @Override public long addAndGet(long delta) { return awaitCounterOperation(counter.addAndGet(delta)); }
public abstract Number nextValue(NextValueRequest request); }
public Number nextValue(NextValueRequest request) { try { Long newValue = counter.addAndGet( request.getIncrement() ).get(); return newValue - request.getIncrement(); } catch (ExecutionException | InterruptedException e) { throw new HibernateException( "Interrupting Operation " + e.getMessage(), e ); } }
public abstract Number nextValue(NextValueRequest request); }
void counterAddAndGet(HotRodHeader header, Subject subject, String counterName, long value) { applyCounter(header, counterName, (h, counter) -> counter.addAndGet(value).whenComplete((value1, throwable) -> longResultHandler(h, value1, throwable)), (h, counter) -> counter.add(value).whenComplete((value2, throwable1) -> longResultHandler(h, 0L, throwable1))); }
private void addToStrongCounter(String name, long delta, boolean exception) { CompletableFuture<Long> result = counterManager(0).getStrongCounter(name).addAndGet(delta); if (exception) { expectException(CounterOutOfBoundsException.class, () -> awaitCounterOperation(result)); } else { awaitCounterOperation(result); } }
@Override public void testBoundaries(Method method) { final String counterName = method.getName(); final CounterManager counterManager = counterManagerSupplier.get(); assertTrue(counterManager .defineCounter(counterName, builder(BOUNDED_STRONG).initialValue(1).lowerBound(0).upperBound(20).build())); StrongCounter counter = counterManager.getStrongCounter(counterName); assertCounterValue(counter, 1); expectException(ExecutionException.class, CounterOutOfBoundsException.class, () -> counter.addAndGet(-10).get()); expectException(ExecutionException.class, CounterOutOfBoundsException.class, () -> counter.addAndGet(30).get()); assertCounterValue(counter, 20); expectException(ExecutionException.class, CounterOutOfBoundsException.class, () -> counter.compareAndSet(20, -1).get()); assertCounterValue(counter, 20); expectException(ExecutionException.class, CounterOutOfBoundsException.class, () -> counter.compareAndSet(20, 21).get()); }
@Override public void add(StrongCounter counter, long delta, long result) { if (delta == 1) { assertEquals(result, (long) awaitCounterOperation(counter.incrementAndGet())); } else if (delta == -1) { assertEquals(result, (long) awaitCounterOperation(counter.decrementAndGet())); } else { assertEquals(result, (long) awaitCounterOperation(counter.addAndGet(delta))); } }
@Override public void testRemove(Method method) { //we need to cleanup other tests counters from the caches because of cache.size() clearCaches(); final Random random = generateRandom(); final String counterName = method.getName(); final CounterManager counterManager = getTestedCounterManager(); CounterConfiguration config = builder(CounterType.UNBOUNDED_STRONG).initialValue(random.nextLong()).build(); assertTrue(counterManager.defineCounter(counterName, config)); awaitCounterOperation(counterManager.getStrongCounter(counterName).addAndGet(10)); EmbeddedCacheManager cacheManager = cacheManagerSupplier.get(); Cache<?, ?> cache = cacheManager.getCache(CounterModuleLifecycle.COUNTER_CACHE_NAME); assertEquals(1, cache.size()); counterManager.remove(counterName); assertEquals(0, cache.size()); }
@Override public void testListenerWithBounds(Method method) throws InterruptedException { final String counterName = method.getName(); final CounterManager counterManager = counterManagerSupplier.get(); assertTrue(counterManager .defineCounter(counterName, builder(BOUNDED_STRONG).initialValue(0).lowerBound(0).upperBound(20).build())); StrongCounter counter = counterManager.getStrongCounter(counterName); Handle<EventLogger> handle = counter.addListener(new EventLogger()); add(counter, 1, 1); expectException(ExecutionException.class, CounterOutOfBoundsException.class, () -> counter.addAndGet(20).get()); assertCounterValue(counter, 20); reset(counter); expectException(CounterOutOfBoundsException.class, () -> add(counter, -1, 0)); assertCounterValue(counter, 0); assertNextValidEvent(handle, 0, 1); assertNextEvent(handle, 1, CounterState.VALID, 20, CounterState.UPPER_BOUND_REACHED); assertNextEvent(handle, 20, CounterState.UPPER_BOUND_REACHED, 0, CounterState.VALID); assertNextEvent(handle, 0, CounterState.VALID, 0, CounterState.LOWER_BOUND_REACHED); assertNoEvents(handle); handle.remove(); }