@@ -7,12 +7,20 @@ import org.apache.commons.lang3.RandomStringUtils.randomAlphanumeric
77import org.apache.commons.lang3.exception.ExceptionUtils.getRootCause
88import org.apache.kafka.clients.producer.ProducerRecord
99import org.assertj.core.api.Assertions.assertThat
10- import org.junit.jupiter.api.Assertions.*
10+ import org.junit.jupiter.api.Assertions.assertEquals
11+ import org.junit.jupiter.api.Assertions.assertFalse
12+ import org.junit.jupiter.api.Assertions.assertNotNull
13+ import org.junit.jupiter.api.Assertions.assertThrows
14+ import org.junit.jupiter.api.Assertions.assertTrue
1115import org.junit.jupiter.api.BeforeEach
1216import org.junit.jupiter.api.Test
1317import org.neo4j.configuration.Config
1418import org.neo4j.configuration.Config.defaults
15- import org.neo4j.configuration.GraphDatabaseSettings.*
19+ import org.neo4j.configuration.GraphDatabaseInternalSettings
20+ import org.neo4j.configuration.GraphDatabaseSettings.DEFAULT_DATABASE_NAME
21+ import org.neo4j.configuration.GraphDatabaseSettings.fail_on_missing_files
22+ import org.neo4j.configuration.GraphDatabaseSettings.logical_log_rotation_threshold
23+ import org.neo4j.configuration.GraphDatabaseSettings.preallocate_logical_logs
1624import org.neo4j.dbms.DatabaseStateService
1725import org.neo4j.dbms.api.DatabaseManagementService
1826import org.neo4j.dbms.database.DatabaseStartAbortedException
@@ -21,16 +29,15 @@ import org.neo4j.graphdb.Label
2129import org.neo4j.graphdb.RelationshipType.withName
2230import org.neo4j.graphdb.schema.IndexType
2331import org.neo4j.internal.helpers.collection.Iterables.count
24- import org.neo4j.internal.index.label.RelationshipTypeScanStoreSettings.enable_relationship_type_scan_store
25- import org.neo4j.internal.kernel.api.IndexQuery.fulltextSearch
2632import org.neo4j.internal.kernel.api.IndexQueryConstraints.unconstrained
33+ import org.neo4j.internal.kernel.api.PropertyIndexQuery.fulltextSearch
2734import org.neo4j.io.ByteUnit
2835import org.neo4j.io.fs.DefaultFileSystemAbstraction
2936import org.neo4j.io.layout.DatabaseLayout
3037import org.neo4j.io.layout.Neo4jLayout
3138import org.neo4j.io.pagecache.PageCache
39+ import org.neo4j.io.pagecache.context.CursorContext
3240import org.neo4j.io.pagecache.tracing.DefaultPageCacheTracer
33- import org.neo4j.io.pagecache.tracing.cursor.PageCursorTracer.NULL
3441import org.neo4j.kernel.availability.CompositeDatabaseAvailabilityGuard
3542import org.neo4j.kernel.database.DatabaseTracers
3643import org.neo4j.kernel.database.DatabaseTracers.EMPTY
@@ -61,7 +68,6 @@ import org.neo4j.test.extension.Inject
6168import org.neo4j.test.extension.Neo4jLayoutExtension
6269import org.neo4j.test.extension.pagecache.PageCacheExtension
6370import streams.utils.JSONUtils
64- import java.io.IOException
6571import java.lang.String.valueOf
6672import java.nio.file.DirectoryStream
6773import java.nio.file.Path
@@ -120,7 +126,15 @@ class KafkaNeo4jRecoveryTSE: KafkaEventSinkBaseTSE() {
120126
121127 @Test
122128 fun recoverEmptyDatabase () {
123- createDatabase()
129+ val config = Config .newBuilder()
130+ .set(GraphDatabaseInternalSettings .skip_default_indexes_on_creation, true )
131+ .set(preallocate_logical_logs, false )
132+ .build()
133+
134+ managementService = TestDatabaseManagementServiceBuilder (neo4jLayout)
135+ .setConfig(config)
136+ .build()
137+ managementService!! .database(databaseLayout!! .databaseName) as GraphDatabaseAPI
124138 managementService!! .shutdown()
125139 sendKafkaEvents()
126140 RecoveryHelpers .removeLastCheckpointRecordFromLastLogFile(databaseLayout, fileSystem)
@@ -139,7 +153,7 @@ class KafkaNeo4jRecoveryTSE: KafkaEventSinkBaseTSE() {
139153 recoverDatabase()
140154 val recoveredDatabase: GraphDatabaseService = createDatabase()
141155 try {
142- recoveredDatabase.beginTx().use { tx -> assertEquals(numberOfNodes, count(tx.allNodes)) }
156+ recoveredDatabase.beginTx().use { tx -> assertEquals(numberOfNodes.toLong() , count(tx.allNodes)) }
143157 } finally {
144158 managementService!! .shutdown()
145159 }
@@ -161,7 +175,7 @@ class KafkaNeo4jRecoveryTSE: KafkaEventSinkBaseTSE() {
161175 assertThat(pageCacheTracer.hits() + pageCacheTracer.faults()).isEqualTo(pageCacheTracer.pins())
162176 val recoveredDatabase: GraphDatabaseService = createDatabase()
163177 try {
164- recoveredDatabase.beginTx().use { tx -> assertEquals(numberOfNodes, count(tx.allNodes)) }
178+ recoveredDatabase.beginTx().use { tx -> assertEquals(numberOfNodes.toLong() , count(tx.allNodes)) }
165179 } finally {
166180 managementService!! .shutdown()
167181 }
@@ -186,9 +200,9 @@ class KafkaNeo4jRecoveryTSE: KafkaEventSinkBaseTSE() {
186200 val recoveredDatabase: GraphDatabaseService = createDatabase()
187201 try {
188202 recoveredDatabase.beginTx().use { transaction ->
189- assertEquals(numberOfNodes, count(transaction.allNodes))
190- assertEquals(numberOfRelationships, count(transaction.allRelationships))
191- assertEquals(numberOfRelationships, count(transaction.allRelationshipTypesInUse))
203+ assertEquals(numberOfNodes.toLong() , count(transaction.allNodes))
204+ assertEquals(numberOfRelationships.toLong() , count(transaction.allRelationships))
205+ assertEquals(numberOfRelationships.toLong() , count(transaction.allRelationshipTypesInUse))
192206 }
193207 } finally {
194208 managementService!! .shutdown()
@@ -216,10 +230,10 @@ class KafkaNeo4jRecoveryTSE: KafkaEventSinkBaseTSE() {
216230 val recoveredDatabase: GraphDatabaseService = createDatabase()
217231 try {
218232 recoveredDatabase.beginTx().use { transaction ->
219- assertEquals(numberOfNodes, count(transaction.allNodes))
220- assertEquals(numberOfRelationships, count(transaction.allRelationships))
221- assertEquals(numberOfRelationships, count(transaction.allRelationshipTypesInUse))
222- assertEquals(numberOfNodes, count(transaction.allPropertyKeys))
233+ assertEquals(numberOfNodes.toLong() , count(transaction.allNodes))
234+ assertEquals(numberOfRelationships.toLong() , count(transaction.allRelationships))
235+ assertEquals(numberOfRelationships.toLong() , count(transaction.allRelationshipTypesInUse))
236+ assertEquals(numberOfNodes.toLong() , count(transaction.allPropertyKeys))
223237 }
224238 } finally {
225239 managementService!! .shutdown()
@@ -259,10 +273,10 @@ class KafkaNeo4jRecoveryTSE: KafkaEventSinkBaseTSE() {
259273 val recoveredDatabase: GraphDatabaseService = createDatabase()
260274 try {
261275 recoveredDatabase.beginTx().use { transaction ->
262- assertEquals(numberOfNodes, count(transaction.allNodes))
263- assertEquals(numberOfRelationships, count(transaction.allRelationships))
264- assertEquals(numberOfRelationships, count(transaction.allRelationshipTypesInUse))
265- assertEquals(numberOfPropertyKeys, count(transaction.allPropertyKeys))
276+ assertEquals(numberOfNodes.toLong() , count(transaction.allNodes))
277+ assertEquals(numberOfRelationships.toLong() , count(transaction.allRelationships))
278+ assertEquals(numberOfRelationships.toLong() , count(transaction.allRelationshipTypesInUse))
279+ assertEquals(numberOfPropertyKeys.toLong() , count(transaction.allPropertyKeys))
266280 }
267281 } finally {
268282 managementService!! .shutdown()
@@ -300,9 +314,10 @@ class KafkaNeo4jRecoveryTSE: KafkaEventSinkBaseTSE() {
300314 recoveredDatabase.beginTx().use { transaction ->
301315 val ktx = (transaction as InternalTransaction ).kernelTransaction()
302316 val index = ktx.schemaRead().indexGetForName(indexName)
317+ val indexReadSession = ktx.dataRead().indexReadSession(index)
303318 var relationshipsInIndex = 0
304- ktx.cursors().allocateRelationshipIndexCursor (ktx.pageCursorTracer ()).use { cursor ->
305- ktx.dataRead().relationshipIndexSeek(index , cursor, unconstrained(), fulltextSearch(" *" ))
319+ ktx.cursors().allocateRelationshipValueIndexCursor (ktx.cursorContext(), ktx.memoryTracker ()).use { cursor ->
320+ ktx.dataRead().relationshipIndexSeek(indexReadSession , cursor, unconstrained(), fulltextSearch(" *" ))
306321 while (cursor.next()) {
307322 relationshipsInIndex++
308323 }
@@ -395,7 +410,8 @@ class KafkaNeo4jRecoveryTSE: KafkaEventSinkBaseTSE() {
395410 pageCache,
396411 database.databaseLayout().metadataStore(),
397412 LAST_MISSING_STORE_FILES_RECOVERY_TIMESTAMP ,
398- NULL
413+ databaseLayout!! .databaseName,
414+ CursorContext .NULL
399415 )
400416 )
401417 managementService!! .shutdown()
@@ -558,7 +574,7 @@ class KafkaNeo4jRecoveryTSE: KafkaEventSinkBaseTSE() {
558574 }
559575 }
560576 monitors.addMonitorListener(recoveryMonitor)
561- val service = builderWithRelationshipTypeScanStoreSet (layout.neo4jLayout)
577+ val service = createTestDatabaseBuilder (layout.neo4jLayout)
562578 .addExtension(guardExtensionFactory)
563579 .setMonitors(monitors).build()
564580 try {
@@ -599,16 +615,14 @@ class KafkaNeo4jRecoveryTSE: KafkaEventSinkBaseTSE() {
599615 }
600616
601617 private fun recoverDatabase (databaseTracers : DatabaseTracers ) {
602- val config =
603- Config .newBuilder().set(enable_relationship_type_scan_store, enableRelationshipTypeScanStore()).build()
618+ val config = Config .newBuilder().build()
604619 assertTrue(isRecoveryRequired(databaseLayout, config))
605620 performRecovery(fileSystem, pageCache, databaseTracers, config, databaseLayout, INSTANCE )
606621 assertFalse(isRecoveryRequired(databaseLayout, config))
607622 }
608623
609624 private fun isRecoveryRequired (layout : DatabaseLayout ? ): Boolean {
610- val config =
611- Config .newBuilder().set(enable_relationship_type_scan_store, enableRelationshipTypeScanStore()).build()
625+ val config = Config .newBuilder().build()
612626 return isRecoveryRequired(layout, config)
613627 }
614628
@@ -625,7 +639,7 @@ class KafkaNeo4jRecoveryTSE: KafkaEventSinkBaseTSE() {
625639 private fun buildLogFiles (): LogFiles {
626640 return LogFilesBuilder
627641 .logFilesBasedOnlyBuilder(databaseLayout!! .transactionLogsDirectory, fileSystem)
628- .withCommandReaderFactory(StorageEngineFactory .selectStorageEngine ().commandReaderFactory())
642+ .withCommandReaderFactory(StorageEngineFactory .defaultStorageEngine ().commandReaderFactory())
629643 .build()
630644 }
631645
@@ -670,7 +684,7 @@ class KafkaNeo4jRecoveryTSE: KafkaEventSinkBaseTSE() {
670684
671685 private fun createBuilder (logThreshold : Long ) {
672686 if (builder == null ) {
673- builder = builderWithRelationshipTypeScanStoreSet ()
687+ builder = createTestDatabaseBuilder ()
674688 .setConfig(preallocate_logical_logs, false )
675689 .setConfig(logical_log_rotation_threshold, logThreshold)
676690 }
@@ -682,18 +696,17 @@ class KafkaNeo4jRecoveryTSE: KafkaEventSinkBaseTSE() {
682696 }
683697
684698 private fun forcedRecoveryManagement (): DatabaseManagementService {
685- return builderWithRelationshipTypeScanStoreSet ()
699+ return createTestDatabaseBuilder ()
686700 .setConfig(fail_on_missing_files, false )
687701 .build()
688702 }
689703
690- private fun builderWithRelationshipTypeScanStoreSet (): TestDatabaseManagementServiceBuilder {
691- return builderWithRelationshipTypeScanStoreSet (neo4jLayout)
704+ private fun createTestDatabaseBuilder (): TestDatabaseManagementServiceBuilder {
705+ return createTestDatabaseBuilder (neo4jLayout)
692706 }
693707
694- private fun builderWithRelationshipTypeScanStoreSet (neo4jLayout : Neo4jLayout ? ): TestDatabaseManagementServiceBuilder {
708+ private fun createTestDatabaseBuilder (neo4jLayout : Neo4jLayout ? ): TestDatabaseManagementServiceBuilder {
695709 return TestDatabaseManagementServiceBuilder (neo4jLayout)
696- .setConfig(enable_relationship_type_scan_store, enableRelationshipTypeScanStore())
697710 }
698711
699712 private fun getDatabasePageCache (databaseAPI : GraphDatabaseAPI ): PageCache {
@@ -708,7 +721,8 @@ class KafkaNeo4jRecoveryTSE: KafkaEventSinkBaseTSE() {
708721 restartedCache,
709722 databaseAPI.databaseLayout().metadataStore(),
710723 LAST_MISSING_STORE_FILES_RECOVERY_TIMESTAMP ,
711- NULL
724+ databaseLayout!! .databaseName,
725+ CursorContext .NULL
712726 )
713727 assertThat(record).isGreaterThan(0L )
714728 } finally {
0 commit comments