Skip to content

Commit

Permalink
Sql cache: use a single transaction when using MemoryCache chaining (#…
Browse files Browse the repository at this point in the history
  • Loading branch information
BoD committed Apr 22, 2024
1 parent 14da50d commit 7079290
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 19 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -98,15 +98,7 @@ class MemoryCache(
return emptySet()
}
return lockWrite {
val oldRecord = loadRecord(record.key, cacheHeaders)
val changedKeys = if (oldRecord == null) {
lruCache[record.key] = record
record.fieldKeys()
} else {
val (mergedRecord, changedKeys) = recordMerger.merge(existing = oldRecord, incoming = record, newDate = null)
lruCache[record.key] = mergedRecord
changedKeys
}
val changedKeys = internalMerge(record, cacheHeaders, recordMerger)
changedKeys + nextCache?.merge(record, cacheHeaders, recordMerger).orEmpty()
}
}
Expand All @@ -115,7 +107,23 @@ class MemoryCache(
if (cacheHeaders.hasHeader(ApolloCacheHeaders.DO_NOT_STORE)) {
return emptySet()
}
return lockWrite { records.flatMap { record -> merge(record, cacheHeaders, recordMerger) } }.toSet()
return lockWrite {
val changedKeys = records.flatMap { record -> internalMerge(record, cacheHeaders, recordMerger) }.toSet()
changedKeys + nextCache?.merge(records, cacheHeaders, recordMerger).orEmpty()
}
}

private fun internalMerge(record: Record, cacheHeaders: CacheHeaders, recordMerger: RecordMerger): Set<String> {
val oldRecord = loadRecord(record.key, cacheHeaders)
val changedKeys = if (oldRecord == null) {
lruCache[record.key] = record
record.fieldKeys()
} else {
val (mergedRecord, changedKeys) = recordMerger.merge(existing = oldRecord, incoming = record, newDate = null)
lruCache[record.key] = mergedRecord
changedKeys
}
return changedKeys
}

override fun dump(): Map<KClass<*>, Map<String, Record>> {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,19 @@ class MemoryCache(
return emptySet()
}

val changedKeys = internalMerge(record, cacheHeaders)
return changedKeys + nextCache?.merge(record, cacheHeaders).orEmpty()
}

override fun merge(records: Collection<Record>, cacheHeaders: CacheHeaders): Set<String> {
if (cacheHeaders.hasHeader(ApolloCacheHeaders.DO_NOT_STORE)) {
return emptySet()
}
val changedKeys = records.flatMap { record -> internalMerge(record, cacheHeaders) }.toSet()
return changedKeys + nextCache?.merge(records, cacheHeaders).orEmpty()
}

private fun internalMerge(record: Record, cacheHeaders: CacheHeaders): Set<String> {
val oldRecord = loadRecord(record.key, cacheHeaders)
val changedKeys = if (oldRecord == null) {
lruCache[record.key] = CacheEntry(
Expand All @@ -109,15 +122,7 @@ class MemoryCache(
)
changedKeys
}

return changedKeys + nextCache?.merge(record, cacheHeaders).orEmpty()
}

override fun merge(records: Collection<Record>, cacheHeaders: CacheHeaders): Set<String> {
if (cacheHeaders.hasHeader(ApolloCacheHeaders.DO_NOT_STORE)) {
return emptySet()
}
return records.flatMap { record -> merge(record, cacheHeaders) }.toSet()
return changedKeys
}

override fun dump(): Map<KClass<*>, Map<String, Record>> {
Expand Down

0 comments on commit 7079290

Please sign in to comment.