// Attaches the specified persistent disk device to node, verifies that it is attached, and retries if it fails. func attachDiskAndVerify(b *gcePersistentDiskBuilder, sdBeforeSet sets.String) (string, error) { devicePaths := getDiskByIdPaths(b.gcePersistentDisk) var gceCloud *gce_cloud.GCECloud for numRetries := 0; numRetries < maxRetries; numRetries++ { // Block execution until any pending detach goroutines for this pd have completed detachCleanupManager.Send(b.pdName, true) var err error if gceCloud == nil { gceCloud, err = getCloudProvider() if err != nil || gceCloud == nil { // Retry on error. See issue #11321 glog.Errorf("Error getting GCECloudProvider while detaching PD %q: %v", b.pdName, err) time.Sleep(errorSleepDuration) continue } } if numRetries > 0 { glog.Warningf("Timed out waiting for GCE PD %q to attach. Retrying attach.", b.pdName) } if err := gceCloud.AttachDisk(b.pdName, b.readOnly); err != nil { // Retry on error. See issue #11321. glog.Errorf("Error attaching PD %q: %v", b.pdName, err) time.Sleep(errorSleepDuration) continue } for numChecks := 0; numChecks < maxChecks; numChecks++ { path, err := verifyDevicePath(devicePaths, sdBeforeSet) if err != nil { // Log error, if any, and continue checking periodically. See issue #11321 glog.Errorf("Error verifying GCE PD (%q) is attached: %v", b.pdName, err) } else if path != "" { // A device path has successfully been created for the PD glog.Infof("Successfully attached GCE PD %q.", b.pdName) return path, nil } // Sleep then check again glog.V(3).Infof("Waiting for GCE PD %q to attach.", b.pdName) time.Sleep(checkSleepDuration) } } return "", fmt.Errorf("Could not attach GCE PD %q. Timeout waiting for mount paths to be created.", b.pdName) }
// Attaches the specified persistent disk device to node, verifies that it is attached, and retries if it fails. func attachDiskAndVerify(b *gcePersistentDiskMounter, sdBeforeSet sets.String) (string, error) { devicePaths := getDiskByIdPaths(b.gcePersistentDisk) var gceCloud *gcecloud.GCECloud for numRetries := 0; numRetries < maxRetries; numRetries++ { var err error if gceCloud == nil { gceCloud, err = getCloudProvider(b.gcePersistentDisk.plugin) if err != nil || gceCloud == nil { // Retry on error. See issue #11321 glog.Errorf("Error getting GCECloudProvider while detaching PD %q: %v", b.pdName, err) time.Sleep(errorSleepDuration) continue } } if numRetries > 0 { glog.Warningf("Retrying attach for GCE PD %q (retry count=%v).", b.pdName, numRetries) } if err := gceCloud.AttachDisk(b.pdName, b.plugin.host.GetHostName(), b.readOnly); err != nil { glog.Errorf("Error attaching PD %q: %v", b.pdName, err) time.Sleep(errorSleepDuration) continue } for numChecks := 0; numChecks < maxChecks; numChecks++ { path, err := verifyDevicePath(devicePaths, sdBeforeSet) if err != nil { // Log error, if any, and continue checking periodically. See issue #11321 glog.Errorf("Error verifying GCE PD (%q) is attached: %v", b.pdName, err) } else if path != "" { // A device path has successfully been created for the PD glog.Infof("Successfully attached GCE PD %q.", b.pdName) return path, nil } // Sleep then check again glog.V(3).Infof("Waiting for GCE PD %q to attach.", b.pdName) time.Sleep(checkSleepDuration) } } return "", fmt.Errorf("Could not attach GCE PD %q. Timeout waiting for mount paths to be created.", b.pdName) }