Replace file-based ClientTextStore with SQLite implementation (#5553)

* Replace file-based ClientTextStore with SQLite implementation

SQLite provides indexed lookups instead of loading/parsing a 5MB+ text file.
This should significantly reduce the ~142ms spent on loadTextStore during
game loading.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Add S3 sync for SQLite client text store

- Store dbPath and optional persister reference in SqliteClientTextStore
- Sync database file to cloud storage in saved() method
- Download from cloud storage on load if local file doesn't exist
- Pass persister to createWithData for new game creation

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Sync SQLite to S3 immediately after migration

Prevents data loss if server restarts before saved() is called after
migrating from old text-based format to SQLite.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
2026-02-14 16:01:52 -08:00
committed by GitHub
co-authored by Claude Opus 4.5
parent 90ebd1a5be
commit 16a4b8f87e
12 changed files with 1166 additions and 33 deletions
+27
View File
@@ -60,6 +60,7 @@
"org.scalamock:scalamock_3": -610483078,
"org.slf4j:slf4j-api": 1609745898,
"org.slf4j:slf4j-simple": 1319506696,
"org.xerial:sqlite-jdbc": -1707012205,
"repositories": -1949687017,
"software.amazon.awssdk:aws-core": 1764800397,
"software.amazon.awssdk:http-client-spi": 1697477859,
@@ -173,6 +174,7 @@
"org.scalamock:scalamock_3": -1778657085,
"org.slf4j:slf4j-api": -771685699,
"org.slf4j:slf4j-simple": -776509812,
"org.xerial:sqlite-jdbc": 1311600081,
"software.amazon.awssdk:annotations": -324257201,
"software.amazon.awssdk:apache-client": 2066024214,
"software.amazon.awssdk:arns": -1240703529,
@@ -816,6 +818,12 @@
},
"version": "2.0.16"
},
"org.xerial:sqlite-jdbc": {
"shasums": {
"jar": "6dc7464e3803648d3ff18a7359bab6adf079fcd8495b18991f6f5edcb8ac6e3b"
},
"version": "3.46.1.0"
},
"software.amazon.awssdk:annotations": {
"shasums": {
"jar": "ed03bb4ff78900307dc96bacdec70ddf80c17df3eb6761219573025649f08ff3"
@@ -1352,6 +1360,9 @@
"org.slf4j:slf4j-simple": [
"org.slf4j:slf4j-api"
],
"org.xerial:sqlite-jdbc": [
"org.slf4j:slf4j-api"
],
"software.amazon.awssdk:apache-client": [
"commons-codec:commons-codec",
"org.apache.httpcomponents:httpclient",
@@ -2404,6 +2415,16 @@
"org.slf4j:slf4j-simple": [
"org.slf4j.simple"
],
"org.xerial:sqlite-jdbc": [
"org.sqlite",
"org.sqlite.core",
"org.sqlite.date",
"org.sqlite.javax",
"org.sqlite.jdbc3",
"org.sqlite.jdbc4",
"org.sqlite.nativeimage",
"org.sqlite.util"
],
"software.amazon.awssdk:annotations": [
"software.amazon.awssdk.annotations"
],
@@ -2814,6 +2835,7 @@
"org.scalamock:scalamock_3",
"org.slf4j:slf4j-api",
"org.slf4j:slf4j-simple",
"org.xerial:sqlite-jdbc",
"software.amazon.awssdk:annotations",
"software.amazon.awssdk:apache-client",
"software.amazon.awssdk:arns",
@@ -2890,6 +2912,11 @@
"org.slf4j.simple.SimpleServiceProvider"
]
},
"org.xerial:sqlite-jdbc": {
"java.sql.Driver": [
"org.sqlite.JDBC"
]
},
"software.amazon.awssdk:apache-client": {
"software.amazon.awssdk.http.SdkHttpService": [
"software.amazon.awssdk.http.apache.ApacheSdkHttpService"