/// <summary>
 ///
 /// </summary>
 /// <param name="watchers"></param>
 /// <param name="watchedEvent"></param>
 private static void ProcessWatcher(IEnumerable <IWatcher> watchers, WatchedEvent watchedEvent)
 {
     foreach (IWatcher watcher in watchers)
     {
         try
         {
             if (null != watcher)
             {
                 watcher.Process(watchedEvent);
             }
         }
         catch (Exception t)
         {
             log.Error("Error while calling watcher ", t);
         }
     }
 }
        /// <summary>
        ///
        /// </summary>
        /// <param name="event"></param>
        public void QueueEvent(WatchedEvent @event)
        {
            if (@event.Type == EventType.None && sessionState == @event.State)
            {
                return;
            }

            if (waitingEvents.IsAddingCompleted)
            {
                throw new InvalidOperationException("consumer has been disposed");
            }

            sessionState = @event.State;

            // materialize the watchers based on the event
            var pair = new ClientConnection.WatcherSetEventPair(conn.watcher.Materialize(@event.State, @event.Type, @event.Path), @event);

            // queue the pair (watch set & event) for later processing
            waitingEvents.Add(pair);
        }
Exemple #3
0
 /// <summary>
 ///
 /// </summary>
 /// <param name="watchers"></param>
 /// <param name="event"></param>
 public WatcherSetEventPair(IEnumerable <IWatcher> watchers, WatchedEvent @event)
 {
     this.Watchers     = watchers;
     this.WatchedEvent = @event;
 }
        /// <summary>
        ///
        /// </summary>
        /// <param name="content"></param>
        private void ReadResponse(byte[] content)
        {
            using (var reader = new EndianBinaryReader(EndianBitConverter.Big, new MemoryStream(content), Encoding.UTF8))
            {
                BinaryInputArchive bbia     = BinaryInputArchive.GetArchive(reader);
                ReplyHeader        replyHdr = new ReplyHeader();

                replyHdr.Deserialize(bbia, "header");
                if (replyHdr.Xid == -2)
                {
                    // -2 is the xid for pings
                    if (log.IsDebugEnabled)
                    {
                        log.DebugFormat("Got ping response for sessionid: 0x{0:X} after {1}ms", conn.SessionId, (DateTime.UtcNow.Nanos() - lastPingSentNs) / 1000000);
                    }
                    return;
                }
                if (replyHdr.Xid == -4)
                {
                    // -2 is the xid for AuthPacket
                    // TODO: process AuthPacket here
                    if (log.IsDebugEnabled)
                    {
                        log.DebugFormat("Got auth sessionid:0x{0:X}", conn.SessionId);
                    }
                    return;
                }
                if (replyHdr.Xid == -1)
                {
                    // -1 means notification
                    if (log.IsDebugEnabled)
                    {
                        log.DebugFormat("Got notification sessionid:0x{0}", conn.SessionId);
                    }

                    WatcherEvent @event = new WatcherEvent();
                    @event.Deserialize(bbia, "response");

                    // convert from a server path to a client path
                    if (conn.ChrootPath != null)
                    {
                        string serverPath = @event.Path;
                        if (serverPath.CompareTo(conn.ChrootPath) == 0)
                        {
                            @event.Path = PathUtils.PathSeparator;
                        }
                        else
                        {
                            @event.Path = serverPath.Substring(conn.ChrootPath.Length);
                        }
                    }

                    WatchedEvent we = new WatchedEvent(@event);
                    if (log.IsDebugEnabled)
                    {
                        log.DebugFormat("Got {0} for sessionid 0x{1:X}", we, conn.SessionId);
                    }

                    conn.consumer.QueueEvent(we);
                    return;
                }
                Packet packet;
                if (pendingQueue.TryDequeue(out packet))
                {
                    try
                    {
                        if (packet.header.Xid != replyHdr.Xid)
                        {
                            packet.replyHeader.Err = (int)KeeperException.Code.CONNECTIONLOSS;
                            throw new IOException(new StringBuilder("Xid out of order. Got ").Append(replyHdr.Xid).Append(" expected ").Append(packet.header.Xid).ToString());
                        }

                        packet.replyHeader.Xid  = replyHdr.Xid;
                        packet.replyHeader.Err  = replyHdr.Err;
                        packet.replyHeader.Zxid = replyHdr.Zxid;
                        if (replyHdr.Zxid > 0)
                        {
                            lastZxid = replyHdr.Zxid;
                        }

                        if (packet.response != null && replyHdr.Err == 0)
                        {
                            packet.response.Deserialize(bbia, "response");
                        }

                        if (log.IsDebugEnabled)
                        {
                            log.DebugFormat("Reading reply sessionid:0x{0:X}, packet:: {1}", conn.SessionId, packet);
                        }
                    }
                    finally
                    {
                        FinishPacket(packet);
                    }
                }
                else
                {
                    throw new IOException(new StringBuilder("Nothing in the queue, but got ").Append(replyHdr.Xid).ToString());
                }
            }
        }