use of org.neo4j.common.EntityType.NODE in project neo4j by neo4j.
the class IndexingService method init.
/**
* Called while the database starts up, before recovery.
*/
@Override
public void init() throws IOException {
validateDefaultProviderExisting();
try (var cursorContext = new CursorContext(pageCacheTracer.createPageCursorTracer(INIT_TAG))) {
indexMapRef.modify(indexMap -> {
Map<InternalIndexState, List<IndexLogRecord>> indexStates = new EnumMap<>(InternalIndexState.class);
for (IndexDescriptor descriptor : indexDescriptors) {
// No index (except NLI) is allowed to have the name generated for NLI.
if (descriptor.getName().equals(IndexDescriptor.NLI_GENERATED_NAME) && !(descriptor.schema().isAnyTokenSchemaDescriptor() && descriptor.schema().entityType() == NODE)) {
throw new IllegalStateException("Index '" + descriptor.userDescription(tokenNameLookup) + "' is using a reserved name: '" + IndexDescriptor.NLI_GENERATED_NAME + "'. This index must be removed on an earlier version " + "to be able to use binaries for version 4.3 or newer.");
}
IndexProxy indexProxy;
IndexProviderDescriptor providerDescriptor = descriptor.getIndexProvider();
IndexProvider provider = providerMap.lookup(providerDescriptor);
InternalIndexState initialState = provider.getInitialState(descriptor, cursorContext);
indexStates.computeIfAbsent(initialState, internalIndexState -> new ArrayList<>()).add(new IndexLogRecord(descriptor));
internalLog.debug(indexStateInfo("init", initialState, descriptor));
switch(initialState) {
case ONLINE:
monitor.initialState(databaseName, descriptor, ONLINE);
indexProxy = indexProxyCreator.createOnlineIndexProxy(descriptor);
break;
case POPULATING:
// The database was shut down during population, or a crash has occurred, or some other sad thing.
monitor.initialState(databaseName, descriptor, POPULATING);
indexProxy = indexProxyCreator.createRecoveringIndexProxy(descriptor);
break;
case FAILED:
monitor.initialState(databaseName, descriptor, FAILED);
IndexPopulationFailure failure = failure(provider.getPopulationFailure(descriptor, cursorContext));
indexProxy = indexProxyCreator.createFailedIndexProxy(descriptor, failure);
break;
default:
throw new IllegalArgumentException("" + initialState);
}
indexMap.putIndexProxy(indexProxy);
}
logIndexStateSummary("init", indexStates);
return indexMap;
});
}
indexStatisticsStore.init();
}
use of org.neo4j.common.EntityType.NODE in project neo4j by neo4j.
the class TokenScanWriteMonitorTest method shouldPruneAtConfiguredThreshold.
@Test
void shouldPruneAtConfiguredThreshold() {
// given
long pruneThreshold = 200;
RecordingMonitor monitor = new RecordingMonitor();
FakeClock clock = Clocks.fakeClock();
TokenScanWriteMonitor writeMonitor = new TokenScanWriteMonitor(fs, databaseLayout, 500, ByteUnit.Byte, pruneThreshold, TimeUnit.MILLISECONDS, NODE, monitor, clock);
// when
long startTime = clock.millis();
long endTime = startTime + TimeUnit.SECONDS.toMillis(1);
for (int i = 0; clock.millis() < endTime; i++) {
long timeLeft = endTime - clock.millis();
clock.forward(min(timeLeft, random.nextInt(1, 10)), TimeUnit.MILLISECONDS);
writeMonitor.range(i, 1);
writeMonitor.prepareAdd(i, 5);
writeMonitor.mergeAdd(new TokenScanValue(), new TokenScanValue().set(5));
writeMonitor.writeSessionEnded();
}
// then
writeMonitor.close();
List<Entry> remainingFiles = monitor.rotations.stream().filter(r -> monitor.prunes.stream().noneMatch(p -> r.timestamp == p.timestamp)).collect(Collectors.toList());
assertThat(remainingFiles).isNotEmpty();
assertThat(monitor.rotations.size()).isGreaterThan(remainingFiles.size());
assertThat(monitor.prunes).isNotEmpty();
remainingFiles.forEach(e -> assertThat(endTime - e.timestamp).isLessThan(pruneThreshold * 2));
}
Aggregations