Search in sources :

Example 26 with DatabaseLayout

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();
        }
    }
}
Also used : EntityType(org.neo4j.common.EntityType) Path(java.nio.file.Path) PrintStream(java.io.PrintStream) Args(org.neo4j.internal.helpers.Args) DefaultFileSystemAbstraction(org.neo4j.io.fs.DefaultFileSystemAbstraction) FileSystemAbstraction(org.neo4j.io.fs.FileSystemAbstraction) DefaultFileSystemAbstraction(org.neo4j.io.fs.DefaultFileSystemAbstraction) DatabaseLayout(org.neo4j.io.layout.DatabaseLayout) BufferedOutputStream(java.io.BufferedOutputStream)

Example 27 with DatabaseLayout

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");
}
Also used : StorageEngineFactory(org.neo4j.storageengine.api.StorageEngineFactory) DatabaseLayout(org.neo4j.io.layout.DatabaseLayout) AssertableLogProvider(org.neo4j.logging.AssertableLogProvider) Test(org.junit.jupiter.api.Test)

Example 28 with DatabaseLayout

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();
    }
}
Also used : UncloseableDelegatingFileSystemAbstraction(org.neo4j.io.fs.UncloseableDelegatingFileSystemAbstraction) FileSystemAbstraction(org.neo4j.io.fs.FileSystemAbstraction) Description(org.assertj.core.description.Description) Config(org.neo4j.configuration.Config) DatabaseLayout(org.neo4j.io.layout.DatabaseLayout) ConsistencyCheckService(org.neo4j.consistency.ConsistencyCheckService) DependencyResolver(org.neo4j.common.DependencyResolver) AfterAll(org.junit.jupiter.api.AfterAll)

Example 29 with DatabaseLayout

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));
    }
}
Also used : Path(java.nio.file.Path) GraphDatabaseAPI(org.neo4j.kernel.internal.GraphDatabaseAPI) DatabaseLayout(org.neo4j.io.layout.DatabaseLayout) Test(org.junit.jupiter.api.Test)

Example 30 with DatabaseLayout

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));
}
Also used : DatabaseLayout(org.neo4j.io.layout.DatabaseLayout) Test(org.junit.jupiter.api.Test)

Aggregations

DatabaseLayout (org.neo4j.io.layout.DatabaseLayout)108 Test (org.junit.jupiter.api.Test)66 Path (java.nio.file.Path)51 Config (org.neo4j.configuration.Config)35 FileSystemAbstraction (org.neo4j.io.fs.FileSystemAbstraction)24 GraphDatabaseAPI (org.neo4j.kernel.internal.GraphDatabaseAPI)19 DefaultFileSystemAbstraction (org.neo4j.io.fs.DefaultFileSystemAbstraction)17 PageCache (org.neo4j.io.pagecache.PageCache)17 IOException (java.io.IOException)16 ConsistencyCheckService (org.neo4j.consistency.ConsistencyCheckService)16 Transaction (org.neo4j.graphdb.Transaction)13 DefaultIdGeneratorFactory (org.neo4j.internal.id.DefaultIdGeneratorFactory)10 DatabaseManagementService (org.neo4j.dbms.api.DatabaseManagementService)9 TestDatabaseManagementServiceBuilder (org.neo4j.test.TestDatabaseManagementServiceBuilder)9 CommandFailedException (org.neo4j.cli.CommandFailedException)8 ExecutionContext (org.neo4j.cli.ExecutionContext)8 PageCacheTracer (org.neo4j.io.pagecache.tracing.PageCacheTracer)8 StorageEngineFactory (org.neo4j.storageengine.api.StorageEngineFactory)8 Closeable (java.io.Closeable)7 Assertions.assertEquals (org.junit.jupiter.api.Assertions.assertEquals)7