weaviate/weaviate · error

classification: put: %w

Error message

classification: put: %w

What it means

Schedule() persists the new classification job (status 'running') into the classification repository via repo.Put before triggering the async run. This error wraps that storage write failure. The classification was never started, so the caller gets an error instead of a job id they can poll.

Source

Thrown at usecases/classification/classifier.go:177

		return nil, err
	}

	err = NewValidator(c.classGetterWithAuthzFunc(ctx, principal), params).Do()
	if err != nil {
		return nil, err
	}

	if err := c.assignNewID(&params); err != nil {
		return nil, fmt.Errorf("classification: assign id: %w", err)
	}

	params.Status = models.ClassificationStatusRunning
	params.Meta = &models.ClassificationMeta{
		Started: strfmt.DateTime(time.Now()),
	}

	if err := c.repo.Put(ctx, params); err != nil {
		return nil, fmt.Errorf("classification: put: %w", err)
	}

	// asynchronously trigger the classification
	filters, err := c.extractFilters(ctx, principal, params)
	if err != nil {
		return nil, err
	}

	enterrors.GoWrapper(func() { c.run(params, filters) }, c.logger)

	return &params, nil
}

func (c *Classifier) extractFilters(ctx context.Context, principal *models.Principal, params models.Classification) (Filters, error) {
	if params.Filters == nil {
		return classificationFilters{}, nil
	}

View on GitHub (pinned to 75aa4b6d11)

Solutions

  1. Retry the classification scheduling request once the cluster is healthy.
  2. Check cluster health (GET /v1/nodes) — verify all nodes are up and RAFT/consensus is stable.
  3. Check node disk space and storage backend health on the coordinator node.
  4. Increase the client request timeout so the store write is not cancelled mid-flight.
  5. Inspect the wrapped error to determine whether it is a timeout, consensus, or I/O failure and address accordingly.
Defensive patterns

Strategy: retry

Validate before calling

const health = await (await fetch('http://localhost:8080/v1/nodes')).json();
const allHealthy = health.nodes?.every(n => n.status === 'HEALTHY');
if (!allHealthy) throw new Error('cluster unhealthy: resolve node status before scheduling classification');

Try / catch

try {
  await scheduleClassification(params);
} catch (e) {
  if (String(e).includes('classification: put')) {
    await sleep(backoff);
    return scheduleClassification(params); // retry after cluster recovers
  }
  throw e;
}

Prevention

When it happens

Trigger: The classification store write fails during POST /v1/classifications: the underlying schema/object store returns an error (cluster consensus unavailable, node unhealthy, storage I/O failure, context deadline exceeded).

Common situations: Cluster in a degraded state (leader election in progress, RAFT unavailable); node disk full; store timeouts under heavy load; the request context cancelled by an aggressive client timeout before the write completes.

Related errors


AI-assisted analysis of weaviate/weaviate@75aa4b6d11 (2026-09-04). Data as JSON: /api/errors/f6812af0732c8fba. Report an issue: GitHub.