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();
}
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();
}
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();
}
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();
}
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);
}
Aggregations