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
- Compare the tablet's GroupId against /state output on Zero and restart the Alpha so it re-syncs tablets to valid groups.
- Remove stale Alpha data so it stops advertising tablets for a nonexistent group.
- Restore Zero from the correct/newer raft snapshot so the group exists.
- 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
- Restore Zero and Alpha snapshots from the same point in time.
- Drop stale Alpha p directories when their group no longer exists.
- Reconcile tablet group ids against /state after topology changes.
- Keep cluster versions uniform to avoid group-id serialization drift.
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
- namespace: %d. No tablet found for: %s
- Tablet to be moved: [%v] is not being served
- Unknown group for member: %+v
- group: [%d] is not a known group
- namespace: %d. Tablet: [%s] is already being served by group
AI-assisted analysis of dgraph-io/dgraph@759e242be6 (2026-09-01).
Data as JSON: /api/errors/2a8464c96ddb0d52.
Report an issue: GitHub.