milvus-io/milvus · warning
Empty payload received
Error message
Empty payload received
What it means
Raised in the config-reply parser when a command reply exists, is marked successful, but its payload is an empty or whitespace-only JSON string. The client acknowledged the get_config command yet attached no configuration body - typically the client-side handler produced an empty serialized config, or the stored string was truncated/cleared server-side before the UI read it.
Source
Thrown at internal/http/webui/telemetry.html:2184
throw new Error(`HTTP ${response.status}`);
}
const data = await response.json();
const clients = data.clients || [];
if (clients.length > 0) {
const client = clients[0];
const replies = client.command_replies || [];
const configReply = replies.find(r => r.command_id === commandId);
if (configReply) {
if (configReply.success && configReply.payload) {
try {
// Payload is a JSON string (not base64) - parse directly
// Server stores Payload as string type, so no base64 decoding needed
const payloadStr = configReply.payload;
if (!payloadStr || payloadStr.trim() === '') {
throw new Error('Empty payload received');
}
const configData = JSON.parse(payloadStr);
renderConfigData(configData);
} catch (e) {
console.error('Failed to parse config response:', e, 'payload:', configReply.payload);
document.getElementById('configModalContent').innerHTML = `
<div class="empty-state" style="padding: 20px;">
<p style="color: var(--danger);">Failed to parse config response: ${escapeHtml(e.message)}</p>
<p style="font-size: 12px; color: var(--gray-400); margin-top: 8px;">Raw payload: ${escapeHtml(String(configReply.payload).substring(0, 200))}</p>
</div>
`;
}
} else {
document.getElementById('configModalContent').innerHTML = `
<div class="empty-state" style="padding: 20px;">
<p style="color: var(--danger);">Config request failed: ${escapeHtml(configReply.error_msg || 'Unknown error')}</p>
</div>
`;View on GitHub (pinned to b43a76673a)
Solutions
- Retry the config fetch once - transient empty payloads on the first heartbeat after client startup are common.
- Check the server logs where client errors/replies are dumped: the client may have logged why the config body was empty.
- Confirm client and server versions match; upgrade the client if it predates the get_config payload feature.
- Inspect the raw payload shown in the modal ('Raw payload: ...' line) to confirm it is genuinely empty rather than unparseable.
Defensive patterns
Strategy: validation
Validate before calling
// validate reply payload before parsing
const raw = typeof configReply.payload === 'string' ? configReply.payload.trim() : '';
if (!raw) {
renderModalError('Client returned an empty config payload - retry or check client logs');
return;
}
let configData;
try { configData = JSON.parse(raw); } catch { renderModalError('Config payload is not valid JSON'); return; } Prevention
- Trim and non-empty-check any payload string before JSON.parse.
- Retry the config command once on empty payload before showing an error.
- Verify client and server versions both support populated get_config replies.
When it happens
Trigger: Client's get_config handler returns success with an empty payload string; reply payload field cleared after TTL; client version that acknowledges but does not implement payload serialization for the requested config section.
Common situations: Version skew between an older client binary and a newer WebUI expecting a populated payload; inspecting a reply after it has partially expired; client with an empty/failed config load that still reports success.
Related errors
- HTTP ${response.status}
- Failed to push config
- Server error
- Failed to delete command
- Failed to request errors
AI-assisted analysis of milvus-io/milvus@b43a76673a (2026-08-15).
Data as JSON: /api/errors/b8ea9fe287c76e2a.
Report an issue: GitHub.