stride3d/stride · error · ContentStreamingException
Data chunk is not loaded.
Error message
Data chunk is not loaded.
What it means
Chunk.GetData(fileProvider) retrieves mip bytes from disk, and if chunk.IsLoaded is still false after that call the data is not available in memory (the load failed silently or was not awaited). StreamingTask requires the raw bytes to upload to the GPU, so it throws ContentStreamingException rather than reading a null/empty buffer.
Solutions
- Ensure the database file provider is mounted and the storage file exists before starting streaming (check Init order)
- Explicitly await/load the chunk data before streaming tasks run (call chunk.GetData/Load and verify IsLoaded)
- Add retry/backoff around streaming start on transient IO failures; re-trigger streaming after the provider is ready
- Check disk/file permissions and that antivirus or other processes aren't locking the content files
Example fix
// before
var data = chunk.GetData(fileProvider);
if (!chunk.IsLoaded) throw new ContentStreamingException("Data chunk is not loaded.", Storage);
// after
var data = chunk.GetData(fileProvider);
if (!chunk.IsLoaded)
{
Log.Warning("Chunk not loaded; retrying streaming later");
ScheduleStreamRetry(totalMipIndex);
return;
} Defensive patterns
Strategy: try-catch
Validate before calling
var chunk = storage.GetChunk(mipIndex);
var data = chunk?.GetData(fileProvider);
if (data == null || !chunk.IsLoaded)
Logger.Warning("Chunk data unavailable; retry when provider is ready."); Try / catch
try
{
await StreamAsync(mipIndex);
}
catch (ContentStreamingException)
{
Logger.Warning("Chunk not loaded; retrying with backoff");
await Task.Delay(RetryDelay, ct);
await StreamAsync(mipIndex);
} Prevention
- Mount the database file provider before streaming starts
- Verify chunk.IsLoaded before GPU upload
- Watch for IO/permission issues locking content files
When it happens
Trigger: During StreamingTask, chunk.GetData(fileProvider) leaving chunk.IsLoaded == false: the underlying file could not be read by the IDatabaseFileProviderService (missing file, IO error), the provider is not yet initialized, or GetData was invoked on a chunk whose content URL cannot be resolved.
Common situations: Streaming starting before the database file provider finished mounting; file access errors (locked files, missing data files) during runtime streaming; background thread racing with asset loading.
Understand the failure class
Background: "failed to read file", EACCES, ENOENT and "could not read <path>" errors: when a program can't read a file from disk — this error's family across 49 libraries.
Related errors
- Data chunk is not loaded.
- Missing content storage.
- Texture streaming supports only 2D textures and 2D texture…
- Data chunk is missing.
- Data chunk has invalid size.
AI-assisted analysis of stride3d/stride@96fad776d2 (2026-09-14).
Data as JSON: /api/errors/56ab2ccf88580e8a.
Report an issue: GitHub.
Appendix: source
Thrown at sources/engine/Stride.Rendering/Streaming/StreamingTexture.cs:307
var topMip = mipInfos[description.MipLevels - newDesc.MipLevelCount];
newDesc.Width = topMip.Width;
newDesc.Height = topMip.Height;
// Load chunks
var mipsData = new IntPtr[mipsCount];
for (var mipIndex = 0; mipIndex < mipsCount; mipIndex++)
{
var totalMipIndex = newHighestResidentMipIndex + mipIndex;
var chunk = Storage.GetChunk(totalMipIndex);
if (chunk == null)
throw new ContentStreamingException("Data chunk is missing.", Storage);
if (chunk.Size != mipInfos[totalMipIndex].TotalSize)
throw new ContentStreamingException("Data chunk has invalid size.", Storage);
var data = chunk.GetData(fileProvider);
if (!chunk.IsLoaded)
throw new ContentStreamingException("Data chunk is not loaded.", Storage);
if (cancellationToken.IsCancellationRequested)
return;
mipsData[mipIndex] = data;
}
// Get data boxes
var dataBoxIndex = 0;
var dataBoxes = new DataBox[newDesc.MipLevelCount * newDesc.ArraySize];
for (var arrayIndex = 0; arrayIndex < newDesc.ArraySize; arrayIndex++)
{
for (var mipIndex = 0; mipIndex < mipsCount; mipIndex++)
{
var totalMipIndex = newHighestResidentMipIndex + mipIndex;
var info = mipInfos[totalMipIndex];
dataBoxes[dataBoxIndex].DataPointer = mipsData[mipIndex] + info.SlicePitch * arrayIndex;View on GitHub (pinned to 96fad776d2)