Search in sources :

Example 1 with ABSENT

use of org.neo4j.internal.counts.CountsChanges.ABSENT in project neo4j by neo4j.

the class CountsChangesTest method shouldUpdateConcurrently.

@Test
void shouldUpdateConcurrently() {
    // given
    CountsChanges changes = new CountsChanges();
    InMemoryCountsStore store = new InMemoryCountsStore();
    int numStoredCounts = random.nextInt(10, 100);
    for (int i = 0; i < numStoredCounts; i++) {
        CountsKey key;
        do {
            key = randomKey(random.random());
        } while (store.counts.containsKey(key));
        long count = random.nextLong(100);
        store.store(key, count);
    }
    // when
    Race race = new Race();
    List<Map<CountsKey, MutableLong>> allThreadChanges = new CopyOnWriteArrayList<>();
    race.addContestants(4, r -> () -> {
        Random threadRandom = new Random(random.seed() + r);
        Map<CountsKey, MutableLong> threadChanges = new HashMap<>();
        for (int i = 0; i < 1_0000; i++) {
            CountsKey key = randomKey(threadRandom);
            long delta = threadRandom.nextInt(12) - 2;
            changes.add(key, delta, store);
            threadChanges.computeIfAbsent(key, k -> new MutableLong()).add(delta);
        }
        allThreadChanges.add(threadChanges);
    });
    race.goUnchecked();
    // then
    Map<CountsKey, MutableLong> expectedCounts = new HashMap<>();
    store.counts.forEach((key, count) -> expectedCounts.put(key, new MutableLong(count.longValue())));
    for (Map<CountsKey, MutableLong> threadChanges : allThreadChanges) {
        threadChanges.forEach((key, delta) -> expectedCounts.computeIfAbsent(key, k -> new MutableLong()).add(delta.longValue()));
    }
    expectedCounts.forEach((key, expectedCount) -> {
        long expectedCountFromChanges = changes.containsChange(key) ? expectedCount.longValue() : ABSENT;
        assertThat(changes.get(key)).as(key.toString()).isEqualTo(expectedCountFromChanges);
    });
}
Also used : Iterator(java.util.Iterator) RandomExtension(org.neo4j.test.extension.RandomExtension) Assertions.assertThat(org.assertj.core.api.Assertions.assertThat) ConcurrentHashMap(java.util.concurrent.ConcurrentHashMap) Set(java.util.Set) HashMap(java.util.HashMap) Random(java.util.Random) Function(java.util.function.Function) ArrayList(java.util.ArrayList) Test(org.junit.jupiter.api.Test) HashSet(java.util.HashSet) AtomicLong(java.util.concurrent.atomic.AtomicLong) List(java.util.List) ExtendWith(org.junit.jupiter.api.extension.ExtendWith) Inject(org.neo4j.test.extension.Inject) Assertions.assertThatThrownBy(org.assertj.core.api.Assertions.assertThatThrownBy) RandomRule(org.neo4j.test.rule.RandomRule) MutableLong(org.apache.commons.lang3.mutable.MutableLong) GBPTreeCountsStore.nodeKey(org.neo4j.internal.counts.GBPTreeCountsStore.nodeKey) Map(java.util.Map) GBPTreeCountsStore.relationshipKey(org.neo4j.internal.counts.GBPTreeCountsStore.relationshipKey) ABSENT(org.neo4j.internal.counts.CountsChanges.ABSENT) Race(org.neo4j.test.Race) CopyOnWriteArrayList(java.util.concurrent.CopyOnWriteArrayList) ConcurrentHashMap(java.util.concurrent.ConcurrentHashMap) HashMap(java.util.HashMap) MutableLong(org.apache.commons.lang3.mutable.MutableLong) Random(java.util.Random) Race(org.neo4j.test.Race) ConcurrentHashMap(java.util.concurrent.ConcurrentHashMap) HashMap(java.util.HashMap) Map(java.util.Map) CopyOnWriteArrayList(java.util.concurrent.CopyOnWriteArrayList) Test(org.junit.jupiter.api.Test)

Aggregations

ArrayList (java.util.ArrayList)1 HashMap (java.util.HashMap)1 HashSet (java.util.HashSet)1 Iterator (java.util.Iterator)1 List (java.util.List)1 Map (java.util.Map)1 Random (java.util.Random)1 Set (java.util.Set)1 ConcurrentHashMap (java.util.concurrent.ConcurrentHashMap)1 CopyOnWriteArrayList (java.util.concurrent.CopyOnWriteArrayList)1 AtomicLong (java.util.concurrent.atomic.AtomicLong)1 Function (java.util.function.Function)1 MutableLong (org.apache.commons.lang3.mutable.MutableLong)1 Assertions.assertThat (org.assertj.core.api.Assertions.assertThat)1 Assertions.assertThatThrownBy (org.assertj.core.api.Assertions.assertThatThrownBy)1 Test (org.junit.jupiter.api.Test)1 ExtendWith (org.junit.jupiter.api.extension.ExtendWith)1 ABSENT (org.neo4j.internal.counts.CountsChanges.ABSENT)1 GBPTreeCountsStore.nodeKey (org.neo4j.internal.counts.GBPTreeCountsStore.nodeKey)1 GBPTreeCountsStore.relationshipKey (org.neo4j.internal.counts.GBPTreeCountsStore.relationshipKey)1