1
0
mirror of https://github.com/ppy/osu.git synced 2025-01-14 02:03:22 +08:00

Use new API endpoint to do batch lookups

This commit is contained in:
Dean Herbert 2021-12-01 17:45:41 +09:00
parent 0fae10500a
commit 81f82c24c3
3 changed files with 50 additions and 8 deletions

View File

@ -85,7 +85,7 @@ namespace osu.Game.Database
// Grab at most 50 unique beatmap IDs from the queue.
lock (taskAssignmentLock)
{
while (pendingBeatmapTasks.Count > 0 && beatmapTasks.Count < 1)
while (pendingBeatmapTasks.Count > 0 && beatmapTasks.Count < 50)
{
(int id, TaskCompletionSource<APIBeatmap> task) next = pendingBeatmapTasks.Dequeue();
@ -103,7 +103,7 @@ namespace osu.Game.Database
}
// Query the beatmaps.
var request = new GetBeatmapRequest(new APIBeatmap { OnlineID = beatmapTasks.Keys.First() });
var request = new GetBeatmapsRequest(beatmapTasks.Keys.ToArray());
// rather than queueing, we maintain our own single-threaded request stream.
// todo: we probably want retry logic here.
@ -117,16 +117,19 @@ namespace osu.Game.Database
createNewTask();
}
List<APIBeatmap> foundBeatmaps = new List<APIBeatmap> { request.Response };
List<APIBeatmap> foundBeatmaps = request.Response?.Beatmaps;
foreach (var beatmap in foundBeatmaps)
if (foundBeatmaps != null)
{
if (beatmapTasks.TryGetValue(beatmap.OnlineID, out var tasks))
foreach (var beatmap in foundBeatmaps)
{
foreach (var task in tasks)
task.SetResult(beatmap);
if (beatmapTasks.TryGetValue(beatmap.OnlineID, out var tasks))
{
foreach (var task in tasks)
task.SetResult(beatmap);
beatmapTasks.Remove(beatmap.OnlineID);
beatmapTasks.Remove(beatmap.OnlineID);
}
}
}

View File

@ -0,0 +1,24 @@
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text.
using System;
namespace osu.Game.Online.API.Requests
{
public class GetBeatmapsRequest : APIRequest<GetBeatmapsResponse>
{
private readonly int[] beatmapIds;
private const int max_ids_per_request = 50;
public GetBeatmapsRequest(int[] beatmapIds)
{
if (beatmapIds.Length > max_ids_per_request)
throw new ArgumentException($"{nameof(GetBeatmapsRequest)} calls only support up to {max_ids_per_request} IDs at once");
this.beatmapIds = beatmapIds;
}
protected override string Target => "beatmaps/?ids[]=" + string.Join("&ids[]=", beatmapIds);
}
}

View File

@ -0,0 +1,15 @@
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text.
using System.Collections.Generic;
using Newtonsoft.Json;
using osu.Game.Online.API.Requests.Responses;
namespace osu.Game.Online.API.Requests
{
public class GetBeatmapsResponse : ResponseWithCursor
{
[JsonProperty("beatmaps")]
public List<APIBeatmap> Beatmaps;
}
}