From ed2daeedf67bdf7ec7f56cf5ab3287e5593d2107 Mon Sep 17 00:00:00 2001 From: Lyndon-Li Date: Wed, 1 Apr 2026 18:03:45 +0800 Subject: [PATCH] issue 9659: fix crash on cancel without loading data path Signed-off-by: Lyndon-Li --- changelogs/unreleased/9663-Lyndon-Li‎‎ | 1 + pkg/datamover/backup_micro_service.go | 1 + pkg/datamover/restore_micro_service.go | 1 + pkg/podvolume/backup_micro_service.go | 1 + pkg/podvolume/restore_micro_service.go | 1 + 5 files changed, 5 insertions(+) create mode 100644 changelogs/unreleased/9663-Lyndon-Li‎‎ diff --git a/changelogs/unreleased/9663-Lyndon-Li‎‎ b/changelogs/unreleased/9663-Lyndon-Li‎‎ new file mode 100644 index 000000000..35ae4d5cb --- /dev/null +++ b/changelogs/unreleased/9663-Lyndon-Li‎‎ @@ -0,0 +1 @@ +Fix issue #9659, in the case that PVB/PVR/DU/DD is cancelled before the data path is really started, call EndEvent to prevent data mover pod from crashing because of delay event distribution \ No newline at end of file diff --git a/pkg/datamover/backup_micro_service.go b/pkg/datamover/backup_micro_service.go index 3c6601cbf..61c308f15 100644 --- a/pkg/datamover/backup_micro_service.go +++ b/pkg/datamover/backup_micro_service.go @@ -310,6 +310,7 @@ func (r *BackupMicroService) cancelDataUpload(du *velerov2alpha1api.DataUpload) fsBackup := r.dataPathMgr.GetAsyncBR(du.Name) if fsBackup == nil { r.OnDataUploadCancelled(r.ctx, du.GetNamespace(), du.GetName()) + r.eventRecorder.EndingEvent(du, false, datapath.EventReasonStopped, "Data path for %s exited without start", du.Name) } else { fsBackup.Cancel() } diff --git a/pkg/datamover/restore_micro_service.go b/pkg/datamover/restore_micro_service.go index 1b7ebcc09..0cb5f18ec 100644 --- a/pkg/datamover/restore_micro_service.go +++ b/pkg/datamover/restore_micro_service.go @@ -288,6 +288,7 @@ func (r *RestoreMicroService) cancelDataDownload(dd *velerov2alpha1api.DataDownl fsBackup := r.dataPathMgr.GetAsyncBR(dd.Name) if fsBackup == nil { r.OnDataDownloadCancelled(r.ctx, dd.GetNamespace(), dd.GetName()) + r.eventRecorder.EndingEvent(dd, false, datapath.EventReasonStopped, "Data path for %s exited without start", dd.Name) } else { fsBackup.Cancel() } diff --git a/pkg/podvolume/backup_micro_service.go b/pkg/podvolume/backup_micro_service.go index 3c9cbab61..11ca66676 100644 --- a/pkg/podvolume/backup_micro_service.go +++ b/pkg/podvolume/backup_micro_service.go @@ -307,6 +307,7 @@ func (r *BackupMicroService) cancelPodVolumeBackup(pvb *velerov1api.PodVolumeBac fsBackup := r.dataPathMgr.GetAsyncBR(pvb.Name) if fsBackup == nil { r.OnDataPathCancelled(r.ctx, pvb.GetNamespace(), pvb.GetName()) + r.eventRecorder.EndingEvent(pvb, false, datapath.EventReasonStopped, "Data path for %s exited without start", pvb.Name) } else { fsBackup.Cancel() } diff --git a/pkg/podvolume/restore_micro_service.go b/pkg/podvolume/restore_micro_service.go index 40d6aa1fb..decf94b1b 100644 --- a/pkg/podvolume/restore_micro_service.go +++ b/pkg/podvolume/restore_micro_service.go @@ -302,6 +302,7 @@ func (r *RestoreMicroService) cancelPodVolumeRestore(pvr *velerov1api.PodVolumeR fsBackup := r.dataPathMgr.GetAsyncBR(pvr.Name) if fsBackup == nil { r.OnPvrCancelled(r.ctx, pvr.GetNamespace(), pvr.GetName()) + r.eventRecorder.EndingEvent(pvr, false, datapath.EventReasonStopped, "Data path for %s exited without start", pvr.Name) } else { fsBackup.Cancel() }