7491: Manual merge with 7491-keepclient-bugs
[arvados.git] / sdk / go / keepclient / support.go
index df02d221be29f6b7b7c0e35a41766c0ceb41a07e..51e3e082b683e01ca153d352e54b8e53db9a9893 100644 (file)
@@ -85,12 +85,8 @@ func (this *KeepClient) DiscoverKeepServers() error {
 
        // Get keep services from api server
        err := this.Arvados.Call("GET", "keep_services", "", "accessible", nil, &m)
-
-       // If there is error getting keep services, get list of keep disks
        if err != nil {
-               if err := this.Arvados.List("keep_disks", nil, &m); err != nil {
-                       return err
-               }
+               return err
        }
 
        listed := make(map[string]bool)
@@ -98,7 +94,8 @@ func (this *KeepClient) DiscoverKeepServers() error {
        gatewayRoots := make(map[string]string)
        writableLocalRoots := make(map[string]string)
 
-       this.replicasPerService = 1 // set to 1 until writable non-disk services are found
+       // replicasPerService is 1 for disks; unknown or unlimited otherwise
+       this.replicasPerService = 1
        this.Using_proxy = false
 
        for _, service := range m.Items {
@@ -231,7 +228,17 @@ func (this KeepClient) putReplicas(
 
        // Used to communicate status from the upload goroutines
        upload_status := make(chan uploadStatus)
-       defer close(upload_status)
+       defer func() {
+               // Wait for any abandoned uploads (e.g., we started
+               // two uploads and the first replied with replicas=2)
+               // to finish before closing the status channel.
+               go func() {
+                       for active > 0 {
+                               <-upload_status
+                       }
+                       close(upload_status)
+               }()
+       }()
 
        // Desired number of replicas
        remaining_replicas := this.Want_replicas