public void SlaveOf(EndPoint endpoint, CommandFlags flags = CommandFlags.None) { if (endpoint == server.EndPoint) { throw new ArgumentException("Cannot slave to self"); } // prepare the actual slaveof message (not sent yet) var slaveofMsg = CreateSlaveOfMessage(endpoint, flags); var configuration = this.multiplexer.RawConfig; // attempt to cease having an opinion on the master; will resume that when replication completes // (note that this may fail; we aren't depending on it) if (!string.IsNullOrWhiteSpace(configuration.TieBreaker) && this.multiplexer.CommandMap.IsAvailable(RedisCommand.DEL)) { var del = Message.Create(0, CommandFlags.FireAndForget | CommandFlags.NoRedirect, RedisCommand.DEL, (RedisKey)configuration.TieBreaker); del.SetInternalCall(); server.QueueDirectFireAndForget(del, ResultProcessor.Boolean); } ExecuteSync(slaveofMsg, ResultProcessor.DemandOK); // attempt to broadcast a reconfigure message to anybody listening to this server var channel = this.multiplexer.ConfigurationChangedChannel; if (channel != null && this.multiplexer.CommandMap.IsAvailable(RedisCommand.PUBLISH)) { var pub = Message.Create(-1, CommandFlags.FireAndForget | CommandFlags.NoRedirect, RedisCommand.PUBLISH, (RedisValue)channel, RedisLiterals.Wildcard); pub.SetInternalCall(); server.QueueDirectFireAndForget(pub, ResultProcessor.Int64); } }
internal void Resubscribe(RedisChannel channel, ServerEndPoint server) { if (server != null && Interlocked.CompareExchange(ref owner, server, server) == server) { var cmd = channel.IsPatternBased ? RedisCommand.PSUBSCRIBE : RedisCommand.SUBSCRIBE; var msg = Message.Create(-1, CommandFlags.FireAndForget, cmd, channel); msg.SetInternalCall(); server.QueueDirectFireAndForget(msg, ResultProcessor.TrackSubscriptions); } }