private void connectToNsqd(string addr) { if (string.IsNullOrEmpty(addr)) throw new ArgumentNullException("addr"); if (_stopFlag == 1) { throw new Exception("consumer stopped"); } if (_runningHandlers == 0) { throw new Exception("no handlers"); } _connectedFlag = 1; var conn = new Conn(addr, _config, this); // TODO: Check log format conn.SetLogger(_logger, string.Format("C{0} [{1}/{2}] ({{0}})", _id, _topic, _channel)); _mtx.EnterWriteLock(); try { bool pendingOk = _pendingConnections.ContainsKey(addr); bool ok = _connections.ContainsKey(addr); if (pendingOk || ok) { return; } _pendingConnections[addr] = conn; if (!_nsqdTCPAddrs.Contains(addr)) _nsqdTCPAddrs.Add(addr); } finally { _mtx.ExitWriteLock(); } log(LogLevel.Info, string.Format("({0}) connecting to nsqd", addr)); var cleanupConnection = new Action(() => { _mtx.EnterWriteLock(); try { _pendingConnections.Remove(addr); } finally { _mtx.ExitWriteLock(); } }); IdentifyResponse resp; try { resp = conn.Connect(); } catch (Exception) { cleanupConnection(); throw; } if (resp != null) { if (resp.MaxRdyCount < getMaxInFlight()) { log(LogLevel.Warning, string.Format( "({0}) max RDY count {1} < consumer max in flight {2}, truncation possible", conn, resp.MaxRdyCount, getMaxInFlight())); } } var cmd = Command.Subscribe(_topic, _channel); try { conn.WriteCommand(cmd); } catch (Exception ex) { cleanupConnection(); throw new Exception(string.Format("[{0}] failed to subscribe to {1}:{2} - {3}", conn, _topic, _channel, ex)); } _mtx.EnterWriteLock(); try { _pendingConnections.Remove(addr); _connections[addr] = conn; } finally { _mtx.ExitWriteLock(); } // pre-emptive signal to existing connections to lower their RDY count _perConnMaxInFlightOverride = 0; foreach (var c in conns()) { maybeUpdateRDY(c); } }
private void sendRDY(Conn c, long count) { if (count == 0 && c.LastRDY == 0) { // no need to send. It's already that RDY count return; } Interlocked.Add(ref _totalRdyCount, -c.RDY + count); c.SetRDY(count); try { c.WriteCommand(Command.Ready(count)); } catch (Exception ex) { log(LogLevel.Error, string.Format("({0}) error sending RDY {1} - {2}", c, count, ex)); throw; } }