Ejemplo n.º 1
0
        internal static void StartContinuousLogTransmission(NetworkChannel channel, ContinuousLogCopyRequest oldReq)
        {
            LogCopyServerContext logCopyServerContext = new LogCopyServerContext(channel, channel.MonitoredDatabase);

            logCopyServerContext.m_clientIsDownLevel = true;
            LogCopyServerContext.Tracer.TraceDebug <string, bool>((long)logCopyServerContext.GetHashCode(), "Passive({0}) is downlevel {1}}", channel.PartnerNodeName, logCopyServerContext.m_clientIsDownLevel);
            ContinuousLogCopyRequest2 initialRequest = LogCopyServerContext.UpgradeRequest(channel, oldReq);

            logCopyServerContext.InitContinuousLogTransmission(initialRequest);
        }
Ejemplo n.º 2
0
 private void HandleIncomingMessage()
 {
     try
     {
         if (!this.m_markedForTermination)
         {
             lock (this.m_networkReadLock)
             {
                 NetworkChannelMessage message     = this.Channel.GetMessage();
                 PingMessage           pingMessage = message as PingMessage;
                 if (pingMessage != null)
                 {
                     LogCopyServerContext.Tracer.TraceDebug((long)this.GetHashCode(), "HandleIncomingMessage: Ping received");
                     Interlocked.Exchange(ref this.m_pingPending, 1);
                     this.m_sendDataEnabled = true;
                 }
                 else
                 {
                     ContinuousLogCopyRequest2 continuousLogCopyRequest = message as ContinuousLogCopyRequest2;
                     if (continuousLogCopyRequest == null)
                     {
                         if (message is ContinuousLogCopyRequest)
                         {
                             continuousLogCopyRequest = LogCopyServerContext.UpgradeRequest(this.Channel, message as ContinuousLogCopyRequest);
                         }
                         else
                         {
                             LogCopyServerContext.Tracer.TraceError <NetworkChannelMessage>((long)this.GetHashCode(), "HandleIncomingMessage: UnexpectedMsg:{0}", message);
                             this.Channel.ThrowUnexpectedMessage(message);
                         }
                     }
                     LogCopyServerContext.Tracer.TraceDebug <long, long, ContinuousLogCopyRequest2.Flags>((long)this.GetHashCode(), "HandleIncomingMessage: First=0x{0:X} Max=0x{1:X} Flags=0x{2:X}", continuousLogCopyRequest.FirstGeneration, continuousLogCopyRequest.LastGeneration, continuousLogCopyRequest.FlagsUsed);
                     this.m_sendDataEnabled    = true;
                     this.m_nextLogCopyRequest = continuousLogCopyRequest;
                 }
                 this.StartNetworkRead();
                 this.SignalWorkPending();
             }
         }
     }
     catch (NetworkTransportException arg)
     {
         LogCopyServerContext.Tracer.TraceError <NetworkTransportException>((long)this.GetHashCode(), "HandleIncomingMessage: Channel exception: {0}", arg);
         this.MarkForTermination();
     }
 }
Ejemplo n.º 3
0
 private void InitContinuousLogTransmission(ContinuousLogCopyRequest2 initialRequest)
 {
     this.m_clientNodeName = initialRequest.ClientNodeName;
     LogCopyServerContext.Tracer.TraceDebug((long)this.GetHashCode(), "StartContinuousLogTransmission({0}): First=0x{1:X} Max=0x{2:X} Flags=0x{3:X}", new object[]
     {
         this.PassiveCopyName,
         initialRequest.FirstGeneration,
         initialRequest.LastGeneration,
         initialRequest.FlagsUsed
     });
     this.m_currentLogCopyRequest = initialRequest;
     this.m_nextLogCopyRequest    = initialRequest;
     this.m_currentLogGeneration  = initialRequest.FirstGeneration;
     this.m_sendDataEnabled       = true;
     this.Channel.NetworkChannelManagesAsyncReads = false;
     try
     {
         this.m_workIsPendingEvent = new ManualResetEvent(false);
         this.LinkWithMonitoredDatabase();
     }
     catch (NetworkCancelledException arg)
     {
         LogCopyServerContext.Tracer.TraceError <NetworkCancelledException>((long)this.GetHashCode(), "InitContinuousLogTransmission cancelled {0}", arg);
         this.Terminate();
         return;
     }
     this.SourceDatabasePerfCounters = SourceDatabasePerformanceCounters.GetInstance(this.PassiveCopyName);
     try
     {
         this.StartNetworkRead();
     }
     catch (NetworkTransportException arg2)
     {
         LogCopyServerContext.Tracer.TraceError <NetworkTransportException>((long)this.GetHashCode(), "InitContinuousLogTransmission caught {0}", arg2);
         this.MarkForTermination();
     }
     this.SignalWorkPending();
 }
Ejemplo n.º 4
0
        internal static void StartContinuousLogTransmission(NetworkChannel channel, ContinuousLogCopyRequest2 initialRequest)
        {
            LogCopyServerContext logCopyServerContext = new LogCopyServerContext(channel, channel.MonitoredDatabase);

            logCopyServerContext.InitContinuousLogTransmission(initialRequest);
        }
Ejemplo n.º 5
0
        private bool EnterBlockMode()
        {
            TimeSpan  timeout = TimeSpan.FromSeconds(5.0);
            bool      flag;
            Exception ex = AmStoreHelper.IsDatabaseMounted(this.Database.DatabaseGuid, this.LocalNodeName, timeout, out flag);

            if (ex != null)
            {
                LogCopyServerContext.Tracer.TraceError <Exception>((long)this.GetHashCode(), "Store may not be running. Mount check failed: {0}", ex);
                return(false);
            }
            if (!flag)
            {
                LogCopyServerContext.Tracer.TraceDebug <string>((long)this.GetHashCode(), "Db {0} not mounted. BlockMode is not possible", this.Database.DatabaseName);
                return(false);
            }
            EnterBlockModeMsg enterBlockModeMsg = new EnterBlockModeMsg(this.Channel, EnterBlockModeMsg.Flags.PrepareToEnter, this.Database.DatabaseGuid, this.m_currentLogGeneration);
            bool flag2 = false;
            bool result;

            lock (this.m_networkReadLock)
            {
                if (this.m_markedForTermination)
                {
                    result = false;
                }
                else
                {
                    int readTimeoutInMs  = this.Channel.TcpChannel.ReadTimeoutInMs;
                    int writeTimeoutInMs = this.Channel.TcpChannel.WriteTimeoutInMs;
                    try
                    {
                        this.Channel.TcpChannel.ReadTimeoutInMs  = RegistryParameters.LogShipACLLTimeoutInMsec;
                        this.Channel.TcpChannel.WriteTimeoutInMs = RegistryParameters.LogShipACLLTimeoutInMsec;
                        LogCopyServerContext.Tracer.TraceDebug <string>((long)this.GetHashCode(), "EnterBlockMode requesting PrepareToEnter for {0}", this.PassiveCopyName);
                        enterBlockModeMsg.Send();
                        EnterBlockModeMsg enterBlockModeMsg2;
                        string            text;
                        for (;;)
                        {
                            NetworkChannelMessage message     = this.Channel.GetMessage();
                            PingMessage           pingMessage = message as PingMessage;
                            if (pingMessage != null)
                            {
                                LogCopyServerContext.Tracer.TraceDebug((long)this.GetHashCode(), "PingMessage ignored");
                            }
                            else
                            {
                                ContinuousLogCopyRequest2 continuousLogCopyRequest = message as ContinuousLogCopyRequest2;
                                if (continuousLogCopyRequest != null)
                                {
                                    this.m_nextLogCopyRequest = continuousLogCopyRequest;
                                    LogCopyServerContext.Tracer.TraceDebug <long, long, ContinuousLogCopyRequest2.Flags>((long)this.GetHashCode(), "ContinuousLogCopyRequest2: First=0x{0:X} Max=0x{1:X} Flags=0x{2:X}", continuousLogCopyRequest.FirstGeneration, continuousLogCopyRequest.LastGeneration, continuousLogCopyRequest.FlagsUsed);
                                }
                                else
                                {
                                    enterBlockModeMsg2 = (message as EnterBlockModeMsg);
                                    text = null;
                                    if (enterBlockModeMsg2 == null)
                                    {
                                        text = string.Format("Passive({0}) sent unexpected msg: {1}", this.PassiveCopyName, message.GetType());
                                    }
                                    else if (enterBlockModeMsg2.AckCounter != enterBlockModeMsg.AckCounter)
                                    {
                                        text = string.Format("Passive({0}) is out of sync. BlockModeEntry Aborted", this.PassiveCopyName);
                                    }
                                    if (text != null)
                                    {
                                        break;
                                    }
                                    if (enterBlockModeMsg2.FlagsUsed != EnterBlockModeMsg.Flags.PassiveIsReady)
                                    {
                                        goto Block_13;
                                    }
                                    if (!this.RequestBlockModeInStore())
                                    {
                                        goto Block_15;
                                    }
                                }
                            }
                        }
                        LogCopyServerContext.Tracer.TraceError((long)this.GetHashCode(), text);
                        throw new NetworkUnexpectedMessageException(this.m_clientNodeName, text);
Block_13:
                        if (enterBlockModeMsg2.FlagsUsed == EnterBlockModeMsg.Flags.PassiveReject)
                        {
                            LogCopyServerContext.Tracer.TraceError <string>((long)this.GetHashCode(), "BlockMode rejected by passive {0}", this.PassiveCopyName);
                            flag2 = true;
                            return(false);
                        }
                        text = string.Format("Passive({0}) passed unexpected flags 0x{1X}", this.PassiveCopyName, enterBlockModeMsg2.FlagsUsed);
                        throw new NetworkUnexpectedMessageException(this.m_clientNodeName, text);
Block_15:
                        flag2  = true;
                        result = false;
                    }
                    finally
                    {
                        if (flag2)
                        {
                            this.Channel.TcpChannel.ReadTimeoutInMs  = readTimeoutInMs;
                            this.Channel.TcpChannel.WriteTimeoutInMs = writeTimeoutInMs;
                            this.StartNetworkRead();
                        }
                    }
                }
            }
            return(result);
        }