Merge branch 'master' into 14874-protected-collection-properties
[arvados.git] / services / keep-balance / balance.go
index 33f3762b47b89d2d19d9e68f38051407b4f6fa38..08a6c5881c51e32951d475ec49b37a833f360532 100644 (file)
@@ -83,7 +83,13 @@ func (bal *Balancer) Run(config Config, runOptions RunOptions) (nextRunOptions R
                if err != nil {
                        return
                }
-               defer os.Remove(tmpfn)
+               defer func() {
+                       // Remove the tempfile only if we didn't get
+                       // as far as successfully renaming it.
+                       if lbFile != nil {
+                               os.Remove(tmpfn)
+                       }
+               }()
                bal.lostBlocks = lbFile
        } else {
                bal.lostBlocks = ioutil.Discard
@@ -141,10 +147,7 @@ func (bal *Balancer) Run(config Config, runOptions RunOptions) (nextRunOptions R
                if err != nil {
                        return
                }
-               err = lbFile.Close()
-               if err != nil {
-                       return
-               }
+               lbFile = nil
        }
        if runOptions.CommitPulls {
                err = bal.CommitPulls(&config.Client)
@@ -447,7 +450,13 @@ func (bal *Balancer) addCollection(coll arvados.Collection) error {
                repl = *coll.ReplicationDesired
        }
        debugf("%v: %d block x%d", coll.UUID, len(blkids), repl)
-       bal.BlockStateMap.IncreaseDesired(coll.StorageClassesDesired, repl, blkids)
+       // Pass pdh to IncreaseDesired only if LostBlocksFile is being
+       // written -- otherwise it's just a waste of memory.
+       pdh := ""
+       if bal.LostBlocksFile != "" {
+               pdh = coll.PortableDataHash
+       }
+       bal.BlockStateMap.IncreaseDesired(pdh, coll.StorageClassesDesired, repl, blkids)
        return nil
 }
 
@@ -921,7 +930,11 @@ func (bal *Balancer) collectStatistics(results <-chan balanceResult) {
                        s.lost.replicas -= surplus
                        s.lost.blocks++
                        s.lost.bytes += bytes * int64(-surplus)
-                       fmt.Fprintf(bal.lostBlocks, "%s\n", strings.SplitN(string(result.blkid), "+", 2)[0])
+                       fmt.Fprintf(bal.lostBlocks, "%s", strings.SplitN(string(result.blkid), "+", 2)[0])
+                       for pdh := range result.blk.Refs {
+                               fmt.Fprintf(bal.lostBlocks, " %s", pdh)
+                       }
+                       fmt.Fprint(bal.lostBlocks, "\n")
                case surplus < 0:
                        s.underrep.replicas -= surplus
                        s.underrep.blocks++