Skip to content

Commit 313f7b3

Browse files
committed
feat(engine): switch to JAR-bundled native library loading
Replace manual native library path management with JAR-bundled native library from slatedb/slatedb#1329. NativeLibraryLoader automatically extracts and loads the platform-specific library from classpath resources. - Remove SlateDb.loadLibrary(path) calls (API removed in upstream PR) - Use SlateDb.initLogging(SlateDbConfig.LogLevel.INFO) for initialization - Remove libraryPath from SlateDbOptions, SlateDbConnections, tests, and config - Remove working directory hack in server bootRun task Tested: all 4 SlateDB test suites pass (SlateDbTableTest, SlateDbStorageTest, SlateDbHashLabelTest, SlateDbIndexedLabelTest)
1 parent 50535b3 commit 313f7b3

9 files changed

Lines changed: 13 additions & 76 deletions

File tree

engine/src/main/kotlin/com/kakao/actionbase/v2/engine/storage/slatedb/SlateDbConnections.kt

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,34 +6,33 @@ import java.util.concurrent.ConcurrentHashMap
66
import java.util.concurrent.atomic.AtomicBoolean
77

88
import io.slatedb.SlateDb
9+
import io.slatedb.SlateDbConfig
910
import reactor.core.publisher.Mono
1011
import reactor.core.scheduler.Schedulers
1112

1213
object SlateDbConnections {
1314
private val logger = getLogger()
1415

15-
private val libraryLoaded = AtomicBoolean(false)
16+
private val initialized = AtomicBoolean(false)
1617
private val connections: ConcurrentHashMap<String, Mono<SlateDbTable>> = ConcurrentHashMap()
1718

18-
fun loadLibrary(libraryPath: String) {
19-
if (libraryLoaded.compareAndSet(false, true)) {
20-
logger.info("Loading SlateDB native library from: {}", libraryPath)
21-
SlateDb.loadLibrary(libraryPath)
22-
SlateDb.initLogging("info")
19+
fun ensureInitialized() {
20+
if (initialized.compareAndSet(false, true)) {
21+
logger.info("Initializing SlateDB (native library loaded from JAR classpath)")
22+
SlateDb.initLogging(SlateDbConfig.LogLevel.INFO)
2323
}
2424
}
2525

2626
fun getConnection(
2727
dbPath: String,
2828
url: String,
29-
libraryPath: String,
3029
): Mono<SlateDbTable> {
3130
val cacheKey = getCacheKey(dbPath, url)
3231

3332
return connections.computeIfAbsent(cacheKey) { key ->
3433
Mono
3534
.fromCallable {
36-
loadLibrary(libraryPath)
35+
ensureInitialized()
3736
val db = SlateDb.open(dbPath, url, null)
3837
SlateDbTable.create(db)
3938
}.subscribeOn(Schedulers.boundedElastic())

engine/src/main/kotlin/com/kakao/actionbase/v2/engine/storage/slatedb/SlateDbOptions.kt

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,9 @@ import reactor.core.publisher.Mono
88
data class SlateDbOptions(
99
val path: String = "data",
1010
val url: String = "",
11-
val libraryPath: String = "",
1211
) {
1312
fun checkConnection(): Mono<Boolean> =
14-
if (url.isBlank() || libraryPath.isBlank()) {
13+
if (url.isBlank()) {
1514
Mono.just(false)
1615
} else {
1716
Mono.just(true)
@@ -21,6 +20,5 @@ data class SlateDbOptions(
2120
SlateDbConnections.getConnection(
2221
dbPath = path,
2322
url = url,
24-
libraryPath = libraryPath,
2523
)
2624
}

engine/src/test/kotlin/com/kakao/actionbase/engine/datastore/SlateDBDatastoreCompatibilityTest.kt

Lines changed: 2 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,12 @@ import org.junit.jupiter.api.TestInstance
1414
import org.junit.jupiter.api.io.TempDir
1515

1616
import io.slatedb.SlateDb
17+
import io.slatedb.SlateDbConfig
1718

1819
/**
1920
* SlateDB compatibility test.
2021
*
2122
* Disabled by default. Set SLATEDB_TEST=true to run.
22-
* Requires native library: native/lib/libslatedb_c.dylib (macOS) or libslatedb_c.so (Linux)
2323
*
2424
* To run:
2525
* SLATEDB_TEST=true ./gradlew :engine:test --tests "*SlateDBDatastoreCompatibilityTest*"
@@ -37,7 +37,7 @@ class SlateDBDatastoreCompatibilityTest : DatastoreCompatibilityTest() {
3737
) {
3838
assumeTrue(enabled, "SLATEDB_TEST=true not set")
3939
tempDir = dir
40-
SlateDb.loadLibrary(findLibraryPath())
40+
SlateDb.initLogging(SlateDbConfig.LogLevel.INFO)
4141
val db = SlateDb.open("data", "file://${tempDir.toAbsolutePath()}", null)
4242
table = SlateDbTable.create(db)
4343
}
@@ -59,20 +59,6 @@ class SlateDBDatastoreCompatibilityTest : DatastoreCompatibilityTest() {
5959
}
6060
}
6161

62-
private fun findLibraryPath(): String {
63-
var dir = Path.of(System.getProperty("user.dir"))
64-
while (!dir.resolve("settings.gradle.kts").toFile().exists() && dir.parent != null) {
65-
dir = dir.parent
66-
}
67-
val libName =
68-
if (System.getProperty("os.name").lowercase().contains("linux")) {
69-
"libslatedb_c.so"
70-
} else {
71-
"libslatedb_c.dylib"
72-
}
73-
return dir.resolve("native/lib/$libName").toAbsolutePath().toString()
74-
}
75-
7662
private class SlateDBOperations(
7763
private val table: SlateDbTable,
7864
) : StorageOperations {

engine/src/test/kotlin/com/kakao/actionbase/v2/engine/label/slatedb/SlateDbHashLabelTest.kt

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ import java.nio.file.Path
2626
import java.util.UUID
2727

2828
import org.junit.jupiter.api.AfterEach
29-
import org.junit.jupiter.api.Assumptions.assumeTrue
3029
import org.junit.jupiter.api.BeforeEach
3130
import org.junit.jupiter.api.Test
3231
import org.junit.jupiter.api.io.TempDir
@@ -45,14 +44,6 @@ class SlateDbHashLabelTest {
4544
private val storageName = "slatedb_storage"
4645
private val labelName = "slatedb_label"
4746

48-
private fun findLibraryPath(): Path {
49-
var dir = Path.of(System.getProperty("user.dir"))
50-
while (!dir.resolve("settings.gradle.kts").toFile().exists() && dir.parent != null) {
51-
dir = dir.parent
52-
}
53-
return dir.resolve("native/lib/libslatedb_c.dylib")
54-
}
55-
5647
private fun createGraph(): Graph {
5748
val config =
5849
GraphConfig
@@ -64,9 +55,6 @@ class SlateDbHashLabelTest {
6455

6556
@BeforeEach
6657
fun setUp() {
67-
// Skip test if native library not found
68-
assumeTrue(findLibraryPath().toFile().exists(), "SlateDB native library not found")
69-
7058
graph = createGraph()
7159
graph.updateAllMetadata().block()
7260

@@ -82,7 +70,6 @@ class SlateDbHashLabelTest {
8270
jacksonObjectMapper().createObjectNode().apply {
8371
put("path", "test-data")
8472
put("url", "file://${tempDir.toAbsolutePath()}")
85-
put("libraryPath", findLibraryPath().toString())
8673
}
8774

8875
graph.storageDdl

engine/src/test/kotlin/com/kakao/actionbase/v2/engine/label/slatedb/SlateDbIndexedLabelTest.kt

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@ import java.nio.file.Path
2828
import java.util.UUID
2929

3030
import org.junit.jupiter.api.AfterEach
31-
import org.junit.jupiter.api.Assumptions.assumeTrue
3231
import org.junit.jupiter.api.BeforeEach
3332
import org.junit.jupiter.api.Test
3433
import org.junit.jupiter.api.io.TempDir
@@ -47,14 +46,6 @@ class SlateDbIndexedLabelTest {
4746
private val storageName = "slatedb_indexed_storage"
4847
private val labelName = "slatedb_indexed_label"
4948

50-
private fun findLibraryPath(): Path {
51-
var dir = Path.of(System.getProperty("user.dir"))
52-
while (!dir.resolve("settings.gradle.kts").toFile().exists() && dir.parent != null) {
53-
dir = dir.parent
54-
}
55-
return dir.resolve("native/lib/libslatedb_c.dylib")
56-
}
57-
5849
private fun createGraph(): Graph {
5950
val config =
6051
GraphConfig
@@ -66,9 +57,6 @@ class SlateDbIndexedLabelTest {
6657

6758
@BeforeEach
6859
fun setUp() {
69-
// Skip test if native library not found
70-
assumeTrue(findLibraryPath().toFile().exists(), "SlateDB native library not found")
71-
7260
graph = createGraph()
7361
graph.updateAllMetadata().block()
7462

@@ -84,7 +72,6 @@ class SlateDbIndexedLabelTest {
8472
jacksonObjectMapper().createObjectNode().apply {
8573
put("path", "test-data")
8674
put("url", "file://${tempDir.toAbsolutePath()}")
87-
put("libraryPath", findLibraryPath().toString())
8875
}
8976

9077
graph.storageDdl

engine/src/test/kotlin/com/kakao/actionbase/v2/engine/storage/slatedb/SlateDbStorageTest.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,6 @@ class SlateDbStorageTest {
4949
jacksonObjectMapper().createObjectNode().apply {
5050
put("path", "test-data")
5151
put("url", "file:///tmp/slatedb-test")
52-
put("libraryPath", "native/lib/libslatedb_c.dylib")
5352
}
5453

5554
GraphFixtures.createStorage(graph, "slatedb_test", StorageType.SLATEDB, conf)

engine/src/test/kotlin/com/kakao/actionbase/v2/engine/storage/slatedb/SlateDbTableTest.kt

Lines changed: 2 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import org.junit.jupiter.api.Test
1010
import org.junit.jupiter.api.io.TempDir
1111

1212
import io.slatedb.SlateDb
13+
import io.slatedb.SlateDbConfig
1314
import reactor.test.StepVerifier
1415

1516
class SlateDbTableTest {
@@ -18,24 +19,9 @@ class SlateDbTableTest {
1819

1920
private lateinit var table: SlateDbTable
2021

21-
private fun findLibraryPath(): String {
22-
var dir = Path.of(System.getProperty("user.dir"))
23-
while (!dir.resolve("settings.gradle.kts").toFile().exists() && dir.parent != null) {
24-
dir = dir.parent
25-
}
26-
val libName =
27-
if (System.getProperty("os.name").lowercase().contains("linux")) {
28-
"libslatedb_c.so"
29-
} else {
30-
"libslatedb_c.dylib"
31-
}
32-
return dir.resolve("native/lib/$libName").toAbsolutePath().toString()
33-
}
34-
3522
@BeforeEach
3623
fun setUp() {
37-
val libraryPath = findLibraryPath()
38-
SlateDb.loadLibrary(libraryPath)
24+
SlateDb.initLogging(SlateDbConfig.LogLevel.INFO)
3925

4026
val fileUrl = "file://${tempDir.toAbsolutePath()}"
4127
val dbPath = "data"

server/build.gradle.kts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -89,8 +89,6 @@ tasks.named<org.springframework.boot.gradle.tasks.run.BootRun>("bootRun") {
8989
languageVersion.set(JavaLanguageVersion.of(25))
9090
}
9191
)
92-
// Set working directory to project root for SlateDB native library path resolution
93-
workingDir = rootProject.projectDir
9492
}
9593

9694
jib {
Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
11
# SlateDB storage profile
22
# Usage: --spring.profiles.active=slatedb
33
#
4-
# Prerequisites:
5-
# 1. Build slatedb-c: ./native/build-slatedb.sh
6-
# 2. Set library path via environment variable or update libraryPath below
4+
# Native library is bundled in the slatedb JAR (loaded automatically from classpath).
75

86
actionbase:
97
tenant: ab-slatedb
@@ -15,4 +13,3 @@ kc:
1513
conf:
1614
path: data
1715
url: file://${SLATEDB_STORAGE_PATH:/tmp/actionbase-slatedb}
18-
libraryPath: ${SLATEDB_LIBRARY_PATH:native/lib/libslatedb_c.dylib}

0 commit comments

Comments
 (0)