func()

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
}