apache/beam · error
unable to genereate schema uuid for type
Error message
unable to genereate schema uuid for type %s: %v
What it means
After hashing the typename, getUUID seeds uuid.NewRandomFromReader with the digest to produce a deterministic UUID. If that call errors, the library panics because schema UUID generation is fundamental and cannot meaningfully continue.
Solutions
- Retry the operation
- Upgrade the Beam SDK / google/uuid dependency to a fixed version
- File a bug with a reproducing stack trace if it persists
Defensive patterns
Strategy: try-catch
Try / catch
defer func() { if r := recover(); r != nil { err = fmt.Errorf("schema uuid generation failed: %v", r) } }() Prevention
- Keep the google/uuid dependency current
- Retry on transient failures
- File a bug if reproducible — this signals an internal bug
When it happens
Trigger: fromType or structToSchema calling getUUID when uuid.NewRandomFromReader fails — practically only when the reader cannot supply 16 bytes, indicating an internal bug.
Common situations: Effectively unreachable in normal use; would surface as an internal invariant break during schema registration or serialization.
Understand the failure class
Background: "This is a bug, please report it": internal invariant violations, unreachable panics, and SNH errors explained — this error's family across 47 libraries.
Related errors
- unable to generate schema uuid for
- batch: failed to marshal worker UUID
- invalid logical type, bad id
- Logical Types may not be registered with empty interface…
- Logical Types must be registered with interface types.
AI-assisted analysis of apache/beam@12126d8942 (2026-09-13).
Data as JSON: /api/errors/d83908c937709d6a.
Report an issue: GitHub.
Appendix: source
Thrown at sdks/go/pkg/beam/core/runtime/graphx/schema/schema.go:87
// RegisterType converts the type to it's schema representation, and converts it back to
// a synthetic type so we can map from the synthetic type back to the user type.
// Recursively registers other named struct types in any component parts.
func RegisterType(ut reflect.Type) {
defaultRegistry.RegisterType(ut)
}
// getUUID generates a UUID using the string form of the type name.
func getUUID(ut reflect.Type) string {
// String produces non-empty output for pointer and slice types.
typename := ut.String()
hasher := fnv.New128a()
if n, err := hasher.Write([]byte(typename)); err != nil || n != len(typename) {
panic(fmt.Sprintf("unable to generate schema uuid for %s, wrote out %d bytes, want %d: err %v", typename, n, len(typename), err))
}
id, err := uuid.NewRandomFromReader(bytes.NewBuffer(hasher.Sum(nil)))
if err != nil {
panic(fmt.Sprintf("unable to genereate schema uuid for type %s: %v", typename, err))
}
return id.String()
}
// Registered returns whether the given type has been registered with
// the schema package.
func (r *Registry) Registered(ut reflect.Type) bool {
r.reconcileRegistrations()
r.rwmu.RLock()
defer r.rwmu.RUnlock()
_, ok := r.syntheticToUser[ut]
return ok
}
var sdfRtrackerType = reflect.TypeOf((*sdf.RTracker)(nil)).Elem()
// RegisterType converts the type to it's schema representation, and converts it back to
// a synthetic type so we can map from the synthetic type back to the user type.View on GitHub (pinned to 12126d8942)