Remove quitting users from channels

This commit is contained in:
Andreas Neue 2016-07-21 00:03:37 +02:00
parent 2b510d3a04
commit 33b787a969
2 changed files with 44 additions and 26 deletions

View File

@ -11,7 +11,8 @@ import (
var ( var (
gaugePacketsTransferred prometheus.Gauge gaugePacketsTransferred prometheus.Gauge
gaugeClientConnections prometheus.Gauge gaugeConnectionsCurrent prometheus.Gauge
gaugeConnectionsCount prometheus.Gauge
gaugeQueueLen prometheus.Gauge gaugeQueueLen prometheus.Gauge
) )
@ -20,8 +21,12 @@ func monitoringRun(sv *Server) {
Name: "ircd_packets_transferred", Name: "ircd_packets_transferred",
Help: "Packets handled", Help: "Packets handled",
}) })
gaugeClientConnections = prometheus.NewGauge(prometheus.GaugeOpts{ gaugeConnectionsCurrent = prometheus.NewGauge(prometheus.GaugeOpts{
Name: "ircd_clients_connected", Name: "ircd_connections_current",
Help: "Client connections",
})
gaugeConnectionsCount = prometheus.NewGauge(prometheus.GaugeOpts{
Name: "ircd_connections_count",
Help: "Client connections", Help: "Client connections",
}) })
gaugeQueueLen = prometheus.NewGauge(prometheus.GaugeOpts{ gaugeQueueLen = prometheus.NewGauge(prometheus.GaugeOpts{
@ -29,7 +34,8 @@ func monitoringRun(sv *Server) {
Help: "Unhandled msgs in dispatcher queue", Help: "Unhandled msgs in dispatcher queue",
}) })
prometheus.MustRegister(gaugePacketsTransferred) prometheus.MustRegister(gaugePacketsTransferred)
prometheus.MustRegister(gaugeClientConnections) prometheus.MustRegister(gaugeConnectionsCurrent)
prometheus.MustRegister(gaugeConnectionsCount)
prometheus.MustRegister(gaugeQueueLen) prometheus.MustRegister(gaugeQueueLen)
go monitoringUpdater(sv) go monitoringUpdater(sv)
http.Handle("/metrics", prometheus.Handler()) http.Handle("/metrics", prometheus.Handler())
@ -41,7 +47,8 @@ func monitoringUpdater(sv *Server) {
for { for {
time.Sleep(5 * time.Second) time.Sleep(5 * time.Second)
gaugePacketsTransferred.Set(sv.packetsTransferred) gaugePacketsTransferred.Set(sv.packetsTransferred)
gaugeClientConnections.Set(sv.clientConnections) gaugeConnectionsCurrent.Set(sv.connectionsCurrent)
gaugeClientConnections.Set(sv.queueLen) gaugeConnectionsCount.Set(sv.connectionsCount)
gaugeQueueLen.Set(sv.queueLen)
} }
} }

View File

@ -37,13 +37,14 @@ type Server struct {
motd string motd string
clients map[string]Client clients map[string]Client
chUsers map[string]map[string]string chUsers map[string]map[string]string
//chModes map[string][]string
chTopics map[string]string chTopics map[string]string
chModes map[string][]string
config *conf.ConfigFile config *conf.ConfigFile
configPath string configPath string
packetsTransferred float64 packetsTransferred float64
clientConnections float64 connectionsCurrent float64
connectionsCount float64
queueLen float64 queueLen float64
} }
@ -67,7 +68,8 @@ func NewServer(configPath, software, version string) *Server {
xlog.Init(loglevel) xlog.Init(loglevel)
sv.packetsTransferred = 0 sv.packetsTransferred = 0
sv.clientConnections = 0 sv.connectionsCurrent = 0
sv.connectionsCount = 0
sv.queueLen = 0 sv.queueLen = 0
return sv return sv
@ -101,7 +103,7 @@ func (sv *Server) listen(laddr string) {
xlog.Error(err.Error()) xlog.Error(err.Error())
} else { } else {
NewRemoteClient(sv, conn) NewRemoteClient(sv, conn)
sv.clientConnections++ sv.connectionsCount++
} }
} }
} }
@ -111,24 +113,31 @@ func (sv *Server) listenTls(laddr string) {
func (sv *Server) dispatch() { func (sv *Server) dispatch() {
for { for {
time.Sleep(1 * time.Millisecond) time.Sleep(1 * time.Microsecond)
sv.queueLen = float64(len(sv.Dispatch)) sv.queueLen = float64(len(sv.Dispatch))
select { select {
case msg := <-sv.Dispatch: case msg := <-sv.Dispatch:
sv.recvMsg(msg) sv.recvMsg(msg)
sv.packetsTransferred++ sv.packetsTransferred++
case cl := <-sv.AddClient: case cl := <-sv.AddClient:
name := cl.Name() nick := cl.Name()
sv.clients[name] = cl sv.clients[nick] = cl
sv.sendLogon(cl.Name()) 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.Info("Server has %d client(s)", len(sv.clients))
xlog.Debug("Goroutines running: %d", runtime.NumGoroutine()) xlog.Debug("Goroutines running: %d", runtime.NumGoroutine())
case cl := <-sv.DelClient: case cl := <-sv.DelClient:
name := cl.Name() nick := cl.Name()
cl.Destroy() cl.Destroy()
delete(sv.clients, name) for _, ch := range sv.chUsers {
xlog.Info("Client deleted: '%s'", name) 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.Info("Server has %d client(s)", len(sv.clients))
xlog.Debug("Goroutines running: %d", runtime.NumGoroutine()) xlog.Debug("Goroutines running: %d", runtime.NumGoroutine())
default: default:
@ -175,7 +184,9 @@ func (sv *Server) sendMsg(msg *irc.Message) {
if msg.Pre == nick && msg.Cmd == "PRIVMSG" { if msg.Pre == nick && msg.Cmd == "PRIVMSG" {
continue continue
} }
sv.clients[nick].Receive(msg) if cl, exists := sv.clients[nick]; exists {
cl.Receive(msg)
}
} }
} else { } else {
if _, exists := sv.clients[msg.Args[0]]; !exists { if _, exists := sv.clients[msg.Args[0]]; !exists {