From 174f2e4aa4ee0aadc140c332f93be0ecdc0e5d26 Mon Sep 17 00:00:00 2001 From: Paolo Chila Date: Tue, 18 Nov 2025 16:10:05 +0100 Subject: [PATCH 1/7] Fix error handling during cleanup --- internal/pkg/agent/application/upgrade/rollback.go | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/internal/pkg/agent/application/upgrade/rollback.go b/internal/pkg/agent/application/upgrade/rollback.go index 96f97fed1cc..aee831269db 100644 --- a/internal/pkg/agent/application/upgrade/rollback.go +++ b/internal/pkg/agent/application/upgrade/rollback.go @@ -174,16 +174,17 @@ func cleanup(log *logger.Logger, topDirPath string, removeMarker, keepLogs bool, dirPrefix := fmt.Sprintf("%s-", AgentName) + var cumulativeError error relativeHomePaths := make([]string, len(versionedHomesToKeep)) for i, h := range versionedHomesToKeep { - relHomePath, err := filepath.Rel("data", h) + relHomePath, err := filepath.Rel(dataDirPath, filepath.Join(topDirPath, h)) if err != nil { - return fmt.Errorf("extracting elastic-agent path relative to data directory from %s: %w", h, err) + cumulativeError = goerrors.Join(cumulativeError, fmt.Errorf("extracting elastic-agent path relative to data directory from %s: %w", h, err)) + continue } relativeHomePaths[i] = relHomePath } - var errs []error for _, dir := range subdirs { if slices.Contains(relativeHomePaths, dir) { continue @@ -200,11 +201,11 @@ func cleanup(log *logger.Logger, topDirPath string, removeMarker, keepLogs bool, ignoredDirs = append(ignoredDirs, "logs") } if cleanupErr := install.RemoveBut(hashedDir, true, ignoredDirs...); cleanupErr != nil { - errs = append(errs, cleanupErr) + cumulativeError = goerrors.Join(cumulativeError, cleanupErr) } } - return goerrors.Join(errs...) + return cumulativeError } // InvokeWatcher invokes an agent instance using watcher argument for watching behavior of From d2e5936d285d1cc3856904b37c53705031e91458 Mon Sep 17 00:00:00 2001 From: Paolo Chila Date: Thu, 20 Nov 2025 18:06:34 +0100 Subject: [PATCH 2/7] Fix versionedHomes to always be relative paths --- .../application/upgrade/manual_rollback.go | 7 +++++++ .../pkg/agent/application/upgrade/rollback.go | 4 ++++ internal/pkg/agent/cmd/watch.go | 21 ++++++++++++++++++- 3 files changed, 31 insertions(+), 1 deletion(-) diff --git a/internal/pkg/agent/application/upgrade/manual_rollback.go b/internal/pkg/agent/application/upgrade/manual_rollback.go index 664ba586da1..6b78163b303 100644 --- a/internal/pkg/agent/application/upgrade/manual_rollback.go +++ b/internal/pkg/agent/application/upgrade/manual_rollback.go @@ -102,6 +102,13 @@ func rollbackUsingAgentInstalls(log *logger.Logger, watcherHelper WatcherHelper, return "", "", fmt.Errorf("version %q not listed among the available rollbacks: %w", rollbackVersion, ErrNoRollbacksAvailable) } + if filepath.IsAbs(targetInstall) { + targetInstall, err = filepath.Rel(topDir, targetInstall) + if err != nil { + return "", "", fmt.Errorf("error calculating path of install %q relative to %q: %w", targetInstall, topDir, err) + } + } + prevAgentParsedVersion, err := version.ParseVersion(targetTTLMarker.Version) if err != nil { return "", "", fmt.Errorf("parsing version of target install %+v: %w", targetInstall, err) diff --git a/internal/pkg/agent/application/upgrade/rollback.go b/internal/pkg/agent/application/upgrade/rollback.go index aee831269db..cdfdd496787 100644 --- a/internal/pkg/agent/application/upgrade/rollback.go +++ b/internal/pkg/agent/application/upgrade/rollback.go @@ -174,6 +174,8 @@ func cleanup(log *logger.Logger, topDirPath string, removeMarker, keepLogs bool, dirPrefix := fmt.Sprintf("%s-", AgentName) + log.Infof("versioned homes to keep: %v", versionedHomesToKeep) + var cumulativeError error relativeHomePaths := make([]string, len(versionedHomesToKeep)) for i, h := range versionedHomesToKeep { @@ -185,6 +187,8 @@ func cleanup(log *logger.Logger, topDirPath string, removeMarker, keepLogs bool, relativeHomePaths[i] = relHomePath } + log.Infof("Starting cleanup of versioned homes. Keeping: %v", relativeHomePaths) + for _, dir := range subdirs { if slices.Contains(relativeHomePaths, dir) { continue diff --git a/internal/pkg/agent/cmd/watch.go b/internal/pkg/agent/cmd/watch.go index 2308a7630d5..31dd2925bb6 100644 --- a/internal/pkg/agent/cmd/watch.go +++ b/internal/pkg/agent/cmd/watch.go @@ -200,7 +200,19 @@ func watchCmd(log *logp.Logger, topDir string, cfg *configuration.UpgradeWatcher // hash is the same as hash of agent which initiated watcher. versionedHomesToKeep := make([]string, 0, len(marker.RollbacksAvailable)+1) // current version needs to be kept - versionedHomesToKeep = append(versionedHomesToKeep, paths.VersionedHome(topDir)) + if marker.Details != nil && marker.Details.State == details.StateRollback { + // we need to keep the previous versioned home (we have rolled back) + versionedHomesToKeep = append(versionedHomesToKeep, marker.PrevVersionedHome) + } else { + // we need to keep the upgraded version, since it has not been rolled back + absCurrentVersionedHome := paths.VersionedHome(topDir) + currentVersionedHome, err := filepath.Rel(topDir, absCurrentVersionedHome) + if err != nil { + return fmt.Errorf("extracting current home path %q relative to %q: %w", absCurrentVersionedHome, topDir, err) + } + versionedHomesToKeep = append(versionedHomesToKeep, currentVersionedHome) + } + versionedHomesToKeep = appendAvailableRollbacks(log, marker, versionedHomesToKeep) log.Infof("About to clean up upgrade. Keeping versioned homes: %v", versionedHomesToKeep) if err := installModifier.Cleanup(log, paths.Top(), true, false, versionedHomesToKeep...); err != nil { @@ -320,6 +332,13 @@ func rollback(log *logp.Logger, topDir string, client client.Client, installModi // FIXME get the hash from the list of installs or the manifest or the versioned home // This is only a placeholder in case there is no versionedHome defined (which we always have) hash := "" + if filepath.IsAbs(versionedHome) { + // if the versioned home is an absolute path we need + versionedHome, err = filepath.Rel(topDir, versionedHome) + if err != nil { + return fmt.Errorf("extract from %q a path relative to %q: %w", versionedHome, topDir, err) + } + } err = installModifier.Rollback(context.Background(), log, client, topDir, versionedHome, hash, WithPreRestartHook(updateMarkerAndDetails)) if err != nil { return fmt.Errorf("rolling back: %w", err) From 67984377f7d2077de7ae7f790f6a713b75306550 Mon Sep 17 00:00:00 2001 From: Paolo Chila Date: Fri, 21 Nov 2025 09:52:52 +0100 Subject: [PATCH 3/7] Exit watcher when finished rolling back --- internal/pkg/agent/cmd/watch.go | 1 + 1 file changed, 1 insertion(+) diff --git a/internal/pkg/agent/cmd/watch.go b/internal/pkg/agent/cmd/watch.go index 31dd2925bb6..188272c103b 100644 --- a/internal/pkg/agent/cmd/watch.go +++ b/internal/pkg/agent/cmd/watch.go @@ -102,6 +102,7 @@ func newWatchCommandWithArgs(_ []string, streams *cli.IOStreams) *cobra.Command fmt.Fprintf(streams.Err, "Rollback command failed: %v\n", err) os.Exit(errorRollbackFailed) } + return } if err = withAppLocker(log, func() error { From ca7c7ba25ac9facbdceb98650e518d2813292003 Mon Sep 17 00:00:00 2001 From: Paolo Chila Date: Fri, 21 Nov 2025 15:40:36 +0100 Subject: [PATCH 4/7] update watchCmd unit tests to user versioned homes relative to topDir --- internal/pkg/agent/cmd/watch_test.go | 42 ++++++++++++++-------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/internal/pkg/agent/cmd/watch_test.go b/internal/pkg/agent/cmd/watch_test.go index 0ebce30753f..450e4f69c07 100644 --- a/internal/pkg/agent/cmd/watch_test.go +++ b/internal/pkg/agent/cmd/watch_test.go @@ -122,11 +122,11 @@ func Test_watchCmd(t *testing.T) { &upgrade.UpdateMarker{ Version: "4.5.6", Hash: "newver", - VersionedHome: "elastic-agent-4.5.6-newver", + VersionedHome: "data/elastic-agent-4.5.6-newver", UpdatedOn: time.Now(), PrevVersion: "1.2.3", PrevHash: "prvver", - PrevVersionedHome: "elastic-agent-prvver", + PrevVersionedHome: "data/elastic-agent-prvver", Acked: false, Action: nil, Details: nil, //details.NewDetails("4.5.6", details.StateReplacing, ""), @@ -143,7 +143,7 @@ func Test_watchCmd(t *testing.T) { expectedRemoveMarkerFlag := runtime.GOOS != "windows" installModifier.EXPECT(). - Cleanup(mock.Anything, topDir, expectedRemoveMarkerFlag, false, "elastic-agent-4.5.6-newver"). + Cleanup(mock.Anything, topDir, expectedRemoveMarkerFlag, false, filepath.Join("data", "elastic-agent-4.5.6-newver")). Return(nil) }, args: args{ @@ -162,11 +162,11 @@ func Test_watchCmd(t *testing.T) { &upgrade.UpdateMarker{ Version: "9.3.0", Hash: "newver", - VersionedHome: "elastic-agent-9.3.0-newver", + VersionedHome: "data/elastic-agent-9.3.0-newver", UpdatedOn: time.Now(), PrevVersion: "9.2.0", PrevHash: "prvver", - PrevVersionedHome: "elastic-agent-9.2.0-prvver", + PrevVersionedHome: "data/elastic-agent-9.2.0-prvver", Acked: false, Action: nil, Details: nil, @@ -179,7 +179,7 @@ func Test_watchCmd(t *testing.T) { Watch(mock.Anything, mock.Anything, mock.Anything, mock.Anything). Return(errors.New("some watch error due to agent misbehaving")) installModifier.EXPECT(). - Rollback(mock.Anything, mock.Anything, mock.Anything, paths.Top(), "elastic-agent-9.2.0-prvver", "prvver", mock.MatchedBy(func(opt upgrade.RollbackOption) bool { + Rollback(mock.Anything, mock.Anything, mock.Anything, paths.Top(), filepath.Join("data", "elastic-agent-9.2.0-prvver"), "prvver", mock.MatchedBy(func(opt upgrade.RollbackOption) bool { settings := upgrade.NewRollbackSettings() opt(settings) @@ -203,11 +203,11 @@ func Test_watchCmd(t *testing.T) { &upgrade.UpdateMarker{ Version: "4.5.6", Hash: "newver", - VersionedHome: "elastic-agent-4.5.6-newver", + VersionedHome: "data/elastic-agent-4.5.6-newver", UpdatedOn: time.Now(), PrevVersion: "1.2.3", PrevHash: "prvver", - PrevVersionedHome: "elastic-agent-1.2.3-prvver", + PrevVersionedHome: "data/elastic-agent-1.2.3-prvver", Acked: false, Action: nil, Details: nil, //details.NewDetails("4.5.6", details.StateReplacing, ""), @@ -225,7 +225,7 @@ func Test_watchCmd(t *testing.T) { mock.Anything, mock.Anything, paths.Top(), - "elastic-agent-1.2.3-prvver", + filepath.Join("data", "elastic-agent-1.2.3-prvver"), "prvver", mock.MatchedBy(func(opt upgrade.RollbackOption) bool { settings := upgrade.NewRollbackSettings() @@ -250,11 +250,11 @@ func Test_watchCmd(t *testing.T) { &upgrade.UpdateMarker{ Version: "4.5.6", Hash: "newver", - VersionedHome: "elastic-agent-4.5.6-newver", + VersionedHome: "data/elastic-agent-4.5.6-newver", UpdatedOn: time.Now(), PrevVersion: "1.2.3", PrevHash: "prvver", - PrevVersionedHome: "elastic-agent-prvver", + PrevVersionedHome: "data/elastic-agent-prvver", Acked: false, Action: nil, Details: &details.Details{ @@ -271,7 +271,7 @@ func Test_watchCmd(t *testing.T) { // topdir, prevVersionedHome and prevHash are not taken from the upgrade marker, otherwise they would be // installModifier.EXPECT(). - Cleanup(mock.Anything, paths.Top(), true, false, paths.VersionedHome(topDir)). + Cleanup(mock.Anything, paths.Top(), true, false, filepath.Join("data", "elastic-agent-prvver")). Return(nil) }, args: args{ @@ -291,11 +291,11 @@ func Test_watchCmd(t *testing.T) { &upgrade.UpdateMarker{ Version: "4.5.6", Hash: "newver", - VersionedHome: "elastic-agent-4.5.6-newver", + VersionedHome: "data/elastic-agent-4.5.6-newver", UpdatedOn: updatedOn, PrevVersion: "1.2.3", PrevHash: "prvver", - PrevVersionedHome: "elastic-agent-prvver", + PrevVersionedHome: "data/elastic-agent-prvver", Acked: false, Action: nil, Details: nil, @@ -304,10 +304,10 @@ func Test_watchCmd(t *testing.T) { ) require.NoError(t, err) - // topdir, prevVersionedHome and prevHash are not taken from the upgrade marker, otherwise they would be - // + // topdir, versionedHome and hash are not taken from the upgrade marker, otherwise they would be + // installModifier.EXPECT(). - Cleanup(mock.Anything, paths.Top(), true, false, paths.VersionedHome(topDir)). + Cleanup(mock.Anything, paths.Top(), true, false, filepath.Join("data", "elastic-agent-unknow")). Return(nil) }, args: args{ @@ -321,7 +321,7 @@ func Test_watchCmd(t *testing.T) { wantErr: assert.NoError, }, { - name: "Desired outcome is rollback no upgrade details, no rollback and simple cleanup", + name: "Default config, no rollback and simple cleanup", setupUpgradeMarker: func(t *testing.T, tmpDir string, watcher *mockAgentWatcher, installModifier *mockInstallationModifier) { dataDirPath := paths.DataFrom(tmpDir) err := os.MkdirAll(dataDirPath, 0755) @@ -333,11 +333,11 @@ func Test_watchCmd(t *testing.T) { &upgrade.UpdateMarker{ Version: "4.5.6", Hash: "newver", - VersionedHome: "elastic-agent-4.5.6-newver", + VersionedHome: "data/elastic-agent-4.5.6-newver", UpdatedOn: updatedOn, PrevVersion: "1.2.3", PrevHash: "prvver", - PrevVersionedHome: "elastic-agent-prvver", + PrevVersionedHome: "data/elastic-agent-prvver", Acked: false, Action: &fleetapi.ActionUpgrade{ ActionID: "action-id", @@ -351,7 +351,7 @@ func Test_watchCmd(t *testing.T) { require.NoError(t, err) installModifier.EXPECT(). - Cleanup(mock.Anything, paths.Top(), true, false, paths.VersionedHome(tmpDir)). + Cleanup(mock.Anything, paths.Top(), true, false, filepath.Join("data", "elastic-agent-unknow")). Return(nil) }, args: args{ From ca32577c0cfdda7fccaf4f48c3d8bb5183e8eddb Mon Sep 17 00:00:00 2001 From: Paolo Chila Date: Sat, 22 Nov 2025 18:19:01 +0100 Subject: [PATCH 5/7] fixup! update watchCmd unit tests to user versioned homes relative to topDir --- internal/pkg/agent/cmd/watch_test.go | 33 +++++++++++++++------------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/internal/pkg/agent/cmd/watch_test.go b/internal/pkg/agent/cmd/watch_test.go index 450e4f69c07..c6f14772e49 100644 --- a/internal/pkg/agent/cmd/watch_test.go +++ b/internal/pkg/agent/cmd/watch_test.go @@ -122,11 +122,11 @@ func Test_watchCmd(t *testing.T) { &upgrade.UpdateMarker{ Version: "4.5.6", Hash: "newver", - VersionedHome: "data/elastic-agent-4.5.6-newver", + VersionedHome: filepath.Join("data", "elastic-agent-4.5.6-newver"), UpdatedOn: time.Now(), PrevVersion: "1.2.3", PrevHash: "prvver", - PrevVersionedHome: "data/elastic-agent-prvver", + PrevVersionedHome: filepath.Join("data", "elastic-agent-prvver"), Acked: false, Action: nil, Details: nil, //details.NewDetails("4.5.6", details.StateReplacing, ""), @@ -157,16 +157,17 @@ func Test_watchCmd(t *testing.T) { dataDirPath := paths.DataFrom(topDir) err := os.MkdirAll(dataDirPath, 0755) require.NoError(t, err) + previousVersionedHome := filepath.Join("data", "elastic-agent-9.2.0-prvver") err = upgrade.SaveMarker( dataDirPath, &upgrade.UpdateMarker{ Version: "9.3.0", Hash: "newver", - VersionedHome: "data/elastic-agent-9.3.0-newver", + VersionedHome: filepath.Join("data", "elastic-agent-9.3.0-newver"), UpdatedOn: time.Now(), PrevVersion: "9.2.0", PrevHash: "prvver", - PrevVersionedHome: "data/elastic-agent-9.2.0-prvver", + PrevVersionedHome: previousVersionedHome, Acked: false, Action: nil, Details: nil, @@ -179,7 +180,7 @@ func Test_watchCmd(t *testing.T) { Watch(mock.Anything, mock.Anything, mock.Anything, mock.Anything). Return(errors.New("some watch error due to agent misbehaving")) installModifier.EXPECT(). - Rollback(mock.Anything, mock.Anything, mock.Anything, paths.Top(), filepath.Join("data", "elastic-agent-9.2.0-prvver"), "prvver", mock.MatchedBy(func(opt upgrade.RollbackOption) bool { + Rollback(mock.Anything, mock.Anything, mock.Anything, paths.Top(), previousVersionedHome, "prvver", mock.MatchedBy(func(opt upgrade.RollbackOption) bool { settings := upgrade.NewRollbackSettings() opt(settings) @@ -198,16 +199,17 @@ func Test_watchCmd(t *testing.T) { dataDirPath := paths.DataFrom(topDir) err := os.MkdirAll(dataDirPath, 0755) require.NoError(t, err) + previousVersionedHome := filepath.Join("data", "elastic-agent-1.2.3-prvver") err = upgrade.SaveMarker( dataDirPath, &upgrade.UpdateMarker{ Version: "4.5.6", Hash: "newver", - VersionedHome: "data/elastic-agent-4.5.6-newver", + VersionedHome: filepath.Join("data", "elastic-agent-4.5.6-newver"), UpdatedOn: time.Now(), PrevVersion: "1.2.3", PrevHash: "prvver", - PrevVersionedHome: "data/elastic-agent-1.2.3-prvver", + PrevVersionedHome: previousVersionedHome, Acked: false, Action: nil, Details: nil, //details.NewDetails("4.5.6", details.StateReplacing, ""), @@ -225,7 +227,7 @@ func Test_watchCmd(t *testing.T) { mock.Anything, mock.Anything, paths.Top(), - filepath.Join("data", "elastic-agent-1.2.3-prvver"), + previousVersionedHome, "prvver", mock.MatchedBy(func(opt upgrade.RollbackOption) bool { settings := upgrade.NewRollbackSettings() @@ -245,16 +247,17 @@ func Test_watchCmd(t *testing.T) { dataDirPath := paths.DataFrom(topDir) err := os.MkdirAll(dataDirPath, 0755) require.NoError(t, err) + previousVersionedHome := filepath.Join("data", "elastic-agent-prvver") err = upgrade.SaveMarker( dataDirPath, &upgrade.UpdateMarker{ Version: "4.5.6", Hash: "newver", - VersionedHome: "data/elastic-agent-4.5.6-newver", + VersionedHome: filepath.Join("data", "elastic-agent-4.5.6-newver"), UpdatedOn: time.Now(), PrevVersion: "1.2.3", PrevHash: "prvver", - PrevVersionedHome: "data/elastic-agent-prvver", + PrevVersionedHome: previousVersionedHome, Acked: false, Action: nil, Details: &details.Details{ @@ -271,7 +274,7 @@ func Test_watchCmd(t *testing.T) { // topdir, prevVersionedHome and prevHash are not taken from the upgrade marker, otherwise they would be // installModifier.EXPECT(). - Cleanup(mock.Anything, paths.Top(), true, false, filepath.Join("data", "elastic-agent-prvver")). + Cleanup(mock.Anything, paths.Top(), true, false, previousVersionedHome). Return(nil) }, args: args{ @@ -291,11 +294,11 @@ func Test_watchCmd(t *testing.T) { &upgrade.UpdateMarker{ Version: "4.5.6", Hash: "newver", - VersionedHome: "data/elastic-agent-4.5.6-newver", + VersionedHome: filepath.Join("data", "elastic-agent-4.5.6-newver"), UpdatedOn: updatedOn, PrevVersion: "1.2.3", PrevHash: "prvver", - PrevVersionedHome: "data/elastic-agent-prvver", + PrevVersionedHome: filepath.Join("data", "elastic-agent-prvver"), Acked: false, Action: nil, Details: nil, @@ -333,11 +336,11 @@ func Test_watchCmd(t *testing.T) { &upgrade.UpdateMarker{ Version: "4.5.6", Hash: "newver", - VersionedHome: "data/elastic-agent-4.5.6-newver", + VersionedHome: filepath.Join("data", "elastic-agent-4.5.6-newver"), UpdatedOn: updatedOn, PrevVersion: "1.2.3", PrevHash: "prvver", - PrevVersionedHome: "data/elastic-agent-prvver", + PrevVersionedHome: filepath.Join("data", "elastic-agent-prvver"), Acked: false, Action: &fleetapi.ActionUpgrade{ ActionID: "action-id", From 18c8b7951788e66add007908970d8d7b9d16a96f Mon Sep 17 00:00:00 2001 From: Paolo Chila Date: Thu, 27 Nov 2025 08:26:23 +0100 Subject: [PATCH 6/7] fixup! Fix versionedHomes to always be relative paths --- internal/pkg/agent/cmd/watch.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/internal/pkg/agent/cmd/watch.go b/internal/pkg/agent/cmd/watch.go index 188272c103b..d13df5732a3 100644 --- a/internal/pkg/agent/cmd/watch.go +++ b/internal/pkg/agent/cmd/watch.go @@ -334,7 +334,8 @@ func rollback(log *logp.Logger, topDir string, client client.Client, installModi // This is only a placeholder in case there is no versionedHome defined (which we always have) hash := "" if filepath.IsAbs(versionedHome) { - // if the versioned home is an absolute path we need + // if the versioned home is an absolute path we need to normalize it relative to the current topDir as the + // cleanup() will expect relative paths versionedHome, err = filepath.Rel(topDir, versionedHome) if err != nil { return fmt.Errorf("extract from %q a path relative to %q: %w", versionedHome, topDir, err) From 41d1b6a86d6fc97d16f06f58fd93d703f47c3689 Mon Sep 17 00:00:00 2001 From: Paolo Chila Date: Mon, 1 Dec 2025 18:24:59 +0100 Subject: [PATCH 7/7] Fix versionedHomesToKeep handling in watcher cleanup --- internal/pkg/agent/application/upgrade/rollback.go | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/internal/pkg/agent/application/upgrade/rollback.go b/internal/pkg/agent/application/upgrade/rollback.go index cdfdd496787..380e074ab03 100644 --- a/internal/pkg/agent/application/upgrade/rollback.go +++ b/internal/pkg/agent/application/upgrade/rollback.go @@ -177,14 +177,15 @@ func cleanup(log *logger.Logger, topDirPath string, removeMarker, keepLogs bool, log.Infof("versioned homes to keep: %v", versionedHomesToKeep) var cumulativeError error - relativeHomePaths := make([]string, len(versionedHomesToKeep)) - for i, h := range versionedHomesToKeep { + relativeHomePaths := make([]string, 0, len(versionedHomesToKeep)) + for _, h := range versionedHomesToKeep { relHomePath, err := filepath.Rel(dataDirPath, filepath.Join(topDirPath, h)) if err != nil { cumulativeError = goerrors.Join(cumulativeError, fmt.Errorf("extracting elastic-agent path relative to data directory from %s: %w", h, err)) - continue + // best effort: try to use the entry as-is, without calculating the path relative to `data` + relHomePath = h } - relativeHomePaths[i] = relHomePath + relativeHomePaths = append(relativeHomePaths, relHomePath) } log.Infof("Starting cleanup of versioned homes. Keeping: %v", relativeHomePaths)