From fbc64ff8f4e78cf7086bbd26407cc9439b469ee4 Mon Sep 17 00:00:00 2001 From: Noah Watkins Date: Fri, 26 Apr 2019 09:18:25 -0700 Subject: [PATCH] ceph: check for equiv device config maps in operator this is an attempt to reduce the number of false positive config map updates used to trigger orchestration for hotplugging. Signed-off-by: Noah Watkins --- pkg/daemon/discover/discover.go | 4 ++-- pkg/operator/ceph/cluster/controller.go | 23 +++++++++++++++++++++++ 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/pkg/daemon/discover/discover.go b/pkg/daemon/discover/discover.go index 9078e78e5..6cb75c77d 100644 --- a/pkg/daemon/discover/discover.go +++ b/pkg/daemon/discover/discover.go @@ -193,7 +193,7 @@ func udevBlockMonitor(c chan string, period time.Duration) { } } -func deviceListsEqual(a, b string) (bool, error) { +func DeviceListsEqual(a, b string) (bool, error) { var d0 []sys.LocalDisk var d1 []sys.LocalDisk @@ -264,7 +264,7 @@ func updateDeviceCM(context *clusterd.Context) error { } lastDevice = deviceStr } - devicesEqual, err := deviceListsEqual(deviceStr, lastDevice) + devicesEqual, err := DeviceListsEqual(deviceStr, lastDevice) if err != nil { return fmt.Errorf("failed to compare device lists: %v", err) } diff --git a/pkg/operator/ceph/cluster/controller.go b/pkg/operator/ceph/cluster/controller.go index 8bb70b1b5..d1236d2d9 100644 --- a/pkg/operator/ceph/cluster/controller.go +++ b/pkg/operator/ceph/cluster/controller.go @@ -543,6 +543,29 @@ func (c *ClusterController) onDeviceCMUpdate(oldObj, newObj interface{}) { } logger.Debugf("onDeviceCMUpdate new device cm: %+v", newCm) + oldDevStr, ok := oldCm.Data[discoverDaemon.LocalDiskCMData] + if !ok { + logger.Warningf("unexpected configmap data") + return + } + + newDevStr, ok := newCm.Data[discoverDaemon.LocalDiskCMData] + if !ok { + logger.Warningf("unexpected configmap data") + return + } + + devicesEqual, err := discoverDaemon.DeviceListsEqual(oldDevStr, newDevStr) + if err != nil { + logger.Warningf("failed to compare device lists: %v", err) + return + } + + if devicesEqual { + logger.Infof("device lists are equal. skipping orchestration") + return + } + for _, cluster := range c.clusterMap { logger.Infof("Running orchestration for namespace %s after device change", cluster.Namespace) err := cluster.createInstance(c.rookImage, cluster.Info.CephVersion)