dgraph-io/dgraph · error

group: [%d] is not a known group

Error message

group: [%d] is not a known group

What it means

MoveTablet is the gRPC/HTTP entry point on Dgraph Zero for moving a tablet (predicate) to a specific group. Before doing anything it checks that the requested destination group (req.DstGroup) is among the groups Zero currently knows about (s.KnownGroups()). If the group ID does not correspond to any registered Alpha group, Zero rejects the request as an invalid request (Status Code 1, x.ErrorInvalidRequest) with this message.

Source

Thrown at dgraph/cmd/zero/tablet.go:109

// MoveTablet can be used to move a tablet to a specific group.
// It takes in tablet and destination group as argument.
// It returns a *pb.Status to be used by the `/moveTablet` HTTP handler in Zero.
func (s *Server) MoveTablet(ctx context.Context, req *pb.MoveTabletRequest) (*pb.Status, error) {
	if !s.Node.AmLeader() {
		return &pb.Status{Code: 1, Msg: x.Error}, errNotLeader
	}

	knownGroups := s.KnownGroups()
	var isKnown bool
	for _, grp := range knownGroups {
		if grp == req.DstGroup {
			isKnown = true
			break
		}
	}
	if !isKnown {
		return &pb.Status{Code: 1, Msg: x.ErrorInvalidRequest},
			fmt.Errorf("group: [%d] is not a known group", req.DstGroup)
	}

	tablet := x.NamespaceAttr(req.Namespace, req.Tablet)
	tab := s.ServingTablet(tablet)
	if tab == nil {
		return &pb.Status{Code: 1, Msg: x.ErrorInvalidRequest},
			fmt.Errorf("namespace: %d. No tablet found for: %s", req.Namespace, req.Tablet)
	}

	srcGroup := tab.GroupId
	if srcGroup == req.DstGroup {
		return &pb.Status{Code: 1, Msg: x.ErrorInvalidRequest},
			fmt.Errorf("namespace: %d. Tablet: [%s] is already being served by group: [%d]",
				req.Namespace, req.Tablet, srcGroup)
	}

	if err := s.movePredicate(tablet, srcGroup, req.DstGroup); err != nil {
		glog.Errorf("namespace: %d. While moving predicate %s from %d -> %d. Error: %v",

View on GitHub (pinned to 759e242be6)

Solutions

  1. Check the cluster's known groups via /state endpoint on Zero and use an existing group ID as dst group
  2. Verify the destination Alphas are running and have registered with Zero (check Zero logs for membership)
  3. Correct the group ID in the /moveTablet request and retry

Example fix

// before
curl localhost:6080/moveTablet?tablet=name&dst_group=5   # group 5 doesn't exist
// after
curl 'localhost:6080/state' | jq '.groups | keys'        # confirm e.g. only groups 1,2
curl 'localhost:6080/moveTablet?tablet=name&dst_group=2'
Defensive patterns

Strategy: validation

Validate before calling

// before calling /moveTablet, confirm dst group exists
state=$(curl -s localhost:6080/state)
echo "$state" | jq -e --argjson g "$DST_GROUP" '.groups | has($g)' \
  || { echo "group $DST_GROUP is not known to Zero"; exit 1; }

Type guard

is_known_group() {
  curl -s localhost:6080/state | jq -e --argjson g "$1" '.groups | has($g)' >/dev/null
}

Try / catch

resp=$(curl -s "localhost:6080/moveTablet?tablet=$TABLET&dst_group=$DST_GROUP")
code=$(echo "$resp" | jq -r .code)
[ "$code" = 1 ] && echo "moveTablet rejected: $(echo "$resp" | jq -r .msg)"

Prevention

When it happens

Trigger: Calling the /moveTablet HTTP endpoint (or MoveTablet gRPC) with a dst group ID that no Alpha group has registered: a typo'd or out-of-range group ID, referencing a group whose Alphas have never joined the cluster, or moving a tablet to a group that was decommissioned.

Common situations: Operators manually rebalancing predicates after scaling down and passing a now-removed group ID; scripting moves with wrong zero-based vs one-based group numbering; stale documentation or runbooks referencing groups from a previous cluster; Alphas of the destination group still down so they never registered with Zero.

Related errors


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