예제 #1
0
 // Token: 0x06001817 RID: 6167 RVA: 0x00063704 File Offset: 0x00061904
 public void GatherReplies(int maxWaitInMs)
 {
     if (this.m_proberState != ProberState.Sent)
     {
         throw new ArgumentException("user must send befor gathering");
     }
     try
     {
         this.m_proberState = ProberState.Gathering;
         this.m_probeCompleteEvent.WaitOne(maxWaitInMs, false);
     }
     finally
     {
         this.m_proberState = ProberState.Idle;
         PingRequest[] activeRequests = this.m_activeRequests;
         this.m_activeRequests = null;
         Win32StopWatch.GetSystemPerformanceCounter();
         foreach (PingRequest pingRequest in activeRequests)
         {
             if (pingRequest.StopTimeStamp == 0L || pingRequest.StopTimeStamp < pingRequest.StartTimeStamp)
             {
                 pingRequest.TimedOut = true;
             }
             else
             {
                 pingRequest.LatencyInUSec = Win32StopWatch.ComputeElapsedTimeInUSec(pingRequest.StopTimeStamp, pingRequest.StartTimeStamp);
             }
         }
     }
 }
예제 #2
0
 // Token: 0x06001816 RID: 6166 RVA: 0x0006361C File Offset: 0x0006181C
 public void SendPings(PingRequest[] targets)
 {
     if (this.m_proberState != ProberState.Idle)
     {
         throw new ArgumentException("user must gather between send intervals");
     }
     try
     {
         this.m_proberState    = ProberState.Sending;
         this.m_activeRequests = targets;
         foreach (PingRequest pingRequest in targets)
         {
             IPEndPoint ipendPoint = new IPEndPoint(pingRequest.IPAddress, 0);
             pingRequest.StartTimeStamp = Win32StopWatch.GetSystemPerformanceCounter();
             if (this.m_pingPacket.Length != this.m_sourcePort.Socket.SendTo(this.m_pingPacket, ipendPoint))
             {
                 throw new SocketException();
             }
             this.m_sendCount++;
             EndPoint endPoint = ipendPoint;
             this.m_sourcePort.Socket.BeginReceiveFrom(pingRequest.ReplyBuffer, 0, pingRequest.ReplyBuffer.Length, SocketFlags.None, ref endPoint, new AsyncCallback(this.CompletionCallback), null);
         }
     }
     finally
     {
         this.m_proberState = ProberState.Sent;
     }
 }
예제 #3
0
 internal EnterBlockModeMsg(NetworkChannel channel, EnterBlockModeMsg.Flags flags, Guid dbGuid, long firstGenerationToExpect) : base(channel, NetworkChannelMessage.MessageType.EnterBlockMode)
 {
     this.FlagsUsed  = flags;
     this.AckCounter = Win32StopWatch.GetSystemPerformanceCounter();
     this.FirstGenerationToExpect = firstGenerationToExpect;
     this.DatabaseGuid            = dbGuid;
     this.ActiveNodeName          = Environment.MachineName;
 }
예제 #4
0
        // Token: 0x06001815 RID: 6165 RVA: 0x000634CC File Offset: 0x000616CC
        private void CompletionCallback(IAsyncResult ar)
        {
            Exception ex = null;

            try
            {
                IPEndPoint ipendPoint = new IPEndPoint(IPAddress.Any, 0);
                EndPoint   endPoint   = ipendPoint;
                this.m_sourcePort.Socket.EndReceiveFrom(ar, ref endPoint);
                ipendPoint = (IPEndPoint)endPoint;
                PingRequest pingRequest = PingProber.FindRequest(this.m_activeRequests, ipendPoint.Address);
                if (pingRequest == null)
                {
                    PingProber.Tracer.TraceError <IPEndPoint>((long)this.GetHashCode(), "Unexpected response from {0}", ipendPoint);
                }
                else
                {
                    pingRequest.StopTimeStamp = Win32StopWatch.GetSystemPerformanceCounter();
                    PingProber.Tracer.TraceDebug <IPEndPoint>((long)this.GetHashCode(), "Response from {0}.", ipendPoint);
                    pingRequest.Success = true;
                }
            }
            catch (SocketException ex2)
            {
                ex = ex2;
            }
            catch (ObjectDisposedException ex3)
            {
                ex = ex3;
            }
            finally
            {
                lock (this)
                {
                    this.m_completionCount++;
                    if (this.m_completionCount == this.m_sendCount && (this.m_proberState == ProberState.Sent || this.m_proberState == ProberState.Gathering))
                    {
                        this.m_probeCompleteEvent.Set();
                    }
                }
                if (ex != null && this.m_proberState != ProberState.Disposed)
                {
                    PingProber.Tracer.TraceError <Exception>((long)this.GetHashCode(), "Ping completion failure: {0}", ex);
                }
            }
        }
예제 #5
0
        public static void SerializeToBuffer(int expectedTotalSize, GranularLogDataMsg.Flags msgFlags, JET_EMITDATACTX emitContext, byte[] logdata, int cblogdata, byte[] targetBuffer, int targetBufferOffsetToStart)
        {
            NetworkChannelPacket networkChannelPacket = new NetworkChannelPacket(targetBuffer, targetBufferOffsetToStart);

            networkChannelPacket.GrowthDisabled = true;
            networkChannelPacket.Append(1);
            int val = expectedTotalSize - 5;

            networkChannelPacket.Append(val);
            val = 1312903751;
            networkChannelPacket.Append(val);
            val = expectedTotalSize - 5;
            networkChannelPacket.Append(val);
            DateTime utcNow = DateTime.UtcNow;

            networkChannelPacket.Append(utcNow);
            networkChannelPacket.Append((long)msgFlags);
            long val2 = Win32StopWatch.GetSystemPerformanceCounter();

            networkChannelPacket.Append(val2);
            networkChannelPacket.Append(cblogdata);
            val = emitContext.dwVersion;
            networkChannelPacket.Append(val);
            val2 = (long)emitContext.qwSequenceNum;
            networkChannelPacket.Append(val2);
            val = (int)emitContext.grbitOperationalFlags;
            networkChannelPacket.Append(val);
            DateTime time = DateTime.SpecifyKind(emitContext.logtimeEmit, DateTimeKind.Utc);

            networkChannelPacket.Append(time);
            val = emitContext.lgposLogData.lGeneration;
            networkChannelPacket.Append(val);
            ushort val3 = (ushort)emitContext.lgposLogData.isec;

            networkChannelPacket.Append(val3);
            val3 = (ushort)emitContext.lgposLogData.ib;
            networkChannelPacket.Append(val3);
            if (cblogdata > 0)
            {
                networkChannelPacket.Append(logdata, 0, cblogdata);
            }
        }
예제 #6
0
        private QueuedBlockMsg ReadInputMessage(NetworkChannel netChan)
        {
            this.m_timeoutPending = false;
            byte[]         networkReadWorkingBuf = this.m_networkReadWorkingBuf;
            StopwatchStamp stamp = StopwatchStamp.GetStamp();
            NetworkChannelMessageHeader msgHdr = NetworkChannelMessage.ReadHeaderFromNet(netChan, networkReadWorkingBuf, 0);

            NetworkChannelMessage.MessageType messageType = msgHdr.MessageType;
            QueuedBlockMsg queuedBlockMsg;

            if (messageType != NetworkChannelMessage.MessageType.BlockModeCompressedData)
            {
                if (messageType == NetworkChannelMessage.MessageType.Ping)
                {
                    PingMessage pingMessage = PingMessage.ReadFromNet(netChan, networkReadWorkingBuf, 0);
                    long        systemPerformanceCounter = Win32StopWatch.GetSystemPerformanceCounter();
                    long        arg = Win32StopWatch.ComputeElapsedTimeInUSec(systemPerformanceCounter, pingMessage.ReplyAckCounter) / 1000L;
                    this.Copier.TrackLastContactTime(msgHdr.MessageUtc);
                    PassiveBlockMode.Tracer.TraceDebug <string, long>((long)this.GetHashCode(), "ProcessReadCallback({0}) received a ping after {1}ms, so channel is healthy", this.DatabaseName, arg);
                    return(null);
                }
                if (messageType != NetworkChannelMessage.MessageType.GranularLogData)
                {
                    throw new NetworkUnexpectedMessageException(netChan.PartnerNodeName, string.Format("Unknown Type {0}", msgHdr.MessageType));
                }
                queuedBlockMsg = this.ReadUncompressedMsg(netChan);
                this.Copier.PerfmonCounters.CompressionEnabled = 0L;
            }
            else
            {
                queuedBlockMsg = this.ReadCompressedMsg(netChan, msgHdr);
                this.Copier.PerfmonCounters.CompressionEnabled = 1L;
            }
            queuedBlockMsg.ReadDurationInTics = stamp.ElapsedTicks;
            queuedBlockMsg.MessageUtc         = msgHdr.MessageUtc;
            this.Copier.PerfmonCounters.RecordLogCopierNetworkReadLatency(queuedBlockMsg.ReadDurationInTics);
            return(queuedBlockMsg);
        }
예제 #7
0
        public static int SerializeToBuffer(JET_EMITDATACTX emitContext, byte[] logdata, int cblogdata, byte[] targetBuffer, int targetBufferOffsetToStart, out int totalCompressedSize)
        {
            NetworkChannelPacket networkChannelPacket = new NetworkChannelPacket(targetBuffer, targetBufferOffsetToStart);

            networkChannelPacket.GrowthDisabled = true;
            int num = BlockModeCompressedDataMsg.CalculateBlockCount(cblogdata);

            int[] array = new int[num];
            int   num2  = 73 + 4 * num;
            int   num3  = num2 + targetBufferOffsetToStart;
            int   num4  = 0;

            totalCompressedSize = 0;
            int num5 = cblogdata;

            for (int i = 0; i < num; i++)
            {
                int num6 = Math.Min(num5, 65536);
                Xpress.Compress(logdata, num4, num6, targetBuffer, num3, num6, out array[i]);
                num4 += num6;
                num3 += array[i];
                totalCompressedSize += array[i];
                num5 -= num6;
            }
            networkChannelPacket.Append(1);
            int val = num2 - 5 + totalCompressedSize;

            networkChannelPacket.Append(val);
            val = 1145261378;
            networkChannelPacket.Append(val);
            val = num2 - 5;
            networkChannelPacket.Append(val);
            DateTime utcNow = DateTime.UtcNow;

            networkChannelPacket.Append(utcNow);
            long val2 = 0L;

            networkChannelPacket.Append(val2);
            val2 = Win32StopWatch.GetSystemPerformanceCounter();
            networkChannelPacket.Append(val2);
            networkChannelPacket.Append(cblogdata);
            val = emitContext.dwVersion;
            networkChannelPacket.Append(val);
            val2 = (long)emitContext.qwSequenceNum;
            networkChannelPacket.Append(val2);
            val = (int)emitContext.grbitOperationalFlags;
            networkChannelPacket.Append(val);
            DateTime time = DateTime.SpecifyKind(emitContext.logtimeEmit, DateTimeKind.Utc);

            networkChannelPacket.Append(time);
            val = emitContext.lgposLogData.lGeneration;
            networkChannelPacket.Append(val);
            ushort val3 = (ushort)emitContext.lgposLogData.isec;

            networkChannelPacket.Append(val3);
            val3 = (ushort)emitContext.lgposLogData.ib;
            networkChannelPacket.Append(val3);
            for (int j = 0; j < num; j++)
            {
                networkChannelPacket.Append(array[j]);
            }
            return(num2 + totalCompressedSize);
        }
예제 #8
0
 private void WakeUpCallback(object context)
 {
     PassiveBlockMode.Tracer.TraceFunction <string>((long)this.GetHashCode(), "WakeUpCallback({0})", this.DatabaseName);
     lock (this.m_workerLock)
     {
         if (!this.IsBlockModeActive)
         {
             PassiveBlockMode.Tracer.TraceError((long)this.GetHashCode(), "Timer fired after termination");
         }
         else if (this.Copier.TestHungPassiveBlockMode)
         {
             PassiveBlockMode.Tracer.TraceError((long)this.GetHashCode(), "TestHungPassiveBlockMode is active. Timer ignored");
         }
         else if (this.m_timeoutPending)
         {
             PassiveBlockMode.Tracer.TraceError <ExDateTime, ExDateTime>((long)this.GetHashCode(), "Active did not respond by {0}, cur time is {1}", this.m_timeoutLimit, ExDateTime.Now);
             this.Terminate();
         }
         else
         {
             this.m_timeoutPending = true;
             this.m_timeoutLimit   = ExDateTime.Now.AddMilliseconds((double)RegistryParameters.LogShipTimeoutInMsec);
             NetworkTransportException ex;
             bool flag2;
             this.TrySendStatusMessageToActive(PassiveStatusMsg.Flags.PassiveIsRequestingAck, Win32StopWatch.GetSystemPerformanceCounter(), out ex, out flag2);
             if (ex == null)
             {
                 this.ScheduleTimer();
             }
             else
             {
                 PassiveBlockMode.Tracer.TraceError <NetworkTransportException>((long)this.GetHashCode(), "WakeUpCallback Failed to ping Active: {0}", ex);
                 this.Terminate();
             }
         }
     }
 }