{"record":{"id":"b0a961b5c8779322","repo":"weaviate/weaviate","slug":"backup-class-v-descriptor-w","errorCode":null,"errorMessage":"backup class %v descriptor: %w","messagePattern":"backup class (.+?) descriptor: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"adapters/repos/db/backup.go","lineNumber":146,"sourceCode":"\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tidx.dropIndex.RLock()\n\t\t\t\tdefer idx.dropIndex.RUnlock()\n\t\t\t\tif err := idx.enterRead(); err != nil {\n\t\t\t\t\tdesc.Error = fmt.Errorf(\"index for class %v is closed\", c)\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tdefer idx.exitRead()\n\t\t\t\tvar classBaseDescr []*backup.ClassDescriptor\n\t\t\t\tfor _, b := range baseDescrs {\n\t\t\t\t\tclassbaseDescrTmp := b.GetClassDescriptor(c)\n\t\t\t\t\tif classbaseDescrTmp == nil {\n\t\t\t\t\t\tcontinue\n\t\t\t\t\t}\n\t\t\t\t\tclassBaseDescr = append(classBaseDescr, classbaseDescrTmp)\n\t\t\t\t}\n\t\t\t\tif err := idx.descriptor(ctx, bakid, &desc, classBaseDescr); err != nil {\n\t\t\t\t\tdesc.Error = fmt.Errorf(\"backup class %v descriptor: %w\", c, err)\n\t\t\t\t}\n\t\t\t}()\n\n\t\t\tds <- desc\n\t\t\tif desc.Error != nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\tenterrors.GoWrapper(f, db.logger)\n\treturn ds\n}\n\n// ReleaseBackup release resources acquired by the index during backup\nfunc (db *DB) ReleaseBackup(ctx context.Context, bakID, class string) (err error) {\n\tfields := logrus.Fields{\n\t\t\"op\":    \"release_backup\",\n\t\t\"class\": class,","sourceCodeStart":128,"sourceCodeEnd":164,"githubUrl":"https://github.com/weaviate/weaviate/blob/75aa4b6d11f8818305aafd4440b4e32794f7ca04/adapters/repos/db/backup.go#L128-L164","documentation":"Wraps any failure from idx.descriptor(...) — the per-class backup descriptor construction — and stores it in desc.Error as \"backup class <name> descriptor: <cause>\". This means building the class's backup description (listing/validating shard backups against the base descriptor) failed locally on this node.","triggerScenarios":"idx.descriptor returns an error during backup AllClasses: missing or corrupt shard backup files, backend storage errors, or mismatch between the current descriptor and the base descriptors from previous backup attempts.","commonSituations":"Object-store outages or misconfigured backup backends, partial backups left behind by earlier failed runs, permission errors on the backup bucket.","solutions":["Inspect the wrapped cause for the underlying storage error","Verify the backup backend (S3/GCS/Azure/FS) credentials, permissions and availability","Clean up stale/partial backup artifacts and retry with a fresh backup ID","Retry the backup; transient backend errors are a common cause"],"exampleFix":"// before\nclient.Backup().Create(backend, id, \"Articles\") // backend misconfigured\n// after\n// validate backend first\nclient.Backup().Creator().WithBackend(backend).WithBackupID(id) // check store access/permissions beforehand","handlingStrategy":"retry","validationCode":"// Verify backend accessibility first\nif err := checkBackupBackendAccess(ctx, backend); err != nil {\n    return fmt.Errorf(\"fix backend before backup: %w\", err)\n}","typeGuard":null,"tryCatchPattern":"if strings.Contains(err.Error(), \"backup class\") {\n    var cause error\n    errors.As(err, &cause) // inspect underlying storage error\n    // fix backend/permissions, then retry with fresh backup ID\n}","preventionTips":["Test backup backend credentials/permissions regularly","Clean up stale partial backups from failed runs","Use unique backup IDs per attempt to avoid descriptor mismatches"],"tags":["backup","descriptor","storage-backend"],"backgroundTag":"backup-backend-error","analyzedSha":"75aa4b6d11f8818305aafd4440b4e32794f7ca04","analyzedAt":"2026-09-04T14:58:20.392Z","contentChangedAt":"2026-09-04T14:58:20.392Z","schemaVersion":2},"datasetVersion":"2026-09-11T21:17:09.523Z"}