From d0af7f26500cdaa482599fe903ac1e5a39d3123e Mon Sep 17 00:00:00 2001 From: Marcin Tojek Date: Wed, 22 Nov 2023 10:26:50 +0100 Subject: [PATCH 1/2] fix: preserve order of node reports in healthcheck --- coderd/healthcheck/derphealth/derp.go | 17 +++++++++++++++++ coderd/healthcheck/derphealth/derp_test.go | 1 - 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/coderd/healthcheck/derphealth/derp.go b/coderd/healthcheck/derphealth/derp.go index 8f99ca5994d25..52da0fa1fa4cb 100644 --- a/coderd/healthcheck/derphealth/derp.go +++ b/coderd/healthcheck/derphealth/derp.go @@ -11,6 +11,7 @@ import ( "sync/atomic" "time" + "golang.org/x/exp/slices" "golang.org/x/xerrors" "tailscale.com/derp" "tailscale.com/derp/derphttp" @@ -22,6 +23,7 @@ import ( tslogger "tailscale.com/types/logger" "github.com/coder/coder/v2/coderd/util/ptr" + "github.com/coder/coder/v2/coderd/util/slice" ) const ( @@ -183,6 +185,11 @@ func (r *RegionReport) Run(ctx context.Context) { } wg.Wait() + r.mu.Lock() + defer r.mu.Unlock() + + r.NodeReports = sortedNodeReports(r.NodeReports) + // Coder allows for 1 unhealthy node in the region, unless there is only 1 node. if len(r.Region.Nodes) == 1 { r.Healthy = healthyNodes == len(r.Region.Nodes) @@ -492,3 +499,13 @@ func convertError(err error) *string { return nil } + +func sortedNodeReports(reports []*NodeReport) []*NodeReport { + sorted := make([]*NodeReport, len(reports)) + copy(sorted, reports) + + slices.SortFunc(sorted, func(a, b *NodeReport) int { + return slice.Ascending(a.Node.Name, b.Node.Name) + }) + return sorted +} diff --git a/coderd/healthcheck/derphealth/derp_test.go b/coderd/healthcheck/derphealth/derp_test.go index b1a236dc3315e..a877e03fd2d57 100644 --- a/coderd/healthcheck/derphealth/derp_test.go +++ b/coderd/healthcheck/derphealth/derp_test.go @@ -83,7 +83,6 @@ func TestDERP(t *testing.T) { t.Run("HealthyWithNodeDegraded", func(t *testing.T) { t.Parallel() - t.Skip("https://github.com/coder/coder/issues/10824") healthyDerpSrv := derp.NewServer(key.NewNode(), func(format string, args ...any) { t.Logf(format, args...) }) defer healthyDerpSrv.Close() From 3dcdb3e4f6f7a1bbd2b8f807b6c218d54e1044cc Mon Sep 17 00:00:00 2001 From: Marcin Tojek Date: Wed, 22 Nov 2023 11:05:24 +0100 Subject: [PATCH 2/2] sort in place --- coderd/healthcheck/derphealth/derp.go | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/coderd/healthcheck/derphealth/derp.go b/coderd/healthcheck/derphealth/derp.go index 52da0fa1fa4cb..4047cde041474 100644 --- a/coderd/healthcheck/derphealth/derp.go +++ b/coderd/healthcheck/derphealth/derp.go @@ -188,7 +188,7 @@ func (r *RegionReport) Run(ctx context.Context) { r.mu.Lock() defer r.mu.Unlock() - r.NodeReports = sortedNodeReports(r.NodeReports) + sortNodeReports(r.NodeReports) // Coder allows for 1 unhealthy node in the region, unless there is only 1 node. if len(r.Region.Nodes) == 1 { @@ -500,12 +500,8 @@ func convertError(err error) *string { return nil } -func sortedNodeReports(reports []*NodeReport) []*NodeReport { - sorted := make([]*NodeReport, len(reports)) - copy(sorted, reports) - - slices.SortFunc(sorted, func(a, b *NodeReport) int { +func sortNodeReports(reports []*NodeReport) { + slices.SortFunc(reports, func(a, b *NodeReport) int { return slice.Ascending(a.Node.Name, b.Node.Name) }) - return sorted }