Skip to content

Commit 3c9f6d5

Browse files
Merge pull request #261 from JetBrains/pavel-nikolaev/XD-1199_reuse-db-configs
XD-1199 reused db configs during db and provider initialisation, #XD-…
2 parents e3d042e + b6d3a4d commit 3c9f6d5

File tree

10 files changed

+105
-85
lines changed

10 files changed

+105
-85
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
/*
2+
* Copyright ${inceptionYear} - ${year} ${owner}
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* https://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
import com.jetbrains.youtrack.db.api.YouTrackDB
17+
import com.jetbrains.youtrack.db.api.YourTracks
18+
import com.jetbrains.youtrack.db.api.config.GlobalConfiguration
19+
import com.jetbrains.youtrack.db.api.config.YouTrackDBConfig
20+
import com.jetbrains.youtrack.db.internal.core.db.YouTrackDBImpl
21+
import jetbrains.exodus.entitystore.youtrackdb.YTDBDatabaseConfig
22+
import jetbrains.exodus.entitystore.youtrackdb.YTDBDatabaseProvider
23+
import jetbrains.exodus.entitystore.youtrackdb.YTDBDatabaseProviderImpl
24+
import java.util.*
25+
26+
object YouTrackDBConfigFactory {
27+
28+
fun createDefaultDBConfig(params: YTDBDatabaseConfig): YouTrackDBConfig {
29+
return YouTrackDBConfig.builder()
30+
.addGlobalConfigurationParameter(GlobalConfiguration.AUTO_CLOSE_AFTER_DELAY, true)
31+
.addGlobalConfigurationParameter(GlobalConfiguration.AUTO_CLOSE_DELAY, params.closeAfterDelayTimeout)
32+
.addGlobalConfigurationParameter(GlobalConfiguration.NON_TX_READS_WARNING_MODE, "SILENT")
33+
.apply {
34+
params.cipherKey?.also { key ->
35+
addGlobalConfigurationParameter(
36+
GlobalConfiguration.STORAGE_ENCRYPTION_KEY,
37+
Base64.getEncoder().encodeToString(key)
38+
)
39+
}
40+
}
41+
.apply(params.tweakConfig)
42+
.build()
43+
}
44+
}
45+
46+
object YouTrackDBFactory {
47+
48+
fun initYouTrackDb(params: YTDBDatabaseConfig, dbConfig: YouTrackDBConfig): YouTrackDB {
49+
return YourTracks.embedded(params.connectionConfig.databaseRoot, dbConfig).apply {
50+
(this as? YouTrackDBImpl)?.let {
51+
it.serverPassword = params.connectionConfig.password
52+
it.serverUser = params.connectionConfig.userName
53+
}
54+
}
55+
}
56+
}
57+
58+
object YTDBDatabaseProviderFactory {
59+
60+
fun createProviderWithDb(params: YTDBDatabaseConfig): YTDBDatabaseProvider {
61+
val dbConfig = YouTrackDBConfigFactory.createDefaultDBConfig(params)
62+
val youTrackDb = YouTrackDBFactory.initYouTrackDb(params, dbConfig)
63+
return createProvider(params, youTrackDb, dbConfig)
64+
}
65+
66+
fun createProvider(params: YTDBDatabaseConfig, db: YouTrackDB, dbConfig: YouTrackDBConfig): YTDBDatabaseProvider {
67+
return YTDBDatabaseProviderImpl(params, db, dbConfig)
68+
}
69+
}

entity-store/src/main/kotlin/jetbrains/exodus/entitystore/youtrackdb/YTDBDatabaseProvider.kt

-23
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,7 @@
1616
package jetbrains.exodus.entitystore.youtrackdb
1717

1818
import com.jetbrains.youtrack.db.api.DatabaseSession
19-
import com.jetbrains.youtrack.db.api.YouTrackDB
20-
import com.jetbrains.youtrack.db.api.YourTracks
21-
import com.jetbrains.youtrack.db.api.config.GlobalConfiguration
22-
import com.jetbrains.youtrack.db.api.config.YouTrackDBConfig
23-
import com.jetbrains.youtrack.db.api.exception.RecordDuplicatedException
2419
import com.jetbrains.youtrack.db.internal.core.db.DatabaseRecordThreadLocal
25-
import com.jetbrains.youtrack.db.internal.core.db.YouTrackDBImpl
2620

2721
interface YTDBDatabaseProvider {
2822
val databaseLocation: String
@@ -94,20 +88,3 @@ internal fun hasActiveSession(): Boolean {
9488
val db = DatabaseRecordThreadLocal.instance().getIfDefined()
9589
return db != null
9690
}
97-
98-
fun initYouTrackDb(config: YTDBDatabaseConnectionConfig): YouTrackDB {
99-
val orientConfig = YouTrackDBConfig.builder().apply {
100-
addGlobalConfigurationParameter(GlobalConfiguration.AUTO_CLOSE_AFTER_DELAY, true)
101-
addGlobalConfigurationParameter(
102-
GlobalConfiguration.AUTO_CLOSE_DELAY,
103-
config.closeAfterDelayTimeout
104-
)
105-
addGlobalConfigurationParameter(GlobalConfiguration.NON_TX_READS_WARNING_MODE, "SILENT")
106-
}.build()
107-
return YourTracks.embedded(config.databaseRoot, orientConfig).apply {
108-
(this as? YouTrackDBImpl)?.let {
109-
it.serverPassword = config.password
110-
it.serverUser = config.userName
111-
}
112-
}
113-
}

entity-store/src/main/kotlin/jetbrains/exodus/entitystore/youtrackdb/YTDBDatabaseProviderImpl.kt

+3-20
Original file line numberDiff line numberDiff line change
@@ -17,39 +17,22 @@ package jetbrains.exodus.entitystore.youtrackdb
1717

1818
import com.jetbrains.youtrack.db.api.DatabaseSession
1919
import com.jetbrains.youtrack.db.api.YouTrackDB
20-
import com.jetbrains.youtrack.db.api.config.GlobalConfiguration
2120
import com.jetbrains.youtrack.db.api.config.YouTrackDBConfig
2221
import java.io.File
23-
import java.util.*
2422

2523
//username and password are considered to be same for all databases
2624
//todo this params also should be collected in some config entity
2725
class YTDBDatabaseProviderImpl(
2826
private val config: YTDBDatabaseConfig,
29-
private val database: YouTrackDB
27+
private val database: YouTrackDB,
28+
private val dbConfig: YouTrackDBConfig = YouTrackDBConfigFactory.createDefaultDBConfig(config)
3029
) : YTDBDatabaseProvider {
31-
private val youTrackDBConfig: YouTrackDBConfig
3230
override var isOpen: Boolean = false
3331
private set
3432

3533
init {
3634
require(config.connectionConfig.userName.matches(Regex("^[a-zA-Z0-9]*$")))
3735

38-
youTrackDBConfig = YouTrackDBConfig.builder().apply {
39-
addGlobalConfigurationParameter(GlobalConfiguration.AUTO_CLOSE_AFTER_DELAY, true)
40-
addGlobalConfigurationParameter(
41-
GlobalConfiguration.AUTO_CLOSE_DELAY,
42-
config.closeAfterDelayTimeout
43-
)
44-
config.cipherKey?.let {
45-
addGlobalConfigurationParameter(
46-
GlobalConfiguration.STORAGE_ENCRYPTION_KEY,
47-
Base64.getEncoder().encodeToString(it)
48-
)
49-
}
50-
config.tweakConfig(this)
51-
}.build()
52-
5336
database.createIfNotExists(
5437
config.databaseName,
5538
config.databaseType,
@@ -125,7 +108,7 @@ class YTDBDatabaseProviderImpl(
125108
config.databaseName,
126109
config.connectionConfig.userName,
127110
config.connectionConfig.password,
128-
youTrackDBConfig
111+
dbConfig
129112
).acquire()
130113
}
131114

entity-store/src/test/kotlin/jetbrains/exodus/entitystore/youtrackdb/DBCompactTest.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ class DBCompactTest {
3535
tx.createIssueImpl("Test issue $it")
3636
}
3737
}
38-
orientDb.provider.compact()
38+
(orientDb.provider as YTDBDatabaseProviderImpl).compact()
3939
orientDb.withStoreTx {
4040
val size = it.getAll(Issues.CLASS).size()
4141
Assert.assertEquals(100, size)

entity-store/src/test/kotlin/jetbrains/exodus/entitystore/youtrackdb/EncryptedDBTest.kt

+11-8
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@
1515
*/
1616
package jetbrains.exodus.entitystore.youtrackdb
1717

18+
import YTDBDatabaseProviderFactory
19+
import YouTrackDBConfigFactory
20+
import YouTrackDBFactory
1821
import com.jetbrains.youtrack.db.api.DatabaseType
1922
import com.jetbrains.youtrack.db.api.YouTrackDB
2023
import com.jetbrains.youtrack.db.api.exception.RecordNotFoundException
@@ -27,7 +30,6 @@ import org.junit.Assert
2730
import org.junit.Test
2831
import org.junit.runner.RunWith
2932
import org.junit.runners.Parameterized
30-
import java.lang.AssertionError
3133
import java.nio.file.Files
3234
import java.util.*
3335
import kotlin.io.path.absolutePathString
@@ -42,7 +44,7 @@ class EncryptedDBTest(val number: Int) {
4244
}
4345
}
4446

45-
lateinit var provider: YTDBDatabaseProviderImpl
47+
lateinit var provider: YTDBDatabaseProvider
4648
lateinit var db: YouTrackDB
4749

4850
private fun createConfig(key: ByteArray?): YTDBDatabaseConfig {
@@ -74,8 +76,9 @@ class EncryptedDBTest(val number: Int) {
7476
val config = createConfig(cipherKey)
7577
val noEncryptionConfig = createConfig(null)
7678
logger.info("Connect to db and create test vertex class")
77-
db = initYouTrackDb(config.connectionConfig)
78-
provider = YTDBDatabaseProviderImpl(config, db)
79+
val dbConfig = YouTrackDBConfigFactory.createDefaultDBConfig(config)
80+
db = YouTrackDBFactory.initYouTrackDb(config, dbConfig)
81+
provider = YTDBDatabaseProviderFactory.createProvider(config, db, dbConfig)
7982
provider.withSession { session ->
8083
session.createVertexClass("TEST")
8184
}
@@ -91,8 +94,8 @@ class EncryptedDBTest(val number: Int) {
9194
logger.info("Close the DB")
9295
Thread.sleep(1000)
9396
logger.info("Connect to db one more time and read")
94-
db = initYouTrackDb(config.connectionConfig)
95-
provider = YTDBDatabaseProviderImpl(config, db)
97+
db = YouTrackDBFactory.initYouTrackDb(config, dbConfig)
98+
provider = YTDBDatabaseProviderFactory.createProvider(config, db, dbConfig)
9699
provider.withSession { session ->
97100
session.executeInTx {
98101
val vertex = session.query("SELECT FROM TEST").vertexStream().toList()
@@ -103,9 +106,9 @@ class EncryptedDBTest(val number: Int) {
103106
db.close()
104107
Thread.sleep(1000)
105108
logger.info("Connect to db one more time without encryption")
106-
db = initYouTrackDb(config.connectionConfig)
109+
db = YouTrackDBFactory.initYouTrackDb(config, dbConfig)
107110
try {
108-
YTDBDatabaseProviderImpl(noEncryptionConfig, db).apply {
111+
YTDBDatabaseProviderFactory.createProvider(noEncryptionConfig, db, dbConfig).apply {
109112
withSession { session ->
110113
session.executeInTx {
111114
val vertex = session.query("SELECT FROM TEST").vertexStream().toList()

entity-store/src/test/kotlin/jetbrains/exodus/entitystore/youtrackdb/WrongUsernameTest.kt

+3-6
Original file line numberDiff line numberDiff line change
@@ -15,15 +15,13 @@
1515
*/
1616
package jetbrains.exodus.entitystore.orientdb
1717

18+
import YTDBDatabaseProviderFactory
1819
import com.jetbrains.youtrack.db.api.DatabaseType
1920
import jetbrains.exodus.entitystore.youtrackdb.YTDBDatabaseConfig
2021
import jetbrains.exodus.entitystore.youtrackdb.YTDBDatabaseConnectionConfig
21-
import jetbrains.exodus.entitystore.youtrackdb.YTDBDatabaseProvider
22-
import jetbrains.exodus.entitystore.youtrackdb.YTDBDatabaseProviderImpl
23-
import jetbrains.exodus.entitystore.youtrackdb.initYouTrackDb
22+
import org.junit.Test
2423
import java.nio.file.Files
2524
import kotlin.io.path.absolutePathString
26-
import org.junit.Test
2725

2826
class WrongUsernameTest {
2927

@@ -36,12 +34,11 @@ class WrongUsernameTest {
3634
.withDatabaseType(DatabaseType.MEMORY)
3735
.withDatabaseRoot(Files.createTempDirectory("haha").absolutePathString())
3836
.build()
39-
val db = initYouTrackDb(cfg)
4037
val config = YTDBDatabaseConfig.builder()
4138
.withDatabaseName("hello")
4239
.withConnectionConfig(cfg)
4340
.build()
44-
YTDBDatabaseProviderImpl(config, db)
41+
YTDBDatabaseProviderFactory.createProviderWithDb(config)
4542
}
4643

4744

entity-store/src/test/kotlin/jetbrains/exodus/entitystore/youtrackdb/testutil/InMemoryYouTrackDB.kt

+5-7
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,6 @@ package jetbrains.exodus.entitystore.youtrackdb.testutil
1818
import com.jetbrains.youtrack.db.api.DatabaseSession
1919
import com.jetbrains.youtrack.db.api.DatabaseType
2020
import com.jetbrains.youtrack.db.api.YouTrackDB
21-
import com.jetbrains.youtrack.db.api.config.GlobalConfiguration
22-
import com.jetbrains.youtrack.db.api.config.YouTrackDBConfig
2321
import jetbrains.exodus.entitystore.youtrackdb.*
2422
import jetbrains.exodus.entitystore.youtrackdb.testutil.Issues.Links.IN_PROJECT
2523
import jetbrains.exodus.entitystore.youtrackdb.testutil.Issues.Links.ON_BOARD
@@ -37,7 +35,7 @@ class InMemoryYouTrackDB(
3735
lateinit var store: YTDBPersistentEntityStore
3836
private set
3937

40-
lateinit var provider: YTDBDatabaseProviderImpl
38+
lateinit var provider: YTDBDatabaseProvider
4139
lateinit var schemaBuddy: YTDBSchemaBuddyImpl
4240

4341
val username = "admin"
@@ -56,10 +54,10 @@ class InMemoryYouTrackDB(
5654
.withConnectionConfig(connConfig)
5755
.withDatabaseName(dbName)
5856
.build()
59-
val builder = YouTrackDBConfig.builder()
60-
builder.addGlobalConfigurationParameter(GlobalConfiguration.NON_TX_READS_WARNING_MODE, "SILENT")
61-
db = initYouTrackDb(connConfig)
62-
provider = YTDBDatabaseProviderImpl(config, db)
57+
58+
val dbConfig = YouTrackDBConfigFactory.createDefaultDBConfig(config)
59+
db = YouTrackDBFactory.initYouTrackDb(config, dbConfig)
60+
provider = YTDBDatabaseProviderFactory.createProvider(config, db, dbConfig) as YTDBDatabaseProviderImpl
6361

6462
if (initializeIssueSchema) {
6563
provider.withSession { session ->

query/src/main/kotlin/jetbrains/exodus/query/metadata/MigrateXodusToOrient.kt

+5-7
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,7 @@ package jetbrains.exodus.query.metadata
1717

1818

1919
import com.jetbrains.youtrack.db.api.DatabaseType
20-
import jetbrains.exodus.entitystore.youtrackdb.YTDBDatabaseConfig
21-
import jetbrains.exodus.entitystore.youtrackdb.YTDBDatabaseConnectionConfig
22-
import jetbrains.exodus.entitystore.youtrackdb.YTDBDatabaseProviderImpl
23-
import jetbrains.exodus.entitystore.youtrackdb.initYouTrackDb
20+
import jetbrains.exodus.entitystore.youtrackdb.*
2421

2522
fun main() {
2623
val xodusDatabaseDirectory = requireParam("xodusDatabaseDirectory")
@@ -102,11 +99,12 @@ fun main() {
10299

103100
val config = YTDBDatabaseConfig.builder()
104101
.withDatabaseName(orientDatabaseName)
102+
.withConnectionConfig(connectionConfig)
105103
.build()
106104

107-
val db = initYouTrackDb(connectionConfig)
108-
// create a provider
109-
val dbProvider = YTDBDatabaseProviderImpl(config, db)
105+
val dbConfig = YouTrackDBConfigFactory.createDefaultDBConfig(config)
106+
val db = YouTrackDBFactory.initYouTrackDb(config, dbConfig)
107+
val dbProvider = YTDBDatabaseProviderFactory.createProvider(config, db, dbConfig)
110108

111109
val launcher = XodusToOrientDataMigratorLauncher(
112110
xodus = MigrateFromXodusConfig(

query/src/test/kotlin/jetbrains/exodus/query/metadata/MigrateXodusToOrientDbSmokeTest.kt

+3-7
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,6 @@
1616
package jetbrains.exodus.query.metadata
1717

1818
import com.jetbrains.youtrack.db.api.DatabaseType
19-
import com.jetbrains.youtrack.db.api.config.GlobalConfiguration
20-
import com.jetbrains.youtrack.db.api.config.YouTrackDBConfig
2119
import com.jetbrains.youtrack.db.api.record.Direction
2220
import com.jetbrains.youtrack.db.api.record.Vertex
2321
import jetbrains.exodus.TestUtil
@@ -41,9 +39,6 @@ class MigrateXodusToOrientDbSmokeTest {
4139
val username = "admin"
4240
val password = "password"
4341
val dbName = "testDB"
44-
// create the database
45-
val builder = YouTrackDBConfig.builder()
46-
builder.addGlobalConfigurationParameter(GlobalConfiguration.NON_TX_READS_WARNING_MODE, "SILENT")
4742
val connectionConfig = YTDBDatabaseConnectionConfig.builder()
4843
.withPassword(password)
4944
.withUserName(username)
@@ -56,10 +51,11 @@ class MigrateXodusToOrientDbSmokeTest {
5651
.withDatabaseName("MEMORY")
5752
.build()
5853

59-
val db = initYouTrackDb(connectionConfig)
54+
val dbConfig = YouTrackDBConfigFactory.createDefaultDBConfig(config)
55+
val db = YouTrackDBFactory.initYouTrackDb(config, dbConfig)
6056
db.execute("create database $dbName MEMORY users ( $username identified by '$password' role admin )")
6157
// create a provider
62-
val dbProvider = YTDBDatabaseProviderImpl(config, db)
58+
val dbProvider = YTDBDatabaseProviderFactory.createProvider(config, db, dbConfig)
6359

6460
// 1.2 Create OModelMetadata
6561
// it is important to disable autoInitialize for the schemaBuddy,

query/src/test/kotlin/jetbrains/exodus/query/metadata/MigrateYourDatabaseTest.kt

+5-6
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,7 @@
1616
package jetbrains.exodus.query.metadata
1717

1818
import com.jetbrains.youtrack.db.api.DatabaseType
19-
import jetbrains.exodus.entitystore.youtrackdb.YTDBDatabaseConfig
20-
import jetbrains.exodus.entitystore.youtrackdb.YTDBDatabaseConnectionConfig
21-
import jetbrains.exodus.entitystore.youtrackdb.YTDBDatabaseProviderImpl
22-
import jetbrains.exodus.entitystore.youtrackdb.initYouTrackDb
19+
import jetbrains.exodus.entitystore.youtrackdb.*
2320
import org.junit.Test
2421
import kotlin.test.Ignore
2522

@@ -49,10 +46,12 @@ class MigrateYourDatabaseTest {
4946

5047
val config = YTDBDatabaseConfig.builder()
5148
.withDatabaseName("testDB")
49+
.withConnectionConfig(connectionConfig)
5250
.build()
5351

54-
val db = initYouTrackDb(connectionConfig)
55-
val provider = YTDBDatabaseProviderImpl(config, db)
52+
val dbConfig = YouTrackDBConfigFactory.createDefaultDBConfig(config)
53+
val db = YouTrackDBFactory.initYouTrackDb(config, dbConfig)
54+
val provider = YTDBDatabaseProviderFactory.createProvider(config, db, dbConfig)
5655
val launcher = XodusToOrientDataMigratorLauncher(
5756
orient = MigrateToOrientConfig(
5857
db = db,

0 commit comments

Comments
 (0)