Skip to content

Commit 17bc1dd

Browse files
authored
Fix issue where applying rollback file would incorrectly uninstall workload packs (#38737)
2 parents 367acfd + 2ab2eff commit 17bc1dd

File tree

8 files changed

+42
-14
lines changed

8 files changed

+42
-14
lines changed

src/Cli/dotnet/commands/dotnet-workload/install/WorkloadInstallCommand.cs

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -216,6 +216,11 @@ private void InstallWorkloadsWithInstallRecord(
216216
installer.InstallWorkloadManifest(manifestUpdate, context, offlineCache, rollback);
217217
}
218218

219+
if (usingRollback)
220+
{
221+
UpdateInstallState(true, manifestsToUpdate);
222+
}
223+
219224
_workloadResolver.RefreshWorkloadManifests();
220225

221226
installer.InstallWorkloads(workloadIds, sdkFeatureBand, context, offlineCache);
@@ -227,10 +232,6 @@ private void InstallWorkloadsWithInstallRecord(
227232
recordRepo.WriteWorkloadInstallationRecord(workloadId, sdkFeatureBand);
228233
}
229234

230-
if (usingRollback)
231-
{
232-
UpdateInstallState(true, manifestsToUpdate);
233-
}
234235
},
235236
rollback: () =>
236237
{
@@ -242,6 +243,9 @@ private void InstallWorkloadsWithInstallRecord(
242243
installer.GetWorkloadInstallationRecordRepository()
243244
.DeleteWorkloadInstallationRecord(workloadId, sdkFeatureBand);
244245
}
246+
247+
// Refresh the workload manifests to make sure that the resolver has the updated state after the rollback
248+
_workloadResolver.RefreshWorkloadManifests();
245249
});
246250

247251
}

src/Cli/dotnet/commands/dotnet-workload/update/WorkloadUpdateCommand.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -150,17 +150,19 @@ private void UpdateWorkloadsWithInstallRecord(
150150
_workloadInstaller.InstallWorkloadManifest(manifestUpdate, context, offlineCache, rollback);
151151
}
152152

153+
UpdateInstallState(useRollback, manifestsToUpdate);
154+
153155
_workloadResolver.RefreshWorkloadManifests();
154156

155157
var workloads = GetUpdatableWorkloads();
156158

157159
_workloadInstaller.InstallWorkloads(workloads, sdkFeatureBand, context, offlineCache);
158-
159-
UpdateInstallState(useRollback, manifestsToUpdate);
160160
},
161161
rollback: () =>
162162
{
163163
// Nothing to roll back at this level, InstallWorkloadManifest and InstallWorkloadPacks handle the transaction rollback
164+
// We will refresh the workload manifests to make sure that the resolver has the updated state after the rollback
165+
_workloadResolver.RefreshWorkloadManifests();
164166
});
165167
}
166168

src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/IWorkloadManifestProvider.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ namespace Microsoft.NET.Sdk.WorkloadManifestReader
99
/// </summary>
1010
public interface IWorkloadManifestProvider
1111
{
12+
void RefreshWorkloadManifests();
1213
IEnumerable<ReadableWorkloadManifest> GetManifests();
1314

1415
string GetSdkFeatureBand();

src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/SdkDirectoryWorkloadManifestProvider.cs

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,12 @@ public partial class SdkDirectoryWorkloadManifestProvider : IWorkloadManifestPro
2525
"microsoft.net.workload.maccatalyst", "microsoft.net.workload.macos", "microsoft.net.workload.tvos", "microsoft.net.workload.mono.toolchain" };
2626
private readonly Dictionary<string, int>? _knownManifestIdsAndOrder;
2727

28-
private readonly WorkloadSet? _workloadSet;
29-
private readonly WorkloadSet? _manifestsFromInstallState;
30-
private readonly string? _installStateFilePath;
28+
private readonly string? _workloadSetVersionFromConstructor;
29+
private readonly string? _globalJsonPathFromConstructor;
30+
31+
private WorkloadSet? _workloadSet;
32+
private WorkloadSet? _manifestsFromInstallState;
33+
private string? _installStateFilePath;
3134

3235
public SdkDirectoryWorkloadManifestProvider(string sdkRootPath, string sdkVersion, string? userProfileDir, string? globalJsonPath)
3336
: this(sdkRootPath, sdkVersion, Environment.GetEnvironmentVariable, userProfileDir, globalJsonPath)
@@ -59,6 +62,8 @@ internal SdkDirectoryWorkloadManifestProvider(string sdkRootPath, string sdkVers
5962

6063
_sdkRootPath = sdkRootPath;
6164
_sdkVersionBand = new SdkFeatureBand(sdkVersion);
65+
_workloadSetVersionFromConstructor = workloadSetVersion;
66+
_globalJsonPathFromConstructor = globalJsonPath;
6267

6368
var knownManifestIdsFilePath = Path.Combine(_sdkRootPath, "sdk", sdkVersion, "KnownWorkloadManifests.txt");
6469
if (!File.Exists(knownManifestIdsFilePath))
@@ -102,23 +107,28 @@ internal SdkDirectoryWorkloadManifestProvider(string sdkRootPath, string sdkVers
102107

103108
_manifestRoots ??= Array.Empty<string>();
104109

110+
RefreshWorkloadManifests();
111+
}
112+
113+
public void RefreshWorkloadManifests()
114+
{
105115
var availableWorkloadSets = GetAvailableWorkloadSets();
106116

107-
if (workloadSetVersion != null)
117+
if (_workloadSetVersionFromConstructor != null)
108118
{
109-
if (!availableWorkloadSets.TryGetValue(workloadSetVersion, out _workloadSet))
119+
if (!availableWorkloadSets.TryGetValue(_workloadSetVersionFromConstructor, out _workloadSet))
110120
{
111-
throw new FileNotFoundException(string.Format(Strings.WorkloadVersionNotFound, workloadSetVersion));
121+
throw new FileNotFoundException(string.Format(Strings.WorkloadVersionNotFound, _workloadSetVersionFromConstructor));
112122
}
113123
}
114124
else
115125
{
116-
string? globalJsonWorkloadSetVersion = GlobalJsonReader.GetWorkloadVersionFromGlobalJson(globalJsonPath);
126+
string? globalJsonWorkloadSetVersion = GlobalJsonReader.GetWorkloadVersionFromGlobalJson(_globalJsonPathFromConstructor);
117127
if (globalJsonWorkloadSetVersion != null)
118128
{
119129
if (!availableWorkloadSets.TryGetValue(globalJsonWorkloadSetVersion, out _workloadSet))
120130
{
121-
throw new FileNotFoundException(string.Format(Strings.WorkloadVersionFromGlobalJsonNotFound, globalJsonWorkloadSetVersion, globalJsonPath));
131+
throw new FileNotFoundException(string.Format(Strings.WorkloadVersionFromGlobalJsonNotFound, globalJsonWorkloadSetVersion, _globalJsonPathFromConstructor));
122132
}
123133
}
124134
else

src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/TempDirectoryWorkloadManifestProvider.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ public TempDirectoryWorkloadManifestProvider(string manifestsPath, string sdkFea
1414
_sdkVersionBand = sdkFeatureBand;
1515
}
1616

17+
public void RefreshWorkloadManifests() { }
18+
1719
public IEnumerable<ReadableWorkloadManifest>
1820
GetManifests()
1921
{

src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/WorkloadResolver.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,8 @@ public void RefreshWorkloadManifests()
102102
{
103103
throw new InvalidOperationException("Resolver was created without provider and cannot be refreshed");
104104
}
105+
106+
_manifestProvider.RefreshWorkloadManifests();
105107
_manifests.Clear();
106108
LoadManifestsFromProvider(_manifestProvider);
107109
ComposeWorkloadManifests();
@@ -735,6 +737,7 @@ public EmptyWorkloadManifestProvider(string sdkFeatureBand)
735737
_sdkFeatureBand = sdkFeatureBand;
736738
}
737739

740+
public void RefreshWorkloadManifests() { }
738741
public Dictionary<string, WorkloadSet> GetAvailableWorkloadSets() => new();
739742
public IEnumerable<ReadableWorkloadManifest> GetManifests() => Enumerable.Empty<ReadableWorkloadManifest>();
740743
public string GetSdkFeatureBand() => _sdkFeatureBand;

src/Tests/Microsoft.NET.Sdk.WorkloadManifestReader.Tests/FakeManifestProvider.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ public FakeManifestProvider(params (string manifest, string? localizationCatalog
2020
_filePaths = filePaths;
2121
}
2222

23+
public void RefreshWorkloadManifests() { }
24+
2325
public IEnumerable<ReadableWorkloadManifest> GetManifests()
2426
{
2527
foreach (var filePath in _filePaths)
@@ -46,6 +48,8 @@ internal class InMemoryFakeManifestProvider : IWorkloadManifestProvider, IEnumer
4648

4749
public void Add(string id, string content) => _manifests.Add((id, Encoding.UTF8.GetBytes(content)));
4850

51+
public void RefreshWorkloadManifests() { }
52+
4953
public IEnumerable<ReadableWorkloadManifest> GetManifests()
5054
=> _manifests.Select(m => new ReadableWorkloadManifest(
5155
m.id,

src/Tests/dotnet-workload-install.Tests/MockManifestProvider.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ public MockManifestProvider(params (string name, string path, string featureBand
2929

3030
public Dictionary<string, WorkloadSet> GetAvailableWorkloadSets() => new();
3131

32+
public void RefreshWorkloadManifests() { }
33+
3234
public IEnumerable<ReadableWorkloadManifest> GetManifests()
3335
{
3436
foreach ((var id, var path, var featureBand) in _manifests)

0 commit comments

Comments
 (0)