Fix Galaxy paging review findings

This commit is contained in:
Joseph Doherty
2026-04-29 11:59:49 -04:00
parent d543679044
commit ac2787f619
14 changed files with 261 additions and 22 deletions
@@ -99,6 +99,14 @@ public sealed class GalaxyHierarchyCache : IGalaxyHierarchyCache
LastQueriedAt = queriedAt,
LastSuccessAt = queriedAt,
LastError = null,
DashboardSummary = previous.DashboardSummary with
{
Status = DashboardGalaxyStatus.Healthy,
LastQueriedAt = queriedAt,
LastSuccessAt = queriedAt,
LastDeployTime = deployTime,
LastError = null,
},
};
Volatile.Write(ref _current, refreshed);
_firstLoad.TrySetResult();
@@ -68,7 +68,8 @@ public sealed class GalaxyRepositoryGrpcService(
ResolveUnavailableMessage(entry)));
}
int offset = ParsePageToken(request.PageToken);
PageToken pageToken = ParsePageToken(request.PageToken, entry.Sequence);
int offset = pageToken.Offset;
if (offset > entry.Objects.Count)
{
throw new RpcException(new Status(
@@ -90,7 +91,7 @@ public sealed class GalaxyRepositoryGrpcService(
int nextOffset = offset + take;
if (nextOffset < entry.Objects.Count)
{
reply.NextPageToken = nextOffset.ToString(System.Globalization.CultureInfo.InvariantCulture);
reply.NextPageToken = FormatPageToken(entry.Sequence, nextOffset);
}
return reply;
@@ -182,15 +183,30 @@ public sealed class GalaxyRepositoryGrpcService(
return Math.Min(pageSize, MaxDiscoverPageSize);
}
private static int ParsePageToken(string pageToken)
private static string FormatPageToken(long sequence, int offset)
{
return string.Concat(
sequence.ToString(System.Globalization.CultureInfo.InvariantCulture),
":",
offset.ToString(System.Globalization.CultureInfo.InvariantCulture));
}
private static PageToken ParsePageToken(string pageToken, long currentSequence)
{
if (string.IsNullOrWhiteSpace(pageToken))
{
return 0;
return new PageToken(currentSequence, Offset: 0);
}
if (!int.TryParse(
pageToken,
string[] parts = pageToken.Split(':', count: 2);
if (parts.Length != 2
|| !long.TryParse(
parts[0],
System.Globalization.NumberStyles.None,
System.Globalization.CultureInfo.InvariantCulture,
out long sequence)
|| !int.TryParse(
parts[1],
System.Globalization.NumberStyles.None,
System.Globalization.CultureInfo.InvariantCulture,
out int offset)
@@ -201,9 +217,18 @@ public sealed class GalaxyRepositoryGrpcService(
"DiscoverHierarchy page_token is invalid."));
}
return offset;
if (sequence != currentSequence)
{
throw new RpcException(new Status(
StatusCode.InvalidArgument,
"DiscoverHierarchy page_token is stale."));
}
return new PageToken(sequence, offset);
}
private sealed record PageToken(long Sequence, int Offset);
[System.Diagnostics.CodeAnalysis.SuppressMessage(
"Style",
"IDE0051:Remove unused private members",