dgraph-io/dgraph · error

Unknown group for tablet: %+v

Error message

Unknown group for tablet: %+v

What it means

createProposals validates each tablet in the incoming state by looking up its GroupId in Zero's current groups. If the tablet's group doesn't exist in Zero's state, the tablet update cannot be turned into a proposal and is rejected with this error.

Source

Thrown at dgraph/cmd/zero/zero.go:389

			}
			res = append(res, proposal)
		}
		if !dstMember.Leader {
			// Don't continue to tablets if request is not from the leader.
			return res, nil
		}
		if dst.SnapshotTs > group.SnapshotTs {
			res = append(res, &pb.ZeroProposal{
				SnapshotTs: map[uint32]uint64{dstMember.GroupId: dst.SnapshotTs},
			})
		}
	}

	var tablets []*pb.Tablet
	for key, dstTablet := range dst.Tablets {
		group, has := s.state.Groups[dstTablet.GroupId]
		if !has {
			return res, errors.Errorf("Unknown group for tablet: %+v", dstTablet)
		}
		srcTablet, has := group.Tablets[key]
		if !has {
			// Tablet moved to new group
			continue
		}

		s := float64(srcTablet.OnDiskBytes)
		d := float64(dstTablet.OnDiskBytes)
		if dstTablet.Remove || (s == 0 && d > 0) || (s > 0 && math.Abs(d/s-1) > 0.1) {
			dstTablet.Force = false
			tablets = append(tablets, dstTablet)
		}
	}

	if len(tablets) > 0 {
		res = append(res, &pb.ZeroProposal{Tablets: tablets})
	}

View on GitHub (pinned to 759e242be6)

Solutions

  1. Compare the tablet's GroupId against /state output on Zero and restart the Alpha so it re-syncs tablets to valid groups.
  2. Remove stale Alpha data so it stops advertising tablets for a nonexistent group.
  3. Restore Zero from the correct/newer raft snapshot so the group exists.
  4. Check for mixed dgraph versions that serialize group ids inconsistently; align all nodes.

Example fix

// before
state := alpha.BuildTabletReport()
zero.Inform(ctx, state) // tablets reference deleted group
// after
if !zeroGroupExists(alpha.Tablet.GroupId) {
    alpha.ReassignTabletsToValidGroups()
}
zero.Inform(ctx, alpha.BuildTabletReport())
Defensive patterns

Strategy: validation

Validate before calling

for _, t := range tablets {
    if !zeroGroupExists(t.GroupId) {
        return fmt.Errorf("tablet %s references unknown group %d", t.Predicate, t.GroupId)
    }
}

Type guard

func tabletsHaveKnownGroups(groups map[uint64]*pb.Group, tablets []*pb.Tablet) bool {
    for _, t := range tablets {
        if _, ok := groups[t.GroupId]; !ok { return false }
    }
    return true
}

Try / catch

_, err := zero.UpdateMembership(ctx, state)
if err != nil && strings.Contains(err.Error(), "Unknown group for tablet") {
    alpha.RebuildTabletMetadata(ctx)
}

Prevention

When it happens

Trigger: UpdateMembership receives a state whose Tablets reference a GroupId missing from s.state.Groups — e.g., an Alpha advertising tablets for a group that was removed or never registered.

Common situations: Alpha restarted with stale tablet metadata pointing at an old group; Zero state rolled back to a snapshot predating the group's creation; manual edits/crafted requests to the membership endpoint.

Related errors


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