Skip to content

Commit 0758a51

Browse files
committed
fix(model-server): attempt to fix the flaky ReplicatedRepositoryTest
1 parent 897bb82 commit 0758a51

File tree

2 files changed

+13
-6
lines changed

2 files changed

+13
-6
lines changed

model-datastructure/src/commonMain/kotlin/org/modelix/model/lazy/CLVersion.kt

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -358,9 +358,8 @@ fun IVersion.diff(knownVersions: List<IVersion>, filter: ObjectDeltaFilter = Obj
358358
*
359359
* Use the version closest to [this] version as the base because that one should produce the smallest diff.
360360
*/
361-
val baseVersion = unknownHistory.mapNotNull { it.baseVersion }
362-
.find { allKnownVersions.contains(it.getObjectHash()) }
363-
?: allKnownVersions.values.firstOrNull()
361+
val baseVersion = version.baseVersion?.takeIf { allKnownVersions.contains(it.getObjectHash()) }
362+
?: allKnownVersions.values.lastOrNull()
364363
result += if (baseVersion == null) {
365364
IStream.many(version.data.treeRefs.values)
366365
.flatMap { it.resolve() }

model-server/src/main/kotlin/org/modelix/model/server/handlers/RepositoriesManager.kt

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ import org.modelix.streams.IExecutableStream
3636
import org.modelix.streams.IStream
3737
import org.modelix.streams.getBlocking
3838
import org.modelix.streams.iterateBlocking
39+
import org.modelix.streams.plus
3940
import org.slf4j.LoggerFactory
4041
import java.util.UUID
4142

@@ -390,9 +391,16 @@ class RepositoriesManager(val stores: StoreManager) : IRepositoriesManager {
390391
val store = stores.getAsyncStore(repository?.takeIf { isIsolated(it) ?: false })
391392
return store.getStreamExecutor().queryManyLater {
392393
val version = CLVersion.loadFromHash(versionHash, store)
393-
IStream.many(filter.knownVersions).flatMap { CLVersion.tryLoadFromHash(it, store) }.toList().flatMap { knownVersions ->
394-
version.diff(knownVersions, filter).map { it.getHashString() to it.data.serialize() }
395-
}
394+
395+
val diff = IStream.many(filter.knownVersions).flatMap { CLVersion.tryLoadFromHash(it, store) }.toList()
396+
.flatMap { knownVersions ->
397+
version.diff(knownVersions, filter)
398+
}
399+
val versionHash = version.getObjectHash()
400+
// The version itself is always included, because version objects on the client are weakly referenced,
401+
// and it may already be garbage collected.
402+
(IStream.of(version.asObject()) + diff.filter { it.getHash() != versionHash })
403+
.map { it.getHashString() to it.data.serialize() }
396404
}.let { ObjectDataFlow(it) }
397405
}
398406

0 commit comments

Comments
 (0)