use of org.neo4j.consistency.store.DirectStoreAccess in project neo4j by neo4j.
the class GraphStoreFixture method startDatabaseAndExtractComponents.
private void startDatabaseAndExtractComponents() {
managementService = new TestDatabaseManagementServiceBuilder(testDirectory.homePath()).setFileSystem(testDirectory.getFileSystem()).setConfig(GraphDatabaseSettings.record_format, formatName).setConfig(GraphDatabaseInternalSettings.label_block_size, 60).setConfig(GraphDatabaseInternalSettings.consistency_check_on_apply, false).setConfig(getConfig()).build();
database = (GraphDatabaseAPI) managementService.database(DEFAULT_DATABASE_NAME);
DependencyResolver dependencyResolver = database.getDependencyResolver();
commitProcess = new InternalTransactionCommitProcess(dependencyResolver.resolveDependency(TransactionAppender.class), dependencyResolver.resolveDependency(StorageEngine.class));
transactionIdStore = database.getDependencyResolver().resolveDependency(TransactionIdStore.class);
storageEngine = dependencyResolver.resolveDependency(RecordStorageEngine.class);
neoStores = storageEngine.testAccessNeoStores();
indexingService = dependencyResolver.resolveDependency(IndexingService.class);
directStoreAccess = new DirectStoreAccess(neoStores, dependencyResolver.resolveDependency(IndexProviderMap.class), dependencyResolver.resolveDependency(TokenHolders.class), dependencyResolver.resolveDependency(IndexStatisticsStore.class), dependencyResolver.resolveDependency(IdGeneratorFactory.class));
countsStore = storageEngine.countsAccessor();
groupDegreesStore = storageEngine.relationshipGroupDegreesStore();
pageCache = dependencyResolver.resolveDependency(PageCache.class);
}
use of org.neo4j.consistency.store.DirectStoreAccess in project neo4j by neo4j.
the class DetectAllRelationshipInconsistenciesIT method shouldDetectSabotagedRelationshipWhereEverItIs.
@Test
void shouldDetectSabotagedRelationshipWhereEverItIs() throws Exception {
// GIVEN a database which lots of relationships
GraphDatabaseAPI db = getGraphDatabaseAPI();
Sabotage sabotage;
try {
Node[] nodes = new Node[1_000];
Relationship[] relationships = new Relationship[10_000];
long additionalNodeId;
try (Transaction tx = db.beginTx()) {
for (int i = 0; i < nodes.length; i++) {
nodes[i] = tx.createNode(label("Foo"));
}
additionalNodeId = tx.createNode().getId();
for (int i = 0; i < 10_000; i++) {
relationships[i] = random.among(nodes).createRelationshipTo(random.among(nodes), MyRelTypes.TEST);
}
tx.commit();
}
// WHEN sabotaging a random relationship
DependencyResolver resolver = db.getDependencyResolver();
NeoStores neoStores = resolver.resolveDependency(RecordStorageEngine.class).testAccessNeoStores();
RelationshipStore relationshipStore = neoStores.getRelationshipStore();
Relationship sabotagedRelationships = random.among(relationships);
sabotage = sabotage(relationshipStore, sabotagedRelationships.getId(), additionalNodeId);
} finally {
managementService.shutdown();
}
// THEN the checker should find it, where ever it is in the store
db = getGraphDatabaseAPI();
try {
DependencyResolver resolver = db.getDependencyResolver();
RecordStorageEngine storageEngine = resolver.resolveDependency(RecordStorageEngine.class);
NeoStores neoStores = storageEngine.testAccessNeoStores();
CountsStore counts = (CountsStore) storageEngine.countsAccessor();
RelationshipGroupDegreesStore groupDegreesStore = storageEngine.relationshipGroupDegreesStore();
DirectStoreAccess directStoreAccess = new DirectStoreAccess(neoStores, db.getDependencyResolver().resolveDependency(IndexProviderMap.class), db.getDependencyResolver().resolveDependency(TokenHolders.class), db.getDependencyResolver().resolveDependency(IndexStatisticsStore.class), db.getDependencyResolver().resolveDependency(IdGeneratorFactory.class));
int threads = random.intBetween(2, 10);
FullCheck checker = new FullCheck(ProgressMonitorFactory.NONE, threads, ConsistencyFlags.DEFAULT, getTuningConfiguration(), DebugContext.NO_DEBUG, NodeBasedMemoryLimiter.DEFAULT);
AssertableLogProvider logProvider = new AssertableLogProvider(true);
ConsistencySummaryStatistics summary = checker.execute(resolver.resolveDependency(PageCache.class), directStoreAccess, () -> counts, () -> groupDegreesStore, null, PageCacheTracer.NULL, INSTANCE, logProvider.getLog(FullCheck.class));
int relationshipInconsistencies = summary.getInconsistencyCountForRecordType(RecordType.RELATIONSHIP);
assertTrue(relationshipInconsistencies > 0, "Couldn't detect sabotaged relationship " + sabotage);
assertThat(logProvider).containsMessages(sabotage.after.toString());
} finally {
managementService.shutdown();
}
}
use of org.neo4j.consistency.store.DirectStoreAccess in project neo4j by neo4j.
the class FullCheckIntegrationTest method shouldNotReportIndexInconsistenciesIfIndexIsFailed.
@Test
void shouldNotReportIndexInconsistenciesIfIndexIsFailed() throws Exception {
// this test fails all indexes, and then destroys a record and makes sure we only get a failure for
// the label scan store but not for any index
// given
DirectStoreAccess storeAccess = fixture.directStoreAccess();
// fail all indexes
Iterator<IndexDescriptor> rules = getValueIndexDescriptors();
while (rules.hasNext()) {
IndexDescriptor rule = rules.next();
IndexSamplingConfig samplingConfig = new IndexSamplingConfig(Config.defaults());
IndexPopulator populator = storeAccess.indexes().lookup(rule.getIndexProvider()).getPopulator(rule, samplingConfig, heapBufferFactory(1024), INSTANCE, tokenNameLookup);
populator.markAsFailed("Oh noes! I was a shiny index and then I was failed");
populator.close(false, NULL);
}
for (Long indexedNodeId : indexedNodes) {
storeAccess.nativeStores().getNodeStore().updateRecord(notInUse(new NodeRecord(indexedNodeId).initialize(false, -1, false, -1, 0)), NULL);
}
// when
ConsistencySummaryStatistics stats = check();
// then
// the label scan is pointing to 2 nodes not in use
on(stats).verify(RecordType.LABEL_SCAN_DOCUMENT, 2).verify(RecordType.COUNTS, 2).andThatsAllFolks();
}
use of org.neo4j.consistency.store.DirectStoreAccess in project neo4j by neo4j.
the class FullCheckTokenIndexIT method check.
private ConsistencySummaryStatistics check(GraphDatabaseAPI database, Config config) throws ConsistencyCheckIncompleteException {
DependencyResolver dependencyResolver = database.getDependencyResolver();
RecordStorageEngine storageEngine = dependencyResolver.resolveDependency(RecordStorageEngine.class);
NeoStores neoStores = storageEngine.testAccessNeoStores();
IndexingService indexingService = dependencyResolver.resolveDependency(IndexingService.class);
DirectStoreAccess directStoreAccess = new DirectStoreAccess(neoStores, dependencyResolver.resolveDependency(IndexProviderMap.class), dependencyResolver.resolveDependency(TokenHolders.class), dependencyResolver.resolveDependency(IndexStatisticsStore.class), dependencyResolver.resolveDependency(IdGeneratorFactory.class));
CountsAccessor countsStore = storageEngine.countsAccessor();
RelationshipGroupDegreesStore groupDegreesStore = storageEngine.relationshipGroupDegreesStore();
PageCache pageCache = dependencyResolver.resolveDependency(PageCache.class);
IndexAccessors.IndexAccessorLookup indexAccessorLookup = new LookupAccessorsFromRunningDb(indexingService);
FullCheck checker = new FullCheck(ProgressMonitorFactory.NONE, defaultConsistencyCheckThreadsNumber(), ConsistencyFlags.DEFAULT, config, DebugContext.NO_DEBUG, NodeBasedMemoryLimiter.DEFAULT);
return checker.execute(pageCache, directStoreAccess, () -> (CountsStore) countsStore, () -> groupDegreesStore, indexAccessorLookup, PageCacheTracer.NULL, INSTANCE, logProvider.getLog("test"));
}
use of org.neo4j.consistency.store.DirectStoreAccess in project neo4j by neo4j.
the class GraphStoreFixture method writableTokenHolders.
public TokenHolders writableTokenHolders() {
TokenHolder propertyKeyTokens = new DelegatingTokenHolder(buildTokenCreator((name, internal, tx, next) -> {
int id = next.propertyKey();
tx.propertyKey(id, name, internal);
return id;
}), TokenHolder.TYPE_PROPERTY_KEY);
TokenHolder labelTokens = new DelegatingTokenHolder(buildTokenCreator((name, internal, tx, next) -> {
int id = next.label();
tx.nodeLabel(id, name, internal);
return id;
}), TokenHolder.TYPE_LABEL);
TokenHolder relationshipTypeTokens = new DelegatingTokenHolder(buildTokenCreator((name, internal, tx, next) -> {
int id = next.relationshipType();
tx.relationshipType(id, name, internal);
return id;
}), TokenHolder.TYPE_RELATIONSHIP_TYPE);
TokenHolders tokenHolders = new TokenHolders(propertyKeyTokens, labelTokens, relationshipTypeTokens);
tokenHolders.setInitialTokens(allReadableTokens(directStoreAccess().nativeStores()), NULL);
return tokenHolders;
}
Aggregations