20930: Fix deadlock in notify/listen event loop.
[arvados.git] / services / ws / event_source.go
index 2f4838397affff538d7554b51fca7f08f1b5ec7b..e0269701c9715f5673650750dc7c00ba0b66159d 100644 (file)
@@ -253,25 +253,36 @@ func (ps *pgEventSource) Run() {
        }()
 
        var serial uint64
-       ticker := time.NewTicker(listenerPingInterval)
-       defer ticker.Stop()
+
+       go func() {
+               ticker := time.NewTicker(listenerPingInterval)
+               defer ticker.Stop()
+               for {
+                       select {
+                       case <-ctx.Done():
+                               ps.Logger.Debug("ctx done")
+                               return
+
+                       case <-ticker.C:
+                               ps.Logger.Debug("listener ping")
+                               if testSlowPing {
+                                       time.Sleep(time.Second / 2)
+                               }
+                               err := ps.pqListener.Ping()
+                               if err != nil {
+                                       ps.listenerProblem(-1, fmt.Errorf("pqListener ping failed: %s", err))
+                                       continue
+                               }
+                       }
+               }
+       }()
+
        for {
                select {
                case <-ctx.Done():
                        ps.Logger.Debug("ctx done")
                        return
 
-               case <-ticker.C:
-                       ps.Logger.Debug("listener ping")
-                       if testSlowPing {
-                               time.Sleep(time.Second / 2)
-                       }
-                       err := ps.pqListener.Ping()
-                       if err != nil {
-                               ps.listenerProblem(-1, fmt.Errorf("pqListener ping failed: %s", err))
-                               continue
-                       }
-
                case pqEvent, ok := <-ps.pqListener.Notify:
                        if !ok {
                                ps.Logger.Error("pqListener Notify chan closed")