in internal/onetime/hanadiskbackup/multidisk.go [64:151]
func (s *Snapshot) runWorkflowForInstantSnapshotGroups(ctx context.Context, run queryFunc, cp *ipb.CloudProperties) (err error) {
if err := s.deleteStaleISGs(ctx); err != nil {
log.CtxLogger(ctx).Errorw("Error deleting stale instant snapshot groups", "error", err)
}
for _, d := range s.disks {
if err = s.isDiskAttachedToInstance(ctx, d, cp); err != nil {
return err
}
}
log.CtxLogger(ctx).Info("Start run HANA Disk based backup workflow")
if err = s.abandonPreparedSnapshot(ctx, run); err != nil {
s.oteLogger.LogUsageError(usagemetrics.SnapshotDBNotReadyFailure)
return err
}
var snapshotID string
if snapshotID, err = s.createNewHANASnapshot(ctx, run); err != nil {
s.oteLogger.LogUsageError(usagemetrics.SnapshotDBNotReadyFailure)
return err
}
err = s.createInstantSnapshotGroup(ctx)
if s.FreezeFileSystem {
if err := hanabackup.UnFreezeXFS(ctx, s.hanaDataPath, commandlineexecutor.ExecuteCommand); err != nil {
s.oteLogger.LogErrorToFileAndConsole(ctx, "error unfreezing XFS", err)
return err
}
freezeTime := time.Since(dbFreezeStartTime)
defer s.sendDurationToCloudMonitoring(ctx, metricPrefix+s.Name()+"/dbfreezetime", s.groupSnapshotName, freezeTime, cloudmonitoring.NewDefaultBackOffIntervals(), cp)
}
if err != nil {
s.oteLogger.LogErrorToFileAndConsole(ctx, fmt.Sprintf("error creating instant snapshot group, HANA snapshot %s is not successful", snapshotID), err)
s.diskSnapshotFailureHandler(ctx, run, snapshotID)
return err
}
var ssOps []*snapshotOp
if ssOps, err = s.convertISGInstantSnapshots(ctx, cp); err != nil {
s.oteLogger.LogErrorToFileAndConsole(ctx, fmt.Sprintf("error converting instant snapshots to %s, HANA snapshot %s is not successful", strings.ToLower(s.SnapshotType), snapshotID), err)
s.diskSnapshotFailureHandler(ctx, run, snapshotID)
if err := s.isgService.DeleteISG(ctx, s.Project, s.DiskZone, s.groupSnapshotName); err != nil {
s.oteLogger.LogErrorToFileAndConsole(ctx, fmt.Sprintf("error deleting created instant snapshot group"), err)
}
return err
}
if s.ConfirmDataSnapshotAfterCreate {
log.CtxLogger(ctx).Info("Marking HANA snapshot as successful after disk snapshots are created but not yet uploaded.")
if err := s.markSnapshotAsSuccessful(ctx, run, snapshotID); err != nil {
if err := s.isgService.DeleteISG(ctx, s.Project, s.DiskZone, s.groupSnapshotName); err != nil {
s.oteLogger.LogErrorToFileAndConsole(ctx, fmt.Sprintf("error deleting created instant snapshot group"), err)
}
return err
}
}
s.oteLogger.LogMessageToFileAndConsole(ctx, "Waiting for disk snapshots to complete uploading.")
for _, ssOp := range ssOps {
if err := s.gceService.WaitForInstantSnapshotConversionCompletionWithRetry(ctx, ssOp.op, s.Project, s.DiskZone, ssOp.name); err != nil {
log.CtxLogger(ctx).Errorw("Error uploading disk snapshot", "error", err)
if s.ConfirmDataSnapshotAfterCreate {
s.oteLogger.LogErrorToFileAndConsole(
ctx, fmt.Sprintf("Error uploading disk snapshot, HANA snapshot %s is not successful", snapshotID), err,
)
}
s.diskSnapshotFailureHandler(ctx, run, snapshotID)
if err := s.isgService.DeleteISG(ctx, s.Project, s.DiskZone, s.groupSnapshotName); err != nil {
s.oteLogger.LogErrorToFileAndConsole(ctx, fmt.Sprintf("error deleting created instant snapshot group"), err)
}
return err
}
}
if err := s.isgService.DeleteISG(ctx, s.Project, s.DiskZone, s.groupSnapshotName); err != nil {
s.oteLogger.LogErrorToFileAndConsole(ctx, "error deleting instant snapshot group, but disk snapshots are successful", err)
}
log.CtxLogger(ctx).Info(fmt.Sprintf("Instant snapshot group and %s equivalents created, marking HANA snapshot as successful.", strings.ToLower(s.SnapshotType)))
if !s.ConfirmDataSnapshotAfterCreate {
if err := s.markSnapshotAsSuccessful(ctx, run, snapshotID); err != nil {
return err
}
}
return nil
}