ppy/osu · error

Ran out of new beatmap IDs to assign to unsubmitted beatmaps

Error message

Ran out of new beatmap IDs to assign to unsubmitted beatmaps!

What it means

Thrown during beatmap submission when allocatedBeatmapIds.Count == 0 but there are still unsubmitted difficulties needing IDs. The server pre-allocated a finite batch of beatmap IDs and the local set has more difficulties than IDs available.

Source

Thrown at osu.Game/Screens/Edit/Submission/SubmissionBeatmapExporter.cs:45

        {
            base.MutateBeatmap(beatmapSet, playableBeatmap);

            if (beatmapSetId != null && allocatedBeatmapIds != null)
            {
                playableBeatmap.BeatmapInfo.BeatmapSet = beatmapSet;
                playableBeatmap.BeatmapInfo.BeatmapSet!.OnlineID = (int)beatmapSetId;

                if (allocatedBeatmapIds.Contains(playableBeatmap.BeatmapInfo.OnlineID))
                {
                    allocatedBeatmapIds.Remove(playableBeatmap.BeatmapInfo.OnlineID);
                    return;
                }

                if (playableBeatmap.BeatmapInfo.OnlineID > 0)
                    throw new InvalidOperationException($@"Difficulty ""{playableBeatmap.BeatmapInfo.DifficultyName}"" has BeatmapID {playableBeatmap.BeatmapInfo.OnlineID} that has not been assigned to it by the server!");

                if (allocatedBeatmapIds.Count == 0)
                    throw new InvalidOperationException(@"Ran out of new beatmap IDs to assign to unsubmitted beatmaps!");

                int newId = allocatedBeatmapIds.First();
                allocatedBeatmapIds.Remove(newId);
                playableBeatmap.BeatmapInfo.OnlineID = newId;
            }
        }
    }
}

View on GitHub (pinned to d9c73e12ad)

Solutions

  1. Request a larger allocation batch from the server before submitting (increase the requested ID count).
  2. Reduce the number of new difficulties submitted in a single operation.
  3. Retry submission after the server grants additional IDs.
  4. Check the allocation request parameter that specifies how many IDs are needed.

Example fix

// before
if (allocatedBeatmapIds.Count == 0)
    throw new InvalidOperationException(@"Ran out of new beatmap IDs to assign to unsubmitted beatmaps!");

// after (precompute need)
int needed = beatmapSet.Beatmaps.Count(b => b.OnlineID <= 0);
if (allocatedBeatmapIds.Count < needed)
    throw new InvalidOperationException($"Need {needed} IDs but server allocated {allocatedBeatmapIds.Count}.");
Defensive patterns

Strategy: validation

Validate before calling

int needed = beatmapSet.Beatmaps.Count(b => b.OnlineID <= 0);
if (allocatedBeatmapIds.Count < needed)
    throw new InvalidOperationException($"Need {needed} IDs; have {allocatedBeatmapIds.Count}.");

Try / catch

try { exporter.Export(...); }
catch (InvalidOperationException) { /* re-request allocation, retry */ }

Prevention

When it happens

Trigger: Submitting a beatmap set where the number of new (OnlineID <= 0) difficulties exceeds the count of IDs returned by the server's allocation endpoint.

Common situations: Adding many difficulties to a set in one submission; server allocation quota exhausted; client requested too few IDs from the allocation endpoint.

Related errors


AI-assisted analysis of ppy/osu@d9c73e12ad (2026-08-13). Data as JSON: /api/errors/90a3cefa6ebba6a7. Report an issue: GitHub.