weaviate/weaviate · error

error ensuring tenant active for write: %w

Error message

error ensuring tenant active for write: %w

What it means

Ensuring the target tenant is active for write failed while preparing a batch delete. The tenant may not exist yet, its activation is still propagating through the cluster, or the schema wait was cancelled.

Source

Thrown at usecases/objects/batch_delete.go:92

	schemaVersion := fetchedClasses[className].Version

	deletionTime := time.UnixMilli(b.timeSource.Now())
	return b.vectorRepo.BatchDeleteObjects(ctx, params, deletionTime, repl, tenant, schemaVersion)
}

func (b *BatchManager) deleteObjects(ctx context.Context, principal *models.Principal,
	match *models.BatchDeleteMatch, deletionTimeUnixMilli *int64, dryRun *bool, output *string,
	repl *additional.ReplicationProperties, tenant string,
) (*BatchDeleteResponse, error) {
	params, schemaVersion, err := b.validateBatchDelete(ctx, principal, match, dryRun, output)
	if err != nil {
		return nil, errors.Wrap(err, "validate")
	}

	if tenant != "" {
		tenantSchemaVersion, err := b.schemaManager.EnsureTenantActiveForWrite(ctx, string(params.ClassName), tenant)
		if err != nil {
			return nil, fmt.Errorf("error ensuring tenant active for write: %w", err)
		}
		schemaVersion = max(schemaVersion, tenantSchemaVersion)
	}

	// Wait so tenant activation is visible locally before shard resolution and delete.
	if err := b.schemaManager.WaitForUpdate(ctx, schemaVersion); err != nil {
		return nil, fmt.Errorf("error waiting for local schema to catch up to version %d: %w", schemaVersion, err)
	}

	var deletionTime time.Time
	if deletionTimeUnixMilli != nil {
		deletionTime = time.UnixMilli(*deletionTimeUnixMilli)
	}

	result, err := b.vectorRepo.BatchDeleteObjects(ctx, *params, deletionTime, repl, tenant, schemaVersion)
	if err != nil {
		return nil, fmt.Errorf("batch delete objects: %w", err)
	}

View on GitHub (pinned to 75aa4b6d11)

Solutions

  1. Verify the tenant exists and is active on the class
  2. Retry the batch delete once tenant activation completes
  3. Check raft/schema propagation health

Example fix

// before
// batch delete from tenant "cold-tenant" -> error
// after
_, err := client.Schema().TenantsUpdater(ctx, className,
  []models.Tenant{{Name: "cold-tenant", ActivityStatus: models.TenantActivityStatusHOT}})
if err != nil { return err }
// then run the batch delete
Defensive patterns

Strategy: retry

Validate before calling

tenants, err := client.Schema().TenantsGetter(ctx, className)
if err != nil { return err }
for _, t := range tenants {
  if t.Name == tenantName && t.ActivityStatus != nil &&
     *t.ActivityStatus != models.TenantActivityStatusACTIVE {
    return fmt.Errorf("tenant %s not writable (status %s)", tenantName, *t.ActivityStatus)
  }
}

Try / catch

err := batchDelete(ctx, req)
if err != nil && strings.Contains(err.Error(), "ensuring tenant active") {
  if err := activateTenant(ctx, className, tenantName); err != nil { return err }
  return batchDelete(ctx, req)
}

Prevention

When it happens

Trigger: POST /v1/batch/delete with a tenant parameter where the tenant is COLD/inactive and cannot be activated — schema update rejected, authorization failure, or cluster error during EnsureTenantActiveForWrite.

Common situations: Batch-deleting from a COLD tenant without permission to activate; cluster cannot commit the tenant status change; deleted or misspelled tenant name passed in the request.

Related errors


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