use of org.apache.jackrabbit.oak.plugins.observation.ChangeSetBuilder in project jackrabbit-oak by apache.
the class ChangeSetFilterImplTest method testIncludeOnParentNodeTypeOverflow.
@Test
public void testIncludeOnParentNodeTypeOverflow() throws Exception {
ChangeSetBuilder builder = sampleBuilder();
ChangeSetFilterImpl prefilter = new ChangeSetFilterImpl(s("/"), true, null, s("/excluded"), s("foo", "bars"), s("nt:file"), s());
assertTrue(prefilter.excludes(builder.build()));
overflowParentNodeTypes(builder);
assertFalse(prefilter.excludes(builder.build()));
}
use of org.apache.jackrabbit.oak.plugins.observation.ChangeSetBuilder in project jackrabbit-oak by apache.
the class ChangeSetFilterImplTest method testIncludeOnAllNodeTypeOverflow.
@Test
public void testIncludeOnAllNodeTypeOverflow() throws Exception {
ChangeSetBuilder builder = sampleBuilder();
ChangeSetFilterImpl prefilter = new ChangeSetFilterImpl(s("/"), true, null, s("/excluded"), s("foo", "bars"), s("nt:file"), s());
assertTrue(prefilter.excludes(builder.build()));
overflowAllNodeTypes(builder);
assertFalse(prefilter.excludes(builder.build()));
}
use of org.apache.jackrabbit.oak.plugins.observation.ChangeSetBuilder in project jackrabbit-oak by apache.
the class ChangeSetFilterImplTest method testIncludeOnPropertyNamesOverflow.
@Test
public void testIncludeOnPropertyNamesOverflow() throws Exception {
ChangeSetBuilder builder = sampleBuilder();
ChangeSetFilterImpl prefilter = new ChangeSetFilterImpl(s("/"), true, null, s("/excluded"), s("foo", "bars"), s("nt:file"), s());
assertTrue(prefilter.excludes(builder.build()));
overflowPropertyNames(builder);
assertFalse(prefilter.excludes(builder.build()));
}
use of org.apache.jackrabbit.oak.plugins.observation.ChangeSetBuilder in project jackrabbit-oak by apache.
the class ChangeSetFilterImplTest method testOverflowing.
@Test
public void testOverflowing() throws Exception {
ChangeSetBuilder builder = newBuilder(5, 5);
assertTrue(overflowAllNodeTypes(builder).isAllNodeTypeOverflown());
assertTrue(overflowParentNodeTypes(builder).isParentNodeTypeOverflown());
assertTrue(overflowParentNodeNames(builder).isParentNodeNameOverflown());
assertTrue(overflowParentPaths(builder).isParentPathOverflown());
assertTrue(overflowPropertyNames(builder).isPropertyNameOverflown());
}
use of org.apache.jackrabbit.oak.plugins.observation.ChangeSetBuilder in project jackrabbit-oak by apache.
the class ExternalChange method process.
/**
* Processes external changes if there are any.
*
* @return statistics about the background read operation.
*/
BackgroundReadStats process() {
Clock clock = store.getClock();
int clusterId = store.getClusterId();
long time = clock.getTime();
String id = Utils.getIdFromPath("/");
NodeDocument doc = store.getDocumentStore().find(NODES, id, store.getAsyncDelay());
if (doc == null) {
return stats;
}
try {
alignWithExternalRevisions(doc, clock, clusterId);
} catch (InterruptedException e) {
throw new RuntimeException("Background read interrupted", e);
}
StringSort externalSort = newSorter();
StringSort invalidate = newSorter();
Map<Integer, Revision> lastRevMap = doc.getLastRev();
try {
changeSetBuilder = new ChangeSetBuilder(store.getChangeSetMaxItems(), store.getChangeSetMaxDepth());
RevisionVector headRevision = store.getHeadRevision();
Set<Revision> externalChanges = newHashSet();
for (Map.Entry<Integer, Revision> e : lastRevMap.entrySet()) {
int machineId = e.getKey();
if (machineId == clusterId) {
// ignore own lastRev
continue;
}
Revision r = e.getValue();
Revision last = headRevision.getRevision(machineId);
if (last == null) {
// make sure we see all changes when a cluster node joins
last = new Revision(0, 0, machineId);
}
if (r.compareRevisionTime(last) > 0) {
// OAK-2345
// only consider as external change if
// the revision changed for the machineId
externalChanges.add(r);
// collect external changes
if (externalSort != null) {
// add changes for this particular clusterId to the externalSort
try {
fillExternalChanges(externalSort, invalidate, PathUtils.ROOT_PATH, last, r, store.getDocumentStore(), changeSetBuilder, journalPropertyHandler);
} catch (Exception e1) {
LOG.error("backgroundRead: Exception while reading external changes from journal: " + e1, e1);
closeQuietly(externalSort);
closeQuietly(invalidate);
externalSort = null;
invalidate = null;
}
}
}
}
stats.readHead = clock.getTime() - time;
time = clock.getTime();
// invalidate cache
if (cacheInvalidationNeeded(externalSort, invalidate)) {
// invalidate caches
if (externalSort == null) {
// if no externalSort available, then invalidate everything
invalidateCache();
} else {
stats.numExternalChanges = externalSort.getSize();
try {
sortAndInvalidate(externalSort);
sortAndInvalidate(invalidate);
} catch (Exception ioe) {
LOG.error("backgroundRead: got IOException during external sorting/cache invalidation (as a result, invalidating entire cache): " + ioe, ioe);
invalidateCache();
}
}
stats.cacheInvalidationTime = clock.getTime() - time;
}
// update head
if (!externalChanges.isEmpty()) {
updateHead(externalChanges, doc.getSweepRevisions(), externalSort);
}
} finally {
closeQuietly(externalSort);
closeQuietly(invalidate);
}
return stats;
}
Aggregations