Merge branch '20529-container-deadlocks' refs #20529
[arvados.git] / services / keep-balance / collection.go
index 1da3ec4415946bea6e3176f6746a2229a5017443..d7a3fd981d4f03877e57b0426e739941411cf4a3 100644 (file)
@@ -2,7 +2,7 @@
 //
 // SPDX-License-Identifier: AGPL-3.0
 
-package main
+package keepbalance
 
 import (
        "context"
@@ -152,7 +152,7 @@ func (bal *Balancer) updateCollections(ctx context.Context, c *arvados.Client, c
        // Use about 1 goroutine per 2 CPUs. Based on experiments with
        // a 2-core host, using more concurrent database
        // calls/transactions makes this process slower, not faster.
-       for i := 0; i < runtime.NumCPU()+1/2; i++ {
+       for i := 0; i < (runtime.NumCPU()+1)/2; i++ {
                wg.Add(1)
                goSendErr(errs, func() error {
                        defer wg.Done()
@@ -199,10 +199,13 @@ func (bal *Balancer) updateCollections(ctx context.Context, c *arvados.Client, c
                                        // temporarily.
                                        repl = desired
                                }
-                               classes, err := json.Marshal(coll.StorageClassesDesired)
-                               if err != nil {
-                                       bal.logf("BUG? json.Marshal(%v) failed: %s", classes, err)
-                                       continue
+                               classes := emptyJSONArray
+                               if repl > 0 {
+                                       classes, err = json.Marshal(coll.StorageClassesDesired)
+                                       if err != nil {
+                                               bal.logf("BUG? json.Marshal(%v) failed: %s", classes, err)
+                                               continue
+                                       }
                                }
                                needUpdate := coll.ReplicationConfirmed == nil || *coll.ReplicationConfirmed != repl || len(coll.StorageClassesConfirmed) != len(coll.StorageClassesDesired)
                                for i := range coll.StorageClassesDesired {
@@ -259,3 +262,5 @@ func goSendErr(errs chan<- error, f func() error) {
                }
        }()
 }
+
+var emptyJSONArray = []byte("[]")