dgraph-io/dgraph · error
failed to receive response for group ID [%v] from the server
Error message
failed to receive response for group ID [%v] from the server: %w
What it means
Returned when out.Recv fails after sending the group-ID handshake message, i.e. the server did not send its ACK. This usually mirrors a server-side error while preparing to receive the snapshot (bad group, internal error) or a dropped stream.
Source
Thrown at dgraph/cmd/dgraphimport/import_client.go:199
ps, err := badger.OpenManaged(opt)
if err != nil {
glog.Errorf("failed to open BadgerDB at [%s]: %v", pdir, err)
return fmt.Errorf("failed to open BadgerDB at [%v]: %v", pdir, err)
}
defer func() {
if err := ps.Close(); err != nil {
glog.Warningf("[import] Error closing BadgerDB: %v", err)
}
}()
// Send group ID as the first message in the stream
glog.Infof("[import] Sending request for streaming external snapshot for group ID [%v]", groupId)
groupReq := &api.StreamExtSnapshotRequest{GroupId: groupId}
if err := out.Send(groupReq); err != nil {
return fmt.Errorf("failed to send request for group ID [%v] to the server: %w", groupId, err)
}
if _, err := out.Recv(); err != nil {
return fmt.Errorf("failed to receive response for group ID [%v] from the server: %w", groupId, err)
}
glog.Infof("[import] Group [%v]: Received ACK for sending group request", groupId)
// Configure and start the BadgerDB stream
glog.Infof("[import] Starting BadgerDB stream for group [%v]", groupId)
if err := streamBadger(ctx, ps, out, groupId); err != nil {
return fmt.Errorf("badger streaming failed for group [%v]: %v", groupId, err)
}
return nil
}
// streamBadger runs a BadgerDB stream to send key-value pairs to the specified group.
// It creates a new stream at the maximum sequence number and sends the data to the specified group.
// It also sends a final 'done' signal to mark completion.
func streamBadger(ctx context.Context, ps *badger.DB, out api.Dgraph_StreamExtSnapshotClient, groupId uint32) error {
stream := ps.NewStreamAt(math.MaxUint64)
stream.LogPrefix = "[import] Sending external snapshot to group [" + fmt.Sprintf("%d", groupId) + "]"View on GitHub (pinned to 759e242be6)
Solutions
- Read the wrapped status message — a server-side error (e.g. InvalidArgument/Internal) explains the missing ACK.
- Check Alpha logs at the time of import for the server-side counterpart error.
- Verify group ID validity and that all Alphas of that group are online.
- Increase context timeout and re-run; the handshake is retried on a fresh stream only.
- Eliminate proxies/LB between client and Alpha or raise their stream timeouts.
Example fix
// before
if _, err := out.Recv(); err != nil {
return fmt.Errorf("failed to receive response for group ID [%v] from the server: %w", groupId, err)
}
// after
if _, err := out.Recv(); err != nil {
if s, ok := status.FromError(err); ok {
return fmt.Errorf("no ACK for group %d (code=%s): %w", groupId, s.Code(), err)
}
return fmt.Errorf("failed to receive response for group ID [%v] from the server: %w", groupId, err)
} Defensive patterns
Strategy: try-catch
Validate before calling
if err := ctx.Err(); err != nil {
return fmt.Errorf("context expired before ACK; raise deadline: %w", err)
} Type guard
func serverRejectedAck(err error) (bool, codes.Code) {
if s, ok := status.FromError(err); ok && s.Code() != codes.OK {
return true, s.Code()
}
return false, codes.OK
} Try / catch
if _, err := out.Recv(); err != nil {
if ok, code := serverRejectedAck(err); ok {
switch code {
case codes.DeadlineExceeded:
return retryWithLongerDeadline(ctx)
default:
return fmt.Errorf("server rejected handshake for group %d: %v", groupId, err)
}
}
return err
} Prevention
- Check Alpha logs for the server-side handshake error when this occurs.
- Size the context deadline for the dataset, not the default.
- Verify group membership hasn't changed since the export.
- Keep the network path direct and idle-timeout-free.
When it happens
Trigger: Server returns a non-OK status in place of the ACK (unknown group ID, server not ready, internal error); stream breaks before the ACK (network reset, server crash); context deadline exceeded while waiting.
Common situations: Importing against a cluster whose group IDs changed after scaling; Alpha logs show snapshot-handshake errors; import run through a proxy with short idle timeouts; very slow server startup.
Related errors
- failed to start external snapshot stream for group %d: %w
- failed to send request for group ID [%v] to the server: %w
- failed to send data chunk: %w
- failed to send 'done' signal for group [%d]: %w
- failed to disable drain mode: %v
AI-assisted analysis of dgraph-io/dgraph@759e242be6 (2026-09-01).
Data as JSON: /api/errors/2bee94b757a0e837.
Report an issue: GitHub.