Search in sources :

Example 61 with MemoryDocumentStore

use of org.apache.jackrabbit.oak.plugins.document.memory.MemoryDocumentStore in project jackrabbit-oak by apache.

the class NodeDocumentTest method getNewestRevision.

@Test
public void getNewestRevision() throws Exception {
    MemoryDocumentStore store = new MemoryDocumentStore();
    DocumentNodeStore ns1 = createTestStore(store, 1, 0);
    DocumentNodeStore ns2 = createTestStore(store, 2, 0);
    NodeBuilder b1 = ns1.getRoot().builder();
    b1.child("test");
    merge(ns1, b1);
    RevisionVector headCreated = ns1.getHeadRevision();
    Revision created = headCreated.getRevision(ns1.getClusterId());
    NodeDocument doc = store.find(NODES, Utils.getIdFromPath("/test"));
    Set<Revision> collisions = newHashSet();
    Revision newest = doc.getNewestRevision(ns1, ns1.getHeadRevision(), ns1.newRevision(), null, collisions);
    assertEquals(created, newest);
    assertEquals(0, collisions.size());
    // from ns2 POV newest must be null, because the node is not yet visible
    newest = doc.getNewestRevision(ns2, ns2.getHeadRevision(), ns2.newRevision(), null, collisions);
    assertNull(newest);
    assertEquals(1, collisions.size());
    assertEquals(created, collisions.iterator().next());
    ns1.runBackgroundOperations();
    ns2.runBackgroundOperations();
    collisions.clear();
    // now ns2 sees /test
    doc = store.find(NODES, Utils.getIdFromPath("/test"));
    newest = doc.getNewestRevision(ns2, ns2.getHeadRevision(), ns2.newRevision(), null, collisions);
    assertEquals(created, newest);
    assertEquals(0, collisions.size());
    Revision uncommitted = ns1.newRevision();
    UpdateOp op = new UpdateOp(Utils.getIdFromPath("/test"), false);
    NodeDocument.setCommitRoot(op, uncommitted, 0);
    op.setMapEntry("p", uncommitted, "v");
    assertNotNull(store.findAndUpdate(NODES, op));
    collisions.clear();
    // ns1 must report uncommitted in collisions
    doc = store.find(NODES, Utils.getIdFromPath("/test"));
    newest = doc.getNewestRevision(ns1, ns1.getHeadRevision(), ns1.newRevision(), null, collisions);
    assertEquals(created, newest);
    assertEquals(1, collisions.size());
    assertEquals(uncommitted, collisions.iterator().next());
    collisions.clear();
    // ns2 must report uncommitted in collisions
    newest = doc.getNewestRevision(ns2, ns2.getHeadRevision(), ns2.newRevision(), null, collisions);
    assertEquals(created, newest);
    assertEquals(1, collisions.size());
    assertEquals(uncommitted, collisions.iterator().next());
    b1 = ns1.getRoot().builder();
    b1.child("test").setProperty("q", "v");
    merge(ns1, b1);
    Revision committed = ns1.getHeadRevision().getRevision(ns1.getClusterId());
    collisions.clear();
    // ns1 must now report committed revision as newest
    // uncommitted is not considered a collision anymore
    // because it is older than the base revision
    doc = store.find(NODES, Utils.getIdFromPath("/test"));
    newest = doc.getNewestRevision(ns1, headCreated, ns1.newRevision(), null, collisions);
    assertEquals(committed, newest);
    assertEquals(0, collisions.size());
    // ns2 must report committed revision as collision because
    // it is not yet visible. newest is when the node was created
    newest = doc.getNewestRevision(ns2, ns2.getHeadRevision(), ns2.newRevision(), null, collisions);
    assertEquals(created, newest);
    assertEquals(2, collisions.size());
    assertTrue(collisions.contains(uncommitted));
    assertTrue(collisions.contains(committed));
    ns1.dispose();
    ns2.dispose();
}
Also used : MemoryDocumentStore(org.apache.jackrabbit.oak.plugins.document.memory.MemoryDocumentStore) NodeBuilder(org.apache.jackrabbit.oak.spi.state.NodeBuilder) Test(org.junit.Test)

Example 62 with MemoryDocumentStore

use of org.apache.jackrabbit.oak.plugins.document.memory.MemoryDocumentStore in project jackrabbit-oak by apache.

the class NodeDocumentTest method readsWithOverlappingPreviousDocuments.

@Test
public void readsWithOverlappingPreviousDocuments() throws Exception {
    final Map<String, Document> prevDocCalls = newLinkedHashMap();
    MemoryDocumentStore store = new MemoryDocumentStore() {

        @Override
        public <T extends Document> T find(Collection<T> collection, String key) {
            T doc = super.find(collection, key);
            if (collection == NODES && Utils.getPathFromId(key).startsWith("p")) {
                prevDocCalls.put(key, doc);
            }
            return doc;
        }
    };
    Random random = new Random(42);
    DocumentNodeStore ns = createTestStore(store, 1, 0);
    List<RevisionVector> headRevisions = Lists.newArrayList();
    for (int i = 0; i < 1000; i++) {
        NodeBuilder builder = ns.getRoot().builder();
        NodeBuilder test = builder.child("test");
        test.setProperty("p", i);
        // them with different probabilities
        for (int j = 0; j < 4; j++) {
            if (random.nextInt(j + 1) == 0) {
                test.setProperty("p" + j, i);
            }
        }
        merge(ns, builder);
        headRevisions.add(ns.getHeadRevision());
        if (i % 3 == 0) {
            // split the document
            RevisionVector head = ns.getHeadRevision();
            NodeDocument doc = store.find(NODES, Utils.getIdFromPath("/test"));
            for (UpdateOp op : SplitOperations.forDocument(doc, ns, head, NO_BINARY, 2)) {
                store.createOrUpdate(NODES, op);
            }
        }
    }
    ns.runBackgroundOperations();
    NodeDocument doc = store.find(NODES, Utils.getIdFromPath("/test"));
    List<Integer> numCalls = Lists.newArrayList();
    long count = 0;
    // go back in time and check number of find calls
    for (RevisionVector rv : headRevisions) {
        prevDocCalls.clear();
        DocumentNodeState s = doc.getNodeAtRevision(ns, rv, null);
        assertNotNull(s);
        assertEquals(count++, s.getProperty("p").getValue(Type.LONG).longValue());
        numCalls.add(prevDocCalls.size());
    }
    assertThat(numCalls.toString(), numCalls, everyItem(lessThan(36)));
    ns.dispose();
}
Also used : MemoryDocumentStore(org.apache.jackrabbit.oak.plugins.document.memory.MemoryDocumentStore) Utils.getRootDocument(org.apache.jackrabbit.oak.plugins.document.util.Utils.getRootDocument) NodeBuilder(org.apache.jackrabbit.oak.spi.state.NodeBuilder) Random(java.util.Random) Test(org.junit.Test)

Example 63 with MemoryDocumentStore

use of org.apache.jackrabbit.oak.plugins.document.memory.MemoryDocumentStore in project jackrabbit-oak by apache.

the class NodeDocumentTest method isConflicting.

// OAK-3557
@Test
public void isConflicting() throws Exception {
    final int numChanges = 200;
    final Set<String> prevDocCalls = newHashSet();
    MemoryDocumentStore store = new MemoryDocumentStore() {

        @Override
        public <T extends Document> T find(Collection<T> collection, String key) {
            if (Utils.getPathFromId(key).startsWith("p")) {
                prevDocCalls.add(key);
            }
            return super.find(collection, key);
        }
    };
    DocumentNodeStore ns = createTestStore(store, 0, numChanges);
    NodeDocument doc = getRootDocument(store);
    Map<Revision, String> valueMap = doc.getValueMap("p");
    assertEquals(200, valueMap.size());
    RevisionVector baseRev = new RevisionVector(valueMap.keySet().iterator().next());
    Revision commitRev = ns.newRevision();
    UpdateOp op = new UpdateOp(Utils.getIdFromPath("/"), false);
    op.setMapEntry("p", commitRev, "v");
    prevDocCalls.clear();
    assertFalse(doc.isConflicting(op, baseRev, commitRev, false));
    assertTrue("too many calls for previous documents: " + prevDocCalls, prevDocCalls.size() <= 6);
    ns.dispose();
}
Also used : MemoryDocumentStore(org.apache.jackrabbit.oak.plugins.document.memory.MemoryDocumentStore) Utils.getRootDocument(org.apache.jackrabbit.oak.plugins.document.util.Utils.getRootDocument) Test(org.junit.Test)

Example 64 with MemoryDocumentStore

use of org.apache.jackrabbit.oak.plugins.document.memory.MemoryDocumentStore in project jackrabbit-oak by apache.

the class NodeDocumentTest method tooManyReadsOnGetNodeAtRevision.

@Test
public void tooManyReadsOnGetNodeAtRevision() throws Exception {
    final int numChanges = 200;
    final Set<String> prevDocCalls = newHashSet();
    MemoryDocumentStore store = new MemoryDocumentStore() {

        @Override
        public <T extends Document> T find(Collection<T> collection, String key) {
            if (Utils.getPathFromId(key).startsWith("p")) {
                prevDocCalls.add(key);
            }
            return super.find(collection, key);
        }
    };
    DocumentNodeStore ns = createTestStore(store, 0, numChanges);
    NodeDocument doc = getRootDocument(store);
    Map<Revision, String> valueMap = doc.getValueMap("p");
    assertEquals(200, valueMap.size());
    Revision oldest = Iterables.getLast(valueMap.keySet());
    prevDocCalls.clear();
    DocumentNodeState state = doc.getNodeAtRevision(ns, new RevisionVector(oldest), null);
    assertNotNull(state);
    PropertyState prop = state.getProperty("p");
    assertNotNull(prop);
    assertEquals(0L, (long) prop.getValue(Type.LONG));
    assertTrue("too many calls for previous documents: " + prevDocCalls, prevDocCalls.size() <= 2);
    ns.dispose();
}
Also used : MemoryDocumentStore(org.apache.jackrabbit.oak.plugins.document.memory.MemoryDocumentStore) Utils.getRootDocument(org.apache.jackrabbit.oak.plugins.document.util.Utils.getRootDocument) PropertyState(org.apache.jackrabbit.oak.api.PropertyState) Test(org.junit.Test)

Example 65 with MemoryDocumentStore

use of org.apache.jackrabbit.oak.plugins.document.memory.MemoryDocumentStore in project jackrabbit-oak by apache.

the class NodeDocumentTest method getSweepRevisions.

@Test
public void getSweepRevisions() throws Exception {
    MemoryDocumentStore store = new MemoryDocumentStore();
    NodeDocument doc = new NodeDocument(store);
    RevisionVector sweepRev = doc.getSweepRevisions();
    assertNotNull(sweepRev);
    assertEquals(0, sweepRev.getDimensions());
    Revision r1 = Revision.newRevision(1);
    Revision r2 = Revision.newRevision(2);
    UpdateOp op = new UpdateOp("id", true);
    NodeDocument.setSweepRevision(op, r1);
    UpdateUtils.applyChanges(doc, op);
    sweepRev = doc.getSweepRevisions();
    assertNotNull(sweepRev);
    assertEquals(1, sweepRev.getDimensions());
    assertEquals(new RevisionVector(r1), sweepRev);
    op = new UpdateOp("id", false);
    NodeDocument.setSweepRevision(op, r2);
    UpdateUtils.applyChanges(doc, op);
    sweepRev = doc.getSweepRevisions();
    assertNotNull(sweepRev);
    assertEquals(2, sweepRev.getDimensions());
    assertEquals(new RevisionVector(r1, r2), sweepRev);
}
Also used : MemoryDocumentStore(org.apache.jackrabbit.oak.plugins.document.memory.MemoryDocumentStore) Test(org.junit.Test)

Aggregations

MemoryDocumentStore (org.apache.jackrabbit.oak.plugins.document.memory.MemoryDocumentStore)132 Test (org.junit.Test)113 NodeBuilder (org.apache.jackrabbit.oak.spi.state.NodeBuilder)72 Clock (org.apache.jackrabbit.oak.stats.Clock)21 NodeState (org.apache.jackrabbit.oak.spi.state.NodeState)19 Before (org.junit.Before)13 CommitFailedException (org.apache.jackrabbit.oak.api.CommitFailedException)11 MemoryBlobStore (org.apache.jackrabbit.oak.spi.blob.MemoryBlobStore)10 AtomicInteger (java.util.concurrent.atomic.AtomicInteger)9 Utils.getRootDocument (org.apache.jackrabbit.oak.plugins.document.util.Utils.getRootDocument)9 Random (java.util.Random)8 CONSTRAINT (org.apache.jackrabbit.oak.api.CommitFailedException.CONSTRAINT)8 DocumentNodeStore (org.apache.jackrabbit.oak.plugins.document.DocumentNodeStore)7 ChildNodeEntry (org.apache.jackrabbit.oak.spi.state.ChildNodeEntry)6 ArrayList (java.util.ArrayList)5 AtomicBoolean (java.util.concurrent.atomic.AtomicBoolean)5 StringSort (org.apache.jackrabbit.oak.commons.sort.StringSort)5 List (java.util.List)4 Semaphore (java.util.concurrent.Semaphore)4 VersionGCStats (org.apache.jackrabbit.oak.plugins.document.VersionGarbageCollector.VersionGCStats)4