use of org.neo4j.io.layout.DatabaseLayout in project neo4j by neo4j.
the class TokenScanWriteMonitor method main.
/**
* Dumps a token scan write log as plain text. Arguments:
* <ul>
* <li>{@value #ARG_TOFILE}: dumps to a .txt file next to the writelog</li>
* <li>{@value #ARG_TXFILTER}: filter for which tx ids to include in the dump.
* <p>
* Consists of one or more groups separated by comma.
* <p>
* Each group is either a txId, or a txId range, e.g. 123-456
* </li>
* </ul>
* <p>
* How to interpret the dump, e.g:
* <pre>
* === ..../neostore.labelscanstore.db.writelog ===
* [1,1]+tx:6,entity:0,token:0
* [1,1]+tx:3,entity:20,token:0
* [1,1]+tx:4,entity:40,token:0
* [1,1]+tx:5,entity:60,token:0
* [2,1]+tx:8,entity:80,token:1
* [3,1]+tx:10,entity:41,token:1
* [4,1]+tx:9,entity:21,token:1
* [4,1]+tx:11,entity:61,token:1
* [4,1]+range:0,tokenId:1
* [00000000 00000000 00000010 00000000 00000000 00000000 00000000 00000000]
* [00100000 00000000 00000000 00000000 00000000 00100000 00000000 00000000]
* [5,1]+tx:12,entity:81,token:1
* [5,1]+range:1,tokenId:1
* [00000000 00000000 00000000 00000000 00000000 00000001 00000000 00000000]
* [00000000 00000000 00000000 00000000 00000000 00000010 00000000 00000000]
* [6,1]+tx:13,entity:1,token:1
* [6,1]+range:0,tokenId:1
* [00100000 00000000 00000010 00000000 00000000 00100000 00000000 00000000]
* [00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000010]
* [7,1]+tx:14,entity:62,token:1
* [7,1]+range:0,tokenId:1
* </pre>
* How to interpret a message like:
* <pre>
* [1,1]+tx:6,entity:0,token:0
* ▲ ▲ ▲ ▲ ▲ ▲
* │ │ │ │ │ └── token id of the change
* │ │ │ │ └────────── entity id of the change
* │ │ │ └─────────────────── id of transaction making this particular change
* │ │ └─────────────────────── addition, a minus means removal
* │ └───────────────────────── flush, local to each write session, incremented when a batch of changes is flushed internally in a writer session
* └─────────────────────────── write session, incremented for each token index writer
* </pre>
* How to interpret a message like:
* <pre>
* [4,1]+range:0,tokenId:1
* [00000000 00000000 00000010 00000000 00000000 00000000 00000000 00000000]
* [00100000 00000000 00000000 00000000 00000000 00100000 00000000 00000000]
* </pre>
* First the first line (parts within bracket same as above):
* <pre>
* [4,1]+range:0,tokenId:1
* ▲ ▲
* │ └── token id of the changed bitset to apply
* └──────────── range, i.e. which bitset to apply this change for
* </pre>
* Then the bitsets are printed
* <pre>
* [00000000 00000000 00000010 00000000 00000000 00000000 00000000 00000000] : state of the bitset for this token id before the change
* [00100000 00000000 00000000 00000000 00000000 00100000 00000000 00000000] : bits that applied to this bitset
* for addition the 1-bits denotes bits to be added
* for removal the 1-bits denotes bits to be removed
* </pre>
*/
public static void main(String[] args) throws IOException {
Args arguments = Args.withFlags(ARG_TOFILE).parse(args);
if (arguments.orphans().size() == 0) {
System.err.println("Please supply database directory");
return;
}
DatabaseLayout databaseLayout = DatabaseLayout.ofFlat(Path.of(arguments.orphans().get(0)));
FileSystemAbstraction fs = new DefaultFileSystemAbstraction();
TxFilter txFilter = parseTxFilter(arguments.get(ARG_TXFILTER, null));
PrintStream out = System.out;
boolean redirectsToFile = arguments.getBoolean(ARG_TOFILE);
for (EntityType entityType : EntityType.values()) {
if (redirectsToFile) {
Path outFile = Path.of(writeLogBaseFile(databaseLayout, entityType).toAbsolutePath() + ".txt");
System.out.println("Redirecting output to " + outFile);
out = new PrintStream(new BufferedOutputStream(Files.newOutputStream(outFile)));
}
Dumper dumper = new PrintStreamDumper(out);
dump(fs, databaseLayout, dumper, txFilter, entityType);
if (redirectsToFile) {
out.close();
}
}
}
use of org.neo4j.io.layout.DatabaseLayout in project neo4j by neo4j.
the class KernelDiagnosticsTest method shouldPrintDiskUsage.
@Test
void shouldPrintDiskUsage() throws IOException {
DatabaseLayout layout = DatabaseLayout.ofFlat(testDirectory.homePath());
StorageEngineFactory storageEngineFactory = mock(StorageEngineFactory.class);
when(storageEngineFactory.listStorageFiles(any(), any())).thenReturn(Collections.emptyList());
AssertableLogProvider logProvider = new AssertableLogProvider();
StoreFilesDiagnostics storeFiles = new StoreFilesDiagnostics(storageEngineFactory, fs, layout);
storeFiles.dump(logProvider.getLog(getClass())::debug);
assertThat(logProvider).containsMessages("Disk space on partition");
}
use of org.neo4j.io.layout.DatabaseLayout in project neo4j by neo4j.
the class DenseNodeConcurrencyIT method consistencyCheck.
@AfterAll
void consistencyCheck() throws ConsistencyCheckIncompleteException, IOException {
try {
DependencyResolver deps = database.getDependencyResolver();
Config config = deps.resolveDependency(Config.class);
DatabaseLayout databaseLayout = database.databaseLayout();
dbms.shutdown();
ConsistencyCheckService.Result result = new ConsistencyCheckService().runFullConsistencyCheck(databaseLayout, config, NONE, nullLogProvider(), deps.resolveDependency(FileSystemAbstraction.class), false, ConsistencyFlags.DEFAULT);
assertThat(result.isSuccessful()).as(new Description() {
@Override
public String value() {
return consistencyCheckReportAsString(result);
}
}).isTrue();
} finally {
fs.close();
}
}
use of org.neo4j.io.layout.DatabaseLayout in project neo4j by neo4j.
the class RecoveryIT method recoverDatabaseWithoutIdFiles.
@Test
void recoverDatabaseWithoutIdFiles() throws Throwable {
GraphDatabaseAPI db = createDatabase();
generateSomeData(db);
DatabaseLayout layout = db.databaseLayout();
managementService.shutdown();
for (Path idFile : layout.idFiles()) {
fileSystem.deleteFileOrThrow(idFile);
}
assertTrue(isRecoveryRequired(layout));
recoverDatabase();
assertFalse(isRecoveryRequired(layout));
for (Path idFile : layout.idFiles()) {
assertTrue(fileSystem.fileExists(idFile));
}
}
use of org.neo4j.io.layout.DatabaseLayout in project neo4j by neo4j.
the class RecoveryIT method recoveryNotRequiredWhenDatabaseNotFound.
@Test
void recoveryNotRequiredWhenDatabaseNotFound() throws Exception {
DatabaseLayout absentDatabase = neo4jLayout.databaseLayout("absent");
assertFalse(isRecoveryRequired(absentDatabase));
}
Aggregations