From b1c749eaf4c03d19f146f566f9751bd1d75100fd Mon Sep 17 00:00:00 2001 From: Colleen Murphy <colleen.murphy@suse.com> Date: Thu, 19 May 2022 12:32:23 -0700 Subject: [PATCH] Return websocket error and add logging for watches Add debug logs and send websocket messages when the watch is closed unexpectedly. In addition to being helpful for debugging, the dashboard specifically looks for a `resource.error` event containing the string "too old" in order to trigger the watch to be resynced with a refreshed revision number. Without this error returned, the dashboard will only see `resource.stop` events and never change its behavior, continuing to try to restart the watch with an incorrect resource version. (cherry picked from commit ada5b33d98607e33e1620f8c091077e219f280ab) --- pkg/stores/proxy/proxy_store.go | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/pkg/stores/proxy/proxy_store.go b/pkg/stores/proxy/proxy_store.go index ab790f5a..14850733 100644 --- a/pkg/stores/proxy/proxy_store.go +++ b/pkg/stores/proxy/proxy_store.go @@ -320,6 +320,9 @@ func (s *Store) listAndWatch(apiOp *types.APIRequest, k8sClient dynamic.Resource obj, err := s.byID(apiOp, schema, rel.Namespace, rel.Name) if err == nil { result <- s.toAPIEvent(apiOp, schema, watch.Modified, obj) + } else { + logrus.Debugf("notifier watch error: %v", err) + returnErr(errors.Wrapf(err, "notifier watch error: %v", err), result) } } return fmt.Errorf("closed") @@ -329,6 +332,12 @@ func (s *Store) listAndWatch(apiOp *types.APIRequest, k8sClient dynamic.Resource eg.Go(func() error { for event := range watcher.ResultChan() { if event.Type == watch.Error { + if status, ok := event.Object.(*metav1.Status); ok { + logrus.Debugf("event watch error: %s", status.Message) + returnErr(fmt.Errorf("event watch error: %s", status.Message), result) + } else { + logrus.Debugf("event watch error: could not decode event object %T", event.Object) + } continue } result <- s.toAPIEvent(apiOp, schema, event.Type, event.Object)