From 33b787a96912d13185e10d3c2c567b8d54e8a5ed Mon Sep 17 00:00:00 2001 From: Andreas Neue Date: Thu, 21 Jul 2016 00:03:37 +0200 Subject: [PATCH] Remove quitting users from channels --- monitoring.go | 19 +++++++++++++------ server.go | 51 +++++++++++++++++++++++++++++++-------------------- 2 files changed, 44 insertions(+), 26 deletions(-) diff --git a/monitoring.go b/monitoring.go index 6c7234c..0d99aa4 100644 --- a/monitoring.go +++ b/monitoring.go @@ -11,7 +11,8 @@ import ( var ( gaugePacketsTransferred prometheus.Gauge - gaugeClientConnections prometheus.Gauge + gaugeConnectionsCurrent prometheus.Gauge + gaugeConnectionsCount prometheus.Gauge gaugeQueueLen prometheus.Gauge ) @@ -20,8 +21,12 @@ func monitoringRun(sv *Server) { Name: "ircd_packets_transferred", Help: "Packets handled", }) - gaugeClientConnections = prometheus.NewGauge(prometheus.GaugeOpts{ - Name: "ircd_clients_connected", + gaugeConnectionsCurrent = prometheus.NewGauge(prometheus.GaugeOpts{ + Name: "ircd_connections_current", + Help: "Client connections", + }) + gaugeConnectionsCount = prometheus.NewGauge(prometheus.GaugeOpts{ + Name: "ircd_connections_count", Help: "Client connections", }) gaugeQueueLen = prometheus.NewGauge(prometheus.GaugeOpts{ @@ -29,7 +34,8 @@ func monitoringRun(sv *Server) { Help: "Unhandled msgs in dispatcher queue", }) prometheus.MustRegister(gaugePacketsTransferred) - prometheus.MustRegister(gaugeClientConnections) + prometheus.MustRegister(gaugeConnectionsCurrent) + prometheus.MustRegister(gaugeConnectionsCount) prometheus.MustRegister(gaugeQueueLen) go monitoringUpdater(sv) http.Handle("/metrics", prometheus.Handler()) @@ -41,7 +47,8 @@ func monitoringUpdater(sv *Server) { for { time.Sleep(5 * time.Second) gaugePacketsTransferred.Set(sv.packetsTransferred) - gaugeClientConnections.Set(sv.clientConnections) - gaugeClientConnections.Set(sv.queueLen) + gaugeConnectionsCurrent.Set(sv.connectionsCurrent) + gaugeConnectionsCount.Set(sv.connectionsCount) + gaugeQueueLen.Set(sv.queueLen) } } diff --git a/server.go b/server.go index db5202f..c606dd7 100644 --- a/server.go +++ b/server.go @@ -29,21 +29,22 @@ type Server struct { AddClient chan Client DelClient chan Client - host string - info string - software string - version string - created string - motd string - clients map[string]Client - chUsers map[string]map[string]string + host string + info string + software string + version string + created string + motd string + clients map[string]Client + chUsers map[string]map[string]string + //chModes map[string][]string chTopics map[string]string - chModes map[string][]string config *conf.ConfigFile configPath string packetsTransferred float64 - clientConnections float64 + connectionsCurrent float64 + connectionsCount float64 queueLen float64 } @@ -67,7 +68,8 @@ func NewServer(configPath, software, version string) *Server { xlog.Init(loglevel) sv.packetsTransferred = 0 - sv.clientConnections = 0 + sv.connectionsCurrent = 0 + sv.connectionsCount = 0 sv.queueLen = 0 return sv @@ -101,7 +103,7 @@ func (sv *Server) listen(laddr string) { xlog.Error(err.Error()) } else { NewRemoteClient(sv, conn) - sv.clientConnections++ + sv.connectionsCount++ } } } @@ -111,24 +113,31 @@ func (sv *Server) listenTls(laddr string) { func (sv *Server) dispatch() { for { - time.Sleep(1 * time.Millisecond) + time.Sleep(1 * time.Microsecond) sv.queueLen = float64(len(sv.Dispatch)) select { case msg := <-sv.Dispatch: sv.recvMsg(msg) sv.packetsTransferred++ case cl := <-sv.AddClient: - name := cl.Name() - sv.clients[name] = cl + nick := cl.Name() + sv.clients[nick] = cl sv.sendLogon(cl.Name()) - xlog.Info("Client registered: '%s'", name) + sv.connectionsCurrent = float64(len(sv.clients)) + xlog.Info("Client registered: '%s'", nick) xlog.Info("Server has %d client(s)", len(sv.clients)) xlog.Debug("Goroutines running: %d", runtime.NumGoroutine()) case cl := <-sv.DelClient: - name := cl.Name() + nick := cl.Name() cl.Destroy() - delete(sv.clients, name) - xlog.Info("Client deleted: '%s'", name) + for _, ch := range sv.chUsers { + if _, exists := ch[nick]; exists { + delete(ch, nick) + } + } + delete(sv.clients, nick) + sv.connectionsCurrent = float64(len(sv.clients)) + xlog.Info("Client deleted: '%s'", nick) xlog.Info("Server has %d client(s)", len(sv.clients)) xlog.Debug("Goroutines running: %d", runtime.NumGoroutine()) default: @@ -175,7 +184,9 @@ func (sv *Server) sendMsg(msg *irc.Message) { if msg.Pre == nick && msg.Cmd == "PRIVMSG" { continue } - sv.clients[nick].Receive(msg) + if cl, exists := sv.clients[nick]; exists { + cl.Receive(msg) + } } } else { if _, exists := sv.clients[msg.Args[0]]; !exists {