Skip to content

Commit 362fe21

Browse files
Alice Johnsonarcs-c3po
authored andcommitted
Introduce an arcs runtime flag (diffbasedEntityInsertion) to determine whether to use the diffbased entity insertion approach or not.
PiperOrigin-RevId: 368110612
1 parent 2e9efd5 commit 362fe21

File tree

8 files changed

+65
-6
lines changed

8 files changed

+65
-6
lines changed

java/arcs/android/storage/database/AndroidSqliteDatabaseManager.kt

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,16 +12,19 @@
1212
package arcs.android.storage.database
1313

1414
import android.content.Context
15+
import androidx.annotation.VisibleForTesting
1516
import androidx.lifecycle.LifecycleObserver
1617
import arcs.core.storage.StorageKey
1718
import arcs.core.storage.StorageKeyManager
1819
import arcs.core.storage.database.Database
20+
import arcs.core.storage.database.DatabaseConfig
1921
import arcs.core.storage.database.DatabaseIdentifier
2022
import arcs.core.storage.database.DatabaseManager
2123
import arcs.core.storage.database.DatabasePerformanceStatistics.Snapshot
2224
import arcs.core.storage.database.runOnAllDatabases
2325
import arcs.core.storage.database.sumOnAllDatabases
2426
import arcs.core.util.guardedBy
27+
import java.util.concurrent.atomic.AtomicReference
2528
import kotlinx.coroutines.ExperimentalCoroutinesApi
2629
import kotlinx.coroutines.sync.Mutex
2730
import kotlinx.coroutines.sync.withLock
@@ -34,13 +37,16 @@ import kotlinx.coroutines.sync.withLock
3437
class AndroidSqliteDatabaseManager(
3538
context: Context,
3639
// Maximum size of the database file, if it surpasses this size, the database gets reset.
37-
maxDbSizeBytes: Int? = null
40+
maxDbSizeBytes: Int? = null,
41+
databaseConfig: DatabaseConfig = DatabaseConfig()
3842
) : DatabaseManager, LifecycleObserver {
3943
private val context = context.applicationContext
4044
private val mutex = Mutex()
4145
private val dbCache by guardedBy(mutex, mutableMapOf<DatabaseIdentifier, DatabaseImpl>())
4246
private val maxDbSize = maxDbSizeBytes ?: MAX_DB_SIZE_BYTES
4347
override val registry = AndroidSqliteDatabaseRegistry(context)
48+
@VisibleForTesting
49+
override var databaseConfig = AtomicReference(databaseConfig)
4450

4551
// TODO(b/174432505): Don't use the GLOBAL_INSTANCE, accept as a constructor param instead.
4652
private val storageKeyManager = StorageKeyManager.GLOBAL_INSTANCE
@@ -58,7 +64,7 @@ class AndroidSqliteDatabaseManager(
5864
val entry = registry.register(name, persistent)
5965
return mutex.withLock {
6066
dbCache[entry.name to entry.isPersistent]
61-
?: DatabaseImpl(context, storageKeyManager, name, persistent)
67+
?: DatabaseImpl(context, storageKeyManager, name, persistent, databaseConfig::get)
6268
.also {
6369
dbCache[entry.name to entry.isPersistent] = it
6470
}

java/arcs/android/storage/database/DatabaseImpl.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ import arcs.core.storage.StorageKey
5656
import arcs.core.storage.StorageKeyManager
5757
import arcs.core.storage.database.Database
5858
import arcs.core.storage.database.DatabaseClient
59+
import arcs.core.storage.database.DatabaseConfig
5960
import arcs.core.storage.database.DatabaseData
6061
import arcs.core.storage.database.DatabaseOp
6162
import arcs.core.storage.database.DatabasePerformanceStatistics
@@ -125,6 +126,7 @@ class DatabaseImpl(
125126
private val storageKeyManager: StorageKeyManager,
126127
databaseName: String,
127128
persistent: Boolean = true,
129+
@VisibleForTesting val databaseConfig: () -> DatabaseConfig,
128130
val onDatabaseClose: suspend () -> Unit = {}
129131
) : Database, SQLiteOpenHelper(
130132
context,

java/arcs/core/storage/database/DatabaseManager.kt

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ package arcs.core.storage.database
1313

1414
import arcs.core.common.collectExceptions
1515
import arcs.core.storage.StorageKey
16+
import java.util.concurrent.atomic.AtomicReference
1617
import kotlinx.coroutines.ExperimentalCoroutinesApi
1718
import kotlinx.coroutines.supervisorScope
1819

@@ -26,6 +27,9 @@ interface DatabaseManager {
2627
/** Manifest of [Database]s managed by this [DatabaseManager]. */
2728
val registry: DatabaseRegistry
2829

30+
/** Database Configurations */
31+
val databaseConfig: AtomicReference<DatabaseConfig>
32+
2933
/**
3034
* Gets a [Database] for the given [name]. If [persistent] is `false`, the [Database] should
3135
* only exist in-memory (if possible for the current platform).
@@ -87,6 +91,11 @@ interface DatabaseManager {
8791
* Extracts all IDs of any hard reference that points to the given [backingStorageKey].
8892
*/
8993
suspend fun getAllHardReferenceIds(backingStorageKey: StorageKey): Set<String>
94+
95+
/**
96+
* Updates the database configurations
97+
*/
98+
fun updateDatabaseConfig(databaseConfig: DatabaseConfig) = this.databaseConfig.set(databaseConfig)
9099
}
91100

92101
/**
@@ -136,3 +145,8 @@ val DatabaseIdentifier.name: String
136145
/** Whether or not the [Database] should be persisted to disk. */
137146
val DatabaseIdentifier.persistent: Boolean
138147
get() = second
148+
149+
/** Database configurations of the runtime flags relevant to the database and their values. */
150+
data class DatabaseConfig(
151+
val diffbasedEntityInsertion: Boolean = false
152+
)

java/arcs/jvm/storage/database/testutil/FakeDatabaseManager.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import arcs.core.data.Schema
1515
import arcs.core.storage.StorageKey
1616
import arcs.core.storage.database.Database
1717
import arcs.core.storage.database.DatabaseClient
18+
import arcs.core.storage.database.DatabaseConfig
1819
import arcs.core.storage.database.DatabaseData
1920
import arcs.core.storage.database.DatabaseIdentifier
2021
import arcs.core.storage.database.DatabaseManager
@@ -28,6 +29,7 @@ import arcs.core.util.guardedBy
2829
import arcs.core.util.performance.PerformanceStatistics
2930
import arcs.core.util.performance.Timer
3031
import arcs.jvm.util.JvmTime
32+
import java.util.concurrent.atomic.AtomicReference
3133
import kotlin.coroutines.coroutineContext
3234
import kotlin.reflect.KClass
3335
import kotlinx.coroutines.CoroutineScope
@@ -49,6 +51,7 @@ open class FakeDatabaseManager(val onGarbageCollection: () -> Unit = {}) : Datab
4951
private val _manifest = FakeDatabaseRegistry()
5052
private val clients = arrayListOf<DatabaseClient>()
5153
override val registry: FakeDatabaseRegistry = _manifest
54+
override var databaseConfig: AtomicReference<DatabaseConfig> = AtomicReference(DatabaseConfig())
5255

5356
fun addClients(vararg clients: DatabaseClient) = this.clients.addAll(clients)
5457

javatests/arcs/android/storage/database/AndroidSqliteDatabaseManagerTest.kt

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import arcs.core.data.SchemaFields
2121
import arcs.core.data.util.toReferencable
2222
import arcs.core.storage.RawReference
2323
import arcs.core.storage.StorageKeyManager
24+
import arcs.core.storage.database.DatabaseConfig
2425
import arcs.core.storage.database.DatabaseData
2526
import arcs.core.storage.database.DatabaseManager
2627
import arcs.core.storage.testutil.DummyStorageKey
@@ -267,6 +268,27 @@ class AndroidSqliteDatabaseManagerTest {
267268
assertThat(manager.removeEntitiesHardReferencing(refKey, "id2")).isEqualTo(0)
268269
}
269270

271+
@Test
272+
fun updateDatabaseConfig_updatesRuntimeFlags() = runBlockingTest {
273+
val database = manager.getDatabase("foo", true) as DatabaseImpl
274+
275+
val managerDatabaseConfigBefore = manager.databaseConfig.get()
276+
val databaseDatabaseConfigBefore = database.databaseConfig()
277+
278+
manager.updateDatabaseConfig(DatabaseConfig(diffbasedEntityInsertion = true))
279+
280+
val managerDatabaseConfigAfter = manager.databaseConfig.get()
281+
val databaseDatabaseConfigAfter = database.databaseConfig()
282+
283+
val expectedBefore = DatabaseConfig()
284+
val expectedAfter = DatabaseConfig(diffbasedEntityInsertion = true)
285+
286+
assertThat(managerDatabaseConfigBefore).isEqualTo(expectedBefore)
287+
assertThat(databaseDatabaseConfigBefore).isEqualTo(expectedBefore)
288+
assertThat(managerDatabaseConfigAfter).isEqualTo(expectedAfter)
289+
assertThat(databaseDatabaseConfigAfter).isEqualTo(expectedAfter)
290+
}
291+
270292
private fun entityWithHardRef(refId: String) = DatabaseData.Entity(
271293
RawEntity(
272294
collections = mapOf(

javatests/arcs/android/storage/database/DatabaseDowngradeTest.kt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import androidx.test.core.app.ApplicationProvider
1818
import androidx.test.ext.junit.runners.AndroidJUnit4
1919
import arcs.android.common.map
2020
import arcs.android.common.transaction
21+
import arcs.core.storage.database.DatabaseConfig
2122
import arcs.core.storage.testutil.DummyStorageKeyManager
2223
import com.google.common.truth.Truth.assertThat
2324
import org.junit.Test
@@ -43,11 +44,14 @@ class DatabaseDowngradeTest {
4344
dummyHelper.assertIndexes(dummyHelper.getIndexNames())
4445
dummyHelper.close()
4546

47+
val databaseConfig = DatabaseConfig()
48+
4649
val databaseImpl = DatabaseImpl(
4750
ApplicationProvider.getApplicationContext(),
4851
DummyStorageKeyManager(),
4952
"arcs",
50-
true
53+
true,
54+
{ databaseConfig }
5155
)
5256

5357
// Open up the databaseImpl, so it performs a downgrade.

javatests/arcs/android/storage/database/DatabaseImplFuzzTest.kt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import arcs.android.storage.database.testutil.SmallIntegerIdGenerator
2020
import arcs.android.util.testutil.AndroidLogRule
2121
import arcs.core.data.SchemaRegistry
2222
import arcs.core.storage.StorageKeyManager
23+
import arcs.core.storage.database.DatabaseConfig
2324
import arcs.core.storage.testutil.DummyStorageKey
2425
import arcs.core.storage.testutil.DummyStorageKeyManager
2526
import arcs.core.testutil.runFuzzTest
@@ -45,10 +46,12 @@ class DatabaseImplFuzzTest {
4546
@Before
4647
fun setUp() {
4748
BuildFlags.WRITE_ONLY_STORAGE_STACK = true
49+
val databaseConfig = DatabaseConfig()
4850
database = DatabaseImpl(
4951
ApplicationProvider.getApplicationContext(),
5052
DummyStorageKeyManager(),
51-
"test.sqlite3"
53+
"test.sqlite3",
54+
databaseConfig = { databaseConfig }
5255
)
5356
StorageKeyManager.GLOBAL_INSTANCE.addParser(DummyStorageKey)
5457
}

javatests/arcs/android/storage/database/DatabaseImplTest.kt

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ import arcs.core.storage.RawReference
3636
import arcs.core.storage.StorageKey
3737
import arcs.core.storage.StorageKeyManager
3838
import arcs.core.storage.database.DatabaseClient
39+
import arcs.core.storage.database.DatabaseConfig
3940
import arcs.core.storage.database.DatabaseData
4041
import arcs.core.storage.database.DatabaseOp
4142
import arcs.core.storage.database.ReferenceWithVersion
@@ -84,14 +85,16 @@ class DatabaseImplTest(private val parameters: ParameterizedBuildFlags) {
8485
private lateinit var database: DatabaseImpl
8586
private lateinit var db: SQLiteDatabase
8687
private val fixtureEntities = FixtureEntities()
88+
private val databaseConfig = DatabaseConfig()
8789

8890
@Before
8991
fun setUp() {
9092
BuildFlags.WRITE_ONLY_STORAGE_STACK = true
9193
database = DatabaseImpl(
9294
ApplicationProvider.getApplicationContext(),
9395
DummyStorageKeyManager(),
94-
"test.sqlite3"
96+
"test.sqlite3",
97+
databaseConfig = { databaseConfig }
9598
)
9699
db = database.writableDatabase
97100
StorageKeyManager.GLOBAL_INSTANCE.addParser(DummyStorageKey)
@@ -3974,7 +3977,8 @@ class DatabaseImplTest(private val parameters: ParameterizedBuildFlags) {
39743977
ApplicationProvider.getApplicationContext(),
39753978
DummyStorageKeyManager(),
39763979
"test.sqlite3",
3977-
persistent = false
3980+
persistent = false,
3981+
{ databaseConfig }
39783982
)
39793983

39803984
assertThat(inMemoryDatabase.getSize()).isGreaterThan(0)
@@ -4134,6 +4138,7 @@ class DatabaseImplTest(private val parameters: ParameterizedBuildFlags) {
41344138
ApplicationProvider.getApplicationContext(),
41354139
DummyStorageKeyManager(),
41364140
"test.sqlite3",
4141+
databaseConfig = { databaseConfig },
41374142
onDatabaseClose = {
41384143
onCloseCalled = true
41394144
}

0 commit comments

Comments
 (0)