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
- Verify the tenant exists and is active on the class
- Retry the batch delete once tenant activation completes
- 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
- Activate tenants before deletes instead of relying on implicit activation.
- Verify tenant names exist before issuing tenant-scoped deletes.
- Ensure delete principals can update tenant status.
- Schedule COLD/offloaded tenant writes after reactivation.
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
- ensure tenant active: %w
- role name uses a reserved operator prefix
- multi-tenancy is not enabled
- tenant is in a transitional state
- namespace is required
AI-assisted analysis of weaviate/weaviate@75aa4b6d11 (2026-09-04).
Data as JSON: /api/errors/582828ff74885b9f.
Report an issue: GitHub.