Skip to content

Commit 7823869

Browse files
committed
Refactor places that take & release locks on VersionCache to use a lambda-based helper instead
1 parent a5ff887 commit 7823869

4 files changed

Lines changed: 25 additions & 55 deletions

File tree

src/Server/Controllers/Api/v1/VersionController.cs

Lines changed: 6 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,7 @@ public async Task<ActionResult<object>> GetLatestStable(
1818
[FromQuery] string? arch = null
1919
)
2020
{
21-
var lck = await vcache.TakeLockAsync();
22-
23-
var latest = vcache.Latest;
24-
25-
lck.Dispose();
21+
var latest = await vcache.GetReleaseAsync(c => c.Latest);
2622

2723
if (latest is null)
2824
return NotFound();
@@ -52,11 +48,7 @@ public async Task<ActionResult<object>> GetLatestCanary(
5248
[FromQuery] string? arch = null
5349
)
5450
{
55-
var lck = await vcache.TakeLockAsync();
56-
57-
var latest = vcache.Latest;
58-
59-
lck.Dispose();
51+
var latest = await vcache.GetReleaseAsync(c => c.Latest);
6052

6153
if (latest is null)
6254
return NotFound();
@@ -85,11 +77,8 @@ public async Task<ActionResult<VersionCacheEntry>> GetSpecificStable(
8577
string version
8678
)
8779
{
88-
using (var _ = await vcache.TakeLockAsync())
89-
{
90-
if (vcache[version] is { } cacheEntry)
91-
return Ok(cacheEntry);
92-
}
80+
if (await vcache.GetReleaseAsync(c => c[version]) is { } cacheEntry)
81+
return Ok(cacheEntry);
9382

9483
return NotFound();
9584
}
@@ -103,11 +92,8 @@ public async Task<ActionResult<VersionCacheEntry>> GetSpecificCanary(
10392
string version
10493
)
10594
{
106-
using (var _ = await vcache.TakeLockAsync())
107-
{
108-
if (vcache[version] is { } cacheEntry)
109-
return Ok(cacheEntry);
110-
}
95+
if (await vcache.GetReleaseAsync(c => c[version]) is { } cacheEntry)
96+
return Ok(cacheEntry);
11197

11298
return NotFound();
11399
}

src/Server/Controllers/DownloadController.cs

Lines changed: 8 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
using Gommon;
22
using Microsoft.AspNetCore.Mvc;
33
using Ryujinx.Systems.Update.Common;
4-
using Ryujinx.Systems.Update.Server;
54
using Ryujinx.Systems.Update.Server.Services.GitLab;
65

76
namespace Ryujinx.Systems.Update.Server.Controllers;
@@ -14,7 +13,7 @@ public class DownloadController : ControllerBase
1413
[ProducesResponseType(StatusCodes.Status302Found)]
1514
[ProducesResponseType(StatusCodes.Status404NotFound)]
1615
[ProducesResponseType(StatusCodes.Status400BadRequest)]
17-
public async Task<ActionResult<object>> DownloadLatestCustom(
16+
public async Task<ActionResult<object>> DownloadCustom(
1817
[FromQuery] string os,
1918
[FromQuery] string arch,
2019
[FromQuery] string rc = Constants.StableRoute,
@@ -39,13 +38,11 @@ public async Task<ActionResult<object>> DownloadLatestCustom(
3938
if (!rc.TryParseAsReleaseChannel(out var releaseChannel))
4039
return BadRequest($"Unknown release channel '{rc}'; valid are '{Constants.StableRoute}' and '{Constants.CanaryRoute}'");
4140

42-
var versionCache = HttpContext.RequestServices.GetCacheFor(releaseChannel);
43-
44-
var lck = await versionCache.TakeLockAsync();
45-
46-
var release = version is Constants.RouteName_Latest ? versionCache.Latest : versionCache[version];
47-
48-
lck.Dispose();
41+
var release = await HttpContext.RequestServices
42+
.GetCacheFor(releaseChannel)
43+
.GetReleaseAsync(c =>
44+
version is Constants.RouteName_Latest ? c.Latest : c[version]
45+
);
4946

5047
if (release is null)
5148
return NotFound();
@@ -61,11 +58,7 @@ public async Task<ActionResult<object>> DownloadLatestStable(
6158
[FromKeyedServices("stableCache")] VersionCache vcache
6259
)
6360
{
64-
var lck = await vcache.TakeLockAsync();
65-
66-
var latest = vcache.Latest;
67-
68-
lck.Dispose();
61+
var latest = await vcache.GetReleaseAsync(c => c.Latest);
6962

7063
if (latest is null)
7164
return NotFound();
@@ -91,11 +84,7 @@ public async Task<ActionResult<object>> DownloadLatestCanary(
9184
[FromKeyedServices("canaryCache")] VersionCache vcache
9285
)
9386
{
94-
var lck = await vcache.TakeLockAsync();
95-
96-
var latest = vcache.Latest;
97-
98-
lck.Dispose();
87+
var latest = await vcache.GetReleaseAsync(c => c.Latest);
9988

10089
if (latest is null)
10190
return NotFound();

src/Server/Controllers/LatestController.cs

Lines changed: 3 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
using Microsoft.AspNetCore.Mvc;
22
using Ryujinx.Systems.Update.Common;
3-
using Ryujinx.Systems.Update.Server;
43
using Ryujinx.Systems.Update.Server.Services.GitLab;
54

65
namespace Ryujinx.Systems.Update.Server.Controllers;
@@ -40,11 +39,7 @@ public async Task<ActionResult<object>> GetLatestCustom(
4039

4140
var vcache = HttpContext.RequestServices.GetCacheFor(releaseChannel);
4241

43-
var lck = await vcache.TakeLockAsync();
44-
45-
var latest = vcache.Latest;
46-
47-
lck.Dispose();
42+
var latest = await vcache.GetReleaseAsync(c => c.Latest);
4843

4944
if (latest is null)
5045
return NotFound();
@@ -64,11 +59,7 @@ public async Task<ActionResult<object>> GetLatestCustom(
6459
public async Task<ActionResult> RedirectLatestStable(
6560
[FromKeyedServices("stableCache")] VersionCache vcache)
6661
{
67-
var lck = await vcache.TakeLockAsync();
68-
69-
var latest = vcache.Latest;
70-
71-
lck.Dispose();
62+
var latest = await vcache.GetReleaseAsync(c => c.Latest);
7263

7364
return latest is not null
7465
? Redirect(latest.ReleaseUrl)
@@ -81,11 +72,7 @@ public async Task<ActionResult> RedirectLatestStable(
8172
public async Task<ActionResult> RedirectLatestCanary(
8273
[FromKeyedServices("canaryCache")] VersionCache vcache)
8374
{
84-
var lck = await vcache.TakeLockAsync();
85-
86-
var latest = vcache.Latest;
87-
88-
lck.Dispose();
75+
var latest = await vcache.GetReleaseAsync(c => c.Latest);
8976

9077
return latest is not null
9178
? Redirect(latest.ReleaseUrl)

src/Server/Services/GitLab/VersionCache.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,14 @@ public void Init(ProjectId projectId) => Executor.ExecuteBackgroundAsync(async (
8888

8989
public VersionCacheEntry? Latest => this[_latestTag ?? string.Empty];
9090

91+
public async Task<VersionCacheEntry?> GetReleaseAsync(Func<VersionCache, VersionCacheEntry?> getter)
92+
{
93+
using (await TakeLockAsync())
94+
{
95+
return getter(this);
96+
}
97+
}
98+
9199
public async Task RefreshAsync()
92100
{
93101
await _semaphore.WaitAsync();

0 commit comments

Comments
 (0)