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

  1. Read the wrapped status message — a server-side error (e.g. InvalidArgument/Internal) explains the missing ACK.
  2. Check Alpha logs at the time of import for the server-side counterpart error.
  3. Verify group ID validity and that all Alphas of that group are online.
  4. Increase context timeout and re-run; the handshake is retried on a fresh stream only.
  5. 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

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


AI-assisted analysis of dgraph-io/dgraph@759e242be6 (2026-09-01). Data as JSON: /api/errors/2bee94b757a0e837. Report an issue: GitHub.