in internal/workloadmanager/hanametrics.go [593:646]
func fetchLastBackupTimestamps(ctx context.Context, dbTenant hanaDBTenant, exec commandlineexecutor.Execute) (full, delta, snapshot time.Time, err error) {
full, delta, snapshot = time.Time{}, time.Time{}, time.Time{}
dirPath := fmt.Sprintf("/usr/sap/%s/HDB%s/%s/trace/", dbTenant.sid, dbTenant.instanceID, dbTenant.tenantName)
// Fetch a list of successful backups and process them from most to least
// recent to find a timestamp for each backup type (full, delta, snapshot).
backups, err := fetchSuccessfulBackups(ctx, dirPath, exec)
if err != nil {
return full, delta, snapshot, err
}
if len(backups) == 0 {
log.CtxLogger(ctx).Debugw("No successful HANA backups found", "tenant", dbTenant.tenantName)
return full, delta, snapshot, nil
}
backupTypeMap, err := fetchBackupThreadIDs(ctx, dirPath, exec)
if err != nil {
return full, delta, snapshot, err
}
if len(backupTypeMap) == 0 {
log.CtxLogger(ctx).Debugw("No HANA backup commands found", "tenant", dbTenant.tenantName)
return full, delta, snapshot, nil
}
sort.Slice(backups, func(i, j int) bool { return backups[i].finishTime.After(backups[j].finishTime) })
for _, backup := range backups {
if !delta.IsZero() && !full.IsZero() && !snapshot.IsZero() {
break
}
if backupType, ok := backupTypeMap[backup.backupID]; ok {
switch {
case full.IsZero() && backupType == hanaBackupFull:
// This is the latest successful full backup for this tenant.
full = backup.finishTime
case delta.IsZero() && backupType == hanaBackupDelta:
// This is the latest delta backup for this tenant.
delta = backup.finishTime
case snapshot.IsZero() && backupType == hanaBackupSnapshot:
// This is the latest snapshot backup for this tenant.
snapshot = backup.finishTime
}
}
}
if full.IsZero() {
log.CtxLogger(ctx).Debugw("No full backup found", "tenant", dbTenant.tenantName)
}
if delta.IsZero() {
log.CtxLogger(ctx).Debugw("No delta backup found", "tenant", dbTenant.tenantName)
}
if snapshot.IsZero() {
log.CtxLogger(ctx).Debugw("No snapshot backup found", "tenant", dbTenant.tenantName)
}
return full, delta, snapshot, nil
}