CultCache: [CultIndex] is unique at commit and load; [CultRole] names a selection role; replicas apply a commit's changes as one batch (#90)
Some checks failed
CultMesh QUIC native / Build win32-x64 (push) Has been skipped
CultMesh QUIC native / Build linux-x64 (push) Has been skipped
CultMesh QUIC native / Release native binaries (push) Has been skipped
CultMesh portability and performance / ubuntu-latest reactive semantics and leases (push) Failing after 20m15s
CultMesh QUIC native / Verify committed binaries match SHA256SUMS (push) Successful in 48s
Some checks failed
CultMesh QUIC native / Build win32-x64 (push) Has been skipped
CultMesh QUIC native / Build linux-x64 (push) Has been skipped
CultMesh QUIC native / Release native binaries (push) Has been skipped
CultMesh portability and performance / ubuntu-latest reactive semantics and leases (push) Failing after 20m15s
CultMesh QUIC native / Verify committed binaries match SHA256SUMS (push) Successful in 48s
This commit is contained in:
parent
de8a062ab9
commit
7760219b7c
32 changed files with 1686 additions and 349 deletions
|
|
@ -765,14 +765,41 @@ namespace GameCult.Networking
|
|||
{
|
||||
// Keys this subscriber only ever received as a refusal: it was never given them as records.
|
||||
var refused = new HashSet<string>(StringComparer.Ordinal);
|
||||
return _database.WatchAllChanges().Subscribe(change =>
|
||||
return _database.WatchCommits().Subscribe(commit =>
|
||||
{
|
||||
var outbound = DeliverChange(change, subscriptionId, selection, refused, error => peer.SendCultNet(error));
|
||||
if (outbound != null)
|
||||
peer.SendCultNet(outbound);
|
||||
foreach (var message in DeliverCommit(commit, subscriptionId, selection, refused, error => peer.SendCultNet(error)))
|
||||
peer.SendCultNet(message);
|
||||
});
|
||||
}
|
||||
|
||||
// One subscriber's view of one commit. Its changes go out together, tagged with the commit, so a replica applies them as one.
|
||||
internal IReadOnlyList<CultNetDatabaseChangeRawMessage> DeliverCommit(
|
||||
CultNetDatabaseCommit commit,
|
||||
string subscriptionId,
|
||||
CultNetSelection selection,
|
||||
HashSet<string> refused,
|
||||
Action<CultNetErrorMessage> sendError)
|
||||
{
|
||||
var outbound = new List<CultNetDatabaseChangeRawMessage>();
|
||||
foreach (var change in commit.Changes)
|
||||
{
|
||||
var message = DeliverChange(change, subscriptionId, selection, refused, sendError);
|
||||
if (message != null)
|
||||
outbound.Add(message);
|
||||
}
|
||||
|
||||
if (outbound.Count > 1)
|
||||
{
|
||||
foreach (var message in outbound)
|
||||
{
|
||||
message.CommitId = commit.Id;
|
||||
message.CommitCount = outbound.Count;
|
||||
}
|
||||
}
|
||||
|
||||
return outbound;
|
||||
}
|
||||
|
||||
// One subscriber's view of one change. A variant is not a record CultNet can carry (Q6): the subscriber is told, by key, and
|
||||
// is not later told the variant was removed, because it never held it.
|
||||
internal CultNetDatabaseChangeRawMessage? DeliverChange(
|
||||
|
|
|
|||
Loading…
Reference in a new issue