in internal/onetime/hanadiskrestore/hanadiskrestore.go [360:425]
func (r *Restorer) prepare(ctx context.Context, cp *ipb.CloudProperties, waitForIndexServerStop waitForIndexServerToStopWithRetry, exec commandlineexecutor.Execute) error {
mountPath, err := hanabackup.ReadDataDirMountPath(ctx, r.baseDataPath, exec)
if err != nil {
return fmt.Errorf("failed to read data directory mount path: %v", err)
}
if err := hanabackup.StopHANA(ctx, r.ForceStopHANA, r.HanaSidAdm, r.Sid, exec); err != nil {
return fmt.Errorf("failed to stop HANA: %v", err)
}
if err := waitForIndexServerStop(ctx, r.HanaSidAdm, exec); err != nil {
return fmt.Errorf("hdbindexserver process still running after HANA is stopped: %v", err)
}
if err := hanabackup.Unmount(ctx, mountPath, exec, r.isScaleout); err != nil {
return fmt.Errorf("failed to unmount data directory: %v", err)
}
if !r.isScaleout {
vg, err := r.fetchVG(ctx, cp, exec, r.physicalDataPath)
if err != nil {
return err
}
r.DataDiskVG = vg
}
if !r.isGroupSnapshot {
log.CtxLogger(ctx).Info("Detaching old data disk", "disk", r.DataDiskName, "physicalDataPath", r.physicalDataPath)
if err := r.gceService.DetachDisk(ctx, cp.GetInstanceName(), r.Project, r.DataDiskZone, r.DataDiskName, r.DataDiskDeviceName); err != nil {
// If detach fails, rescan the volume groups to ensure the directories are mounted.
hanabackup.RescanVolumeGroups(ctx)
return fmt.Errorf("failed to detach old data disk: %v", err)
}
} else {
r.oteLogger.LogUsageAction(usagemetrics.HANADiskGroupRestoreStarted)
disksDetached := []*multiDisks{}
for _, d := range r.disks {
log.CtxLogger(ctx).Info("Detaching old data disk", "disk", d.disk.DiskName, "physicalDataPath", fmt.Sprintf("/dev/%s", d.disk.GetMapping()))
if err := r.gceService.DetachDisk(ctx, d.instanceName, r.Project, r.DataDiskZone, d.disk.DiskName, d.disk.DeviceName); err != nil {
log.CtxLogger(ctx).Errorf("failed to detach old data disk: %v", err)
// Reattaching detached disks.
for _, detachedDisk := range disksDetached {
if err := r.gceService.AttachDisk(ctx, detachedDisk.disk.DiskName, detachedDisk.instanceName, r.Project, r.DataDiskZone); err != nil {
return fmt.Errorf("failed to attach old data disk that was detached earlier: %v", err)
}
}
// If detach fails, rescan the volume groups to ensure the directories are mounted.
hanabackup.RescanVolumeGroups(ctx)
errMessage := "failed to detach old data disks"
if r.isScaleout {
// TODO: - Update error message with public docs for scaleout, once out.
errMessage = "failed to detach old data disks, please follow error handling steps for scaleout systems in public docs"
}
return fmt.Errorf("%s: %v", errMessage, err)
}
if err := r.modifyDiskInCG(ctx, d.disk.DiskName, false); err != nil {
log.CtxLogger(ctx).Errorf("failed to modify disk in consistency group: %v", err)
}
disksDetached = append(disksDetached, d)
}
}
log.CtxLogger(ctx).Info("HANA restore prepare succeeded.")
return nil
}