//
// SPDX-License-Identifier: AGPL-3.0
-package main
+package keepbalance
import (
"context"
// 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()
txPending := 0
flush := func(final bool) error {
err := tx.Commit()
- if err != nil {
+ if err != nil && ctx.Err() == nil {
tx.Rollback()
return err
}
// 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 {
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
}
}()
}
+
+var emptyJSONArray = []byte("[]")