Skip to content

Commit ede07b6

Browse files
committed
feat(model-server): validate new versions before updating a branch
When a client pushes a new version, the new data is checked for missing objects.
1 parent 490b201 commit ede07b6

File tree

1 file changed

+10
-4
lines changed

1 file changed

+10
-4
lines changed

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

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
package org.modelix.model.server.handlers
22

3-
import com.badoo.reaktive.observable.map
43
import kotlinx.coroutines.flow.Flow
5-
import kotlinx.coroutines.flow.map
64
import kotlinx.coroutines.flow.onEach
75
import kotlinx.datetime.Clock
86
import org.modelix.model.ModelMigrations
@@ -19,7 +17,6 @@ import org.modelix.model.lazy.RepositoryId
1917
import org.modelix.model.lazy.fullDiff
2018
import org.modelix.model.persistent.HashUtil
2119
import org.modelix.model.persistent.SerializationUtil
22-
import org.modelix.model.server.api.v2.toMap
2320
import org.modelix.model.server.store.IRepositoryAwareStore
2421
import org.modelix.model.server.store.ITransactionManager
2522
import org.modelix.model.server.store.ObjectInRepository
@@ -240,25 +237,34 @@ class RepositoriesManager(val stores: StoreManager) : IRepositoriesManager {
240237
@RequiresTransaction
241238
override fun mergeChanges(branch: BranchReference, newVersionHash: String): String {
242239
val headHash = getVersionHash(branch)
240+
if (headHash == newVersionHash) return headHash
241+
val legacyObjectStore = getLegacyObjectStore(branch.repositoryId)
242+
val newVersion = CLVersion(newVersionHash, legacyObjectStore)
243243
val mergedHash = if (headHash == null) {
244+
validateVersion(newVersion, null)
244245
newVersionHash
245246
} else {
246247
val legacyObjectStore = getLegacyObjectStore(branch.repositoryId)
247248
val headVersion = CLVersion(headHash, legacyObjectStore)
248-
val newVersion = CLVersion(newVersionHash, legacyObjectStore)
249249
require(headVersion.getTree().getId() == newVersion.getTree().getId()) {
250250
"Attempt to merge a model with ID '${newVersion.getTree().getId()}'" +
251251
" into one with ID '${headVersion.getTree().getId()}'"
252252
}
253253
val mergedVersion = VersionMerger(legacyObjectStore, stores.idGenerator)
254254
.mergeChange(headVersion, newVersion)
255+
validateVersion(newVersion, headVersion)
255256
mergedVersion.getContentHash()
256257
}
257258
ensureBranchInList(branch)
258259
putVersionHash(branch, mergedHash)
259260
return mergedHash
260261
}
261262

263+
private fun validateVersion(newVersion: CLVersion, oldVersion: CLVersion?) {
264+
// ensure there are no missing objects
265+
newVersion.fullDiff(oldVersion).iterateSynchronous { }
266+
}
267+
262268
@RequiresTransaction
263269
override fun getVersion(branch: BranchReference): CLVersion? {
264270
return getVersionHash(branch)?.let { getVersion(branch.repositoryId, it) }

0 commit comments

Comments
 (0)