dgraph-io/dgraph · error

failed to lazy-load GraphQL schema

Error message

failed to lazy-load GraphQL schema

What it means

lazyLoadSchema fetches the stored GraphQL schema from Dgraph via getCurrentGraphQLSchema and wraps any failure (network/storage error reading the schema) with this message. The GraphQL server for the namespace cannot be constructed without the stored schema.

Source

Thrown at graphql/admin/admin.go:1019

	resolvers := resolve.New(gqlSchema, resolverFactory)
	as.gqlServer.Set(ns, as.getGlobalEpoch(ns), resolvers)

	// reset status to up, as now we are serving the new schema
	mainHealthStore.up()
}

func (as *adminServer) lazyLoadSchema(namespace uint64) error {
	// if the schema is already in memory, no need to fetch it from disk
	if currentSchema, ok := as.gqlSchemas.GetCurrent(namespace); ok && currentSchema.Loaded {
		return nil
	}

	// otherwise, fetch the schema from disk
	sch, err := getCurrentGraphQLSchema(namespace)
	if err != nil {
		glog.Errorf("namespace: %d. Error reading GraphQL schema: %s.", namespace, err)
		return errors.Wrap(err, "failed to lazy-load GraphQL schema")
	}

	var generatedSchema schema.Schema
	if sch.Schema == "" {
		// if there was no schema stored in Dgraph, we still need to attach resolvers to the main
		// graphql server which should just return errors for any incoming request.
		// generatedSchema will be nil in this case
		glog.Infof("namespace: %d. No GraphQL schema in Dgraph; serving empty GraphQL API",
			namespace)
	} else {
		generatedSchema, err = generateGQLSchema(sch, namespace)
		if err != nil {
			glog.Errorf("namespace: %d. Error processing GraphQL schema: %s.", namespace, err)
			return errors.Wrap(err, "failed to lazy-load GraphQL schema")
		}
	}

	as.mux.Lock()

View on GitHub (pinned to 759e242be6)

Solutions

  1. Retry the request — lazy loading is attempted per request and may succeed once the backend recovers.
  2. Check the underlying error in the log line 'Error reading GraphQL schema' for the root cause.
  3. Verify Dgraph health and that the client can read dgraph.graphql.schema (ACL permissions).
Defensive patterns

Strategy: retry

Validate before calling

// probe Dgraph health before first GraphQL request
const healthy = await fetch('/health').then(r => r.ok).catch(() => false);
if (!healthy) await waitForHealthy();

Try / catch

try { await graphqlQuery(q); } catch (e) { if (String(e).includes('failed to lazy-load GraphQL schema')) { await backoffRetry(() => graphqlQuery(q)); } else throw e; }

Prevention

When it happens

Trigger: First request hitting a namespace's GraphQL endpoint triggers lazy load, and reading dgraph.graphql.schema from Dgraph fails (connection error, timeout, internal Dgraph error).

Common situations: Dgraph backend unhealthy/overloaded at first request; ACL/permission issues reading the schema node; network partition between the GraphQL layer and the Dgraph storage backend.

Related errors


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