1
0
mirror of https://github.com/ppy/osu.git synced 2026-05-30 07:59:54 +08:00

Reduce number of realm subscription triggers from song select online lookups

This commit is contained in:
Bartłomiej Dach
2025-08-12 09:10:14 +02:00
Unverified
parent 72b48e5677
commit 29b93ca0d7
@@ -75,29 +75,39 @@ namespace osu.Game.Screens.SelectV2
foreach (var dbBeatmapSet in dbBeatmapSets)
{
dbBeatmapSet.Status = onlineBeatmapSet.Status;
// note that every single write to realm models is preceded by a guard, even if it technically would write the same value back.
// the reason this matters is that doing so avoids triggering realm subscription callbacks.
// unfortunately in terms of subscriptions realm treats *every* write to any realm object as a modification,
// even if the write was redundant and had no observable effect.
if (dbBeatmapSet.Status != onlineBeatmapSet.Status)
dbBeatmapSet.Status = onlineBeatmapSet.Status;
foreach (var dbBeatmap in dbBeatmapSet.Beatmaps)
{
if (onlineBeatmaps.TryGetValue(dbBeatmap.OnlineID, out var onlineBeatmap))
{
// compare `BeatmapUpdaterMetadataLookup`
dbBeatmap.OnlineMD5Hash = onlineBeatmap.MD5Hash;
dbBeatmap.LastOnlineUpdate = onlineBeatmap.LastUpdated;
if (dbBeatmap.OnlineMD5Hash != onlineBeatmap.MD5Hash)
dbBeatmap.OnlineMD5Hash = onlineBeatmap.MD5Hash;
if (dbBeatmap.MatchesOnlineVersion)
if (dbBeatmap.LastOnlineUpdate != onlineBeatmap.LastUpdated)
dbBeatmap.LastOnlineUpdate = onlineBeatmap.LastUpdated;
if (dbBeatmap.MatchesOnlineVersion && dbBeatmap.Status != onlineBeatmap.Status)
dbBeatmap.Status = onlineBeatmap.Status;
string[] userTagsArray = onlineBeatmap.TopTags?
.Select(t => (topTag: t, relatedTag: tagsById.GetValueOrDefault(t.TagId)))
.Where(t => t.relatedTag != null)
// see https://github.com/ppy/osu-web/blob/bb3bd2e7c6f84f26066df5ea20a81c77ec9bb60a/resources/js/beatmapsets-show/controller.ts#L103-L106 for sort criteria
.OrderByDescending(t => t.topTag.VoteCount)
.ThenBy(t => t.relatedTag!.Name)
.Select(t => t.relatedTag!.Name)
.ToArray() ?? [];
dbBeatmap.Metadata.UserTags.Clear();
dbBeatmap.Metadata.UserTags.AddRange(userTagsArray);
HashSet<string> userTags = onlineBeatmap.TopTags?
.Select(t => (topTag: t, relatedTag: tagsById.GetValueOrDefault(t.TagId)))
.Where(t => t.relatedTag != null)
.Select(t => t.relatedTag!.Name)
.ToHashSet() ?? [];
if (!userTags.SetEquals(dbBeatmap.Metadata.UserTags))
{
dbBeatmap.Metadata.UserTags.Clear();
dbBeatmap.Metadata.UserTags.AddRange(userTags);
}
}
}
}