X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/0ca9b2d72645e10276fe56347c63867f166419e4..ba1937c21efd8d6392c0479579da1fc06443abdd:/services/keep-balance/collection.go diff --git a/services/keep-balance/collection.go b/services/keep-balance/collection.go index 575aa0c39c..d7a3fd981d 100644 --- a/services/keep-balance/collection.go +++ b/services/keep-balance/collection.go @@ -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() @@ -163,7 +163,7 @@ func (bal *Balancer) updateCollections(ctx context.Context, c *arvados.Client, c txPending := 0 flush := func(final bool) error { err := tx.Commit() - if err != nil { + if err != nil && ctx.Err() == nil { tx.Rollback() return err } @@ -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 { @@ -221,7 +224,7 @@ func (bal *Balancer) updateCollections(ctx context.Context, c *arvados.Client, c where uuid=$4`, repl, thresholdStr, classes, coll.UUID) if err != nil { - if err != context.Canceled { + if ctx.Err() == nil { bal.logf("%s: update failed: %s", coll.UUID, err) } continue @@ -259,3 +262,5 @@ func goSendErr(errs chan<- error, f func() error) { } }() } + +var emptyJSONArray = []byte("[]")