in accord-core/src/main/java/accord/local/Commands.java [1069:1132]
private static CommonAttributes set(SafeCommandStore safeStore, Command command, CommonAttributes attrs,
Ranges existingRanges, Ranges additionalRanges, ProgressShard shard, Route<?> route,
@Nullable PartialTxn partialTxn, EnsureAction ensurePartialTxn,
@Nullable PartialDeps partialDeps, EnsureAction ensurePartialDeps)
{
Invariants.checkState(attrs.progressKey() != null);
Ranges allRanges = existingRanges.with(additionalRanges);
if (shard.isHome() || shard.isProgress())
attrs = attrs.mutable().route(Route.merge(attrs.route(), (Route)route));
else
attrs = attrs.mutable().route(route.slice(allRanges));
// TODO (soon): stop round-robin hashing; partition only on ranges
switch (ensurePartialTxn)
{
case Add:
if (partialTxn == null)
break;
if (attrs.partialTxn() != null)
{
partialTxn = partialTxn.slice(allRanges, shard.isHome());
if (!command.txnId().rw().isLocal())
{
Routables.foldlMissing((Seekables)partialTxn.keys(), attrs.partialTxn().keys(), (keyOrRange, p, v, i) -> {
// TODO (expected, efficiency): we may register the same ranges more than once
safeStore.register(keyOrRange, allRanges, command);
return v;
}, 0, 0, 1);
}
attrs = attrs.mutable().partialTxn(attrs.partialTxn().with(partialTxn));
break;
}
case Set:
case TrySet:
attrs = attrs.mutable().partialTxn(partialTxn = partialTxn.slice(allRanges, shard.isHome()));
// TODO (expected, efficiency): we may register the same ranges more than once
// TODO (desirable, efficiency): no need to register on PreAccept if already Accepted
if (!command.txnId().rw().isLocal())
safeStore.register(partialTxn.keys(), allRanges, command);
break;
}
switch (ensurePartialDeps)
{
case Add:
if (partialDeps == null)
break;
if (attrs.partialDeps() != null)
{
attrs = attrs.mutable().partialDeps(attrs.partialDeps().with(partialDeps.slice(allRanges)));
break;
}
case Set:
case TrySet:
attrs = attrs.mutable().partialDeps(partialDeps.slice(allRanges));
break;
}
return attrs;
}