diff --git a/plugins/analysis/client/plugin.go b/plugins/analysis/client/plugin.go index 736e79acf07eb0f1e23dff759eca5d3a9ba5acd8..24b2e1ebffd5fe762b6903dffc4557408de986a4 100644 --- a/plugins/analysis/client/plugin.go +++ b/plugins/analysis/client/plugin.go @@ -1,6 +1,7 @@ package client import ( + "errors" "net" "sync" "time" @@ -96,28 +97,43 @@ func (c *connector) Stop() { } func (c *connector) new() { + c.mu.Lock() + defer c.mu.Unlock() + select { case _ = <-c.closing: return default: - c.mu.Lock() - defer c.mu.Unlock() - - conn, err := net.Dial("tcp", config.Node.GetString(CfgServerAddress)) + c.conn = nil + tcpConn, err := net.Dial("tcp", config.Node.GetString(CfgServerAddress)) if err != nil { time.AfterFunc(1*time.Minute, c.new) log.Warn(err) return } - c.conn = network.NewManagedConnection(conn) + c.conn = network.NewManagedConnection(tcpConn) c.conn.Events.Close.Attach(events.NewClosure(c.new)) } } +func (c *connector) Close() (err error) { + c.mu.Lock() + defer c.mu.Unlock() + + if c.conn != nil { + err = c.conn.Close() + } + return +} + func (c *connector) Write(b []byte) (int, error) { // TODO: check that start was called // TODO: check that Stop was not called c.mu.Lock() defer c.mu.Unlock() + + if c.conn == nil { + return 0, errors.New("no connection established") + } return c.conn.Write(b) }