예제 #1
0
        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);
            }
        }
예제 #2
0
 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);
     }
 }