Beispiel #1
0
        internal void primeConnection()
        {
            LOG.info("Socket connection established to " +
                     clientCnxnSocket.getRemoteSocketAddress() +
                     ", initiating session");
            isFirstConnect = false;
            long           sessId = (seenRwServerBefore.Value) ? sessionId : 0;
            ConnectRequest conReq = new ConnectRequest(0, lastZxid.Value,
                                                       sessionTimeout, sessId, sessionPasswd);

            lock (outgoingQueue) {
                // We add backwards since we are pushing into the front
                // Only send if there's a pending watch
                // TODO: here we have the only remaining use of zooKeeper in
                // this class. It's to be eliminated!
                if (!disableAutoWatchReset)
                {
                    List <string> dataWatches  = zooKeeper.getDataWatches();
                    List <string> existWatches = zooKeeper.getExistWatches();
                    List <string> childWatches = zooKeeper.getChildWatches();
                    if (dataWatches.Count > 0 || existWatches.Count > 0 || childWatches.Count > 0)
                    {
                        SetWatches sw = new SetWatches(lastZxid.Value,
                                                       prependChroot(dataWatches),
                                                       prependChroot(existWatches),
                                                       prependChroot(childWatches));
                        RequestHeader h = new RequestHeader();
                        h.set_Type((int)ZooDefs.OpCode.setWatches);
                        h.setXid(-8);
                        Packet packet = new Packet(h, new ReplyHeader(), sw,
                                                   null, null);
                        outgoingQueue.AddFirst(packet);
                    }
                }
                foreach (AuthData id in authInfo)
                {
                    outgoingQueue.AddFirst(new Packet(new RequestHeader(-4,
                                                                        (int)ZooDefs.OpCode.auth), null, new AuthPacket(0, id.scheme,
                                                                                                                        id.data), null, null));
                }
                outgoingQueue.AddFirst(new Packet(null, null, conReq, null,
                                                  null, readOnly));
            }
            clientCnxnSocket.enableReadWriteOnly();
            if (LOG.isDebugEnabled())
            {
                LOG.debug("Session establishment request sent on " + clientCnxnSocket.getRemoteSocketAddress());
            }
        }
Beispiel #2
0
        internal void primeConnection()
        {
            LOG.info("Socket connection established to " +
                     clientCnxnSocket.getRemoteSocketAddress() +
                     ", initiating session");
            isFirstConnect = false;
            long           sessId = (seenRwServerBefore.Value) ? sessionId : 0;
            ConnectRequest conReq = new ConnectRequest(0, lastZxid.Value,
                                                       sessionTimeout, sessId, sessionPasswd);

            lock (outgoingQueue) {
                // We add backwards since we are pushing into the front
                // Only send if there's a pending watch
                // TODO: here we have the only remaining use of zooKeeper in
                // this class. It's to be eliminated!
                List <string> dataWatches        = zooKeeper.getDataWatches();
                List <string> existWatches       = zooKeeper.getExistWatches();
                List <string> childWatches       = zooKeeper.getChildWatches();
                long          setWatchesLastZxid = lastZxid.Value;
                bool          done = false;
                if (dataWatches.Count > 0 || existWatches.Count > 0 || childWatches.Count > 0)
                {
                    using (var dataWatchesIter = prependChroot(dataWatches).GetEnumerator())
                        using (var existWatchesIter = prependChroot(existWatches).GetEnumerator())
                            using (var childWatchesIter = prependChroot(childWatches).GetEnumerator())
                                while (!done)
                                {
                                    var dataWatchesBatch  = new List <string>();
                                    var existWatchesBatch = new List <string>();
                                    var childWatchesBatch = new List <string>();
                                    int batchLength       = 0;

                                    // Note, we may exceed our max length by a bit when we add the last
                                    // watch in the batch. This isn't ideal, but it makes the code simpler.
                                    while (batchLength < SET_WATCHES_MAX_LENGTH)
                                    {
                                        string watch;
                                        if (dataWatchesIter.MoveNext())
                                        {
                                            watch = dataWatchesIter.Current;
                                            dataWatchesBatch.Add(watch);
                                        }
                                        else if (existWatchesIter.MoveNext())
                                        {
                                            watch = existWatchesIter.Current;
                                            existWatchesBatch.Add(watch);
                                        }
                                        else if (childWatchesIter.MoveNext())
                                        {
                                            watch = childWatchesIter.Current;
                                            childWatchesBatch.Add(watch);
                                        }
                                        else
                                        {
                                            done = true;
                                            break;
                                        }
                                        batchLength += watch.Length;
                                    }

                                    SetWatches sw = new SetWatches(setWatchesLastZxid,
                                                                   dataWatchesBatch,
                                                                   existWatchesBatch,
                                                                   childWatchesBatch);
                                    RequestHeader h = new RequestHeader();
                                    h.set_Type((int)ZooDefs.OpCode.setWatches);
                                    h.setXid(-8);
                                    Packet packet = new Packet(h, new ReplyHeader(), sw,
                                                               null, null);
                                    outgoingQueue.AddFirst(packet);
                                }
                }
                foreach (AuthData id in authInfo)
                {
                    outgoingQueue.AddFirst(new Packet(new RequestHeader(-4,
                                                                        (int)ZooDefs.OpCode.auth), null, new AuthPacket(0, id.scheme,
                                                                                                                        id.data), null, null));
                }
                outgoingQueue.AddFirst(new Packet(null, null, conReq, null,
                                                  null, readOnly));
            }
            clientCnxnSocket.enableReadWriteOnly();
            if (LOG.isDebugEnabled())
            {
                LOG.debug("Session establishment request sent on " + clientCnxnSocket.getRemoteSocketAddress());
            }
        }