/// <summary> /// Acquires an appropriate event envelope. /// </summary> /// <returns></returns> private static MeshEvent Create(MeshEventType type) { // Get the appropriate packet switch (type) { case MeshEventType.Error: case MeshEventType.Ping: case MeshEventType.PingAck: case MeshEventType.HandshakeAck: return(MeshEvent.Acquire()); case MeshEventType.Handshake: return(MeshHandshake.Acquire()); case MeshEventType.GossipDigest: case MeshEventType.GossipSince: case MeshEventType.GossipUpdate: return(MeshGossip.Acquire()); case MeshEventType.Subscribe: case MeshEventType.Unsubscribe: case MeshEventType.Custom: return(MeshEmitterEvent.Acquire()); default: throw new InvalidOperationException("Unknown mesh packet"); } }
/// <summary> /// Handles the command. /// </summary> /// <param name="channel">The channel sending the command.</param> /// <param name="command">The command received.</param> private static void OnGossipSince(Connection channel, MeshGossip gossip) { // We received a gossip request, send them a gossip update since the requested version channel.Send( MeshGossip.Acquire(Service.Registry.Collection, (ReplicatedVersion)gossip.State) ); }
/// <summary> /// Sends a mesh gossip through the specified channel. /// </summary> /// <param name="server">The channel to send the mesh gossip to.</param> internal static void SendMeshGossipDigest(this IServer server) { var provider = Service.Providers.Resolve <MeshProvider>(); if (provider == null) { return; } // Compute the digest first var digest = Service.Registry.GetMembership().Version.Digest(); // Send the digest around server.Send(MeshGossip.Acquire(digest)); }
/// <summary> /// Handles the command. /// </summary> /// <param name="channel">The channel sending the command.</param> /// <param name="command">The command received.</param> private static void OnGossipUpdate(Connection channel, MeshGossip gossip) { // Gossip state is merged during the packet read. Nothing to do here. var state = gossip.State as ReplicatedHybridDictionary; if (state == null) { return; } // Check if we need to update //if (Service.State.Version.TryUpdate(state.Version)) { // Merge the other state in our current state Service.Registry.Collection.MergeIn(channel.MeshIdentifier, state); Service.Registry.Version.TryUpdate(state.Version); } }
/// <summary> /// Handles the command. /// </summary> /// <param name="channel">The channel sending the command.</param> /// <param name="command">The command received.</param> private static void OnGossipDigest(Connection channel, MeshGossip gossip) { // this message contains a digest var digest = (ReplicatedVersionDigest)gossip.State; // Do we have the same digest? var ourVersion = Service.Registry.Version; var ourDigest = ourVersion.Digest(); if (ourDigest != digest.Value) { // Digests didn't match, we should ask for some gossip! //Console.WriteLine("Digest: {0} vs {1}", ourDigest, digest.Value); channel.Send( MeshGossip.Acquire(ourVersion) ); } }