{"record":{"id":"be32d943d672dc46","repo":"weaviate/weaviate","slug":"bucket-s-must-be-in-s-mode-to-be-renamed","errorCode":null,"errorMessage":"bucket '%s' must be in %s mode to be renamed","messagePattern":"bucket '(.+?)' must be in (.+?) mode to be renamed","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"adapters/repos/db/lsmkv/store.go","lineNumber":677,"sourceCode":"\n\tif s.closed {\n\t\treturn fmt.Errorf(\"%w: renaming bucket %q for %q in store %q\", ErrAlreadyClosed, bucketName, newBucketName, s.dir)\n\t}\n\n\ts.bucketAccessLock.Lock()\n\tdefer s.bucketAccessLock.Unlock()\n\n\tcurrBucket := s.bucketsByName[bucketName]\n\tif currBucket == nil {\n\t\treturn fmt.Errorf(\"bucket '%s' not found\", bucketName)\n\t}\n\tnewBucket := s.bucketsByName[newBucketName]\n\tif newBucket != nil {\n\t\treturn fmt.Errorf(\"bucket '%s' already exists\", newBucketName)\n\t}\n\n\tif !currBucket.isReadOnly() {\n\t\treturn fmt.Errorf(\"bucket '%s' must be in %s mode to be renamed\", bucketName, storagestate.StatusReadOnly)\n\t}\n\n\tcurrBucketDir := currBucket.dir\n\tnewBucketDir := s.bucketDir(newBucketName)\n\n\tcurrBucket.flushLock.Lock()\n\tdefer currBucket.flushLock.Unlock()\n\n\tif currBucket.flushing != nil {\n\t\treturn fmt.Errorf(\"bucket '%s' can not be renamed before flushing\", bucketName)\n\t}\n\n\tcurrBucket.dir = newBucketDir\n\n\tmt, err := currBucket.createNewActiveMemtable()\n\tif err != nil {\n\t\treturn fmt.Errorf(\"switch active memtable: %w\", err)\n\t}","sourceCodeStart":659,"sourceCodeEnd":695,"githubUrl":"https://github.com/weaviate/weaviate/blob/75aa4b6d11f8818305aafd4440b4e32794f7ca04/adapters/repos/db/lsmkv/store.go#L659-L695","documentation":"RenameBucket only permits renaming buckets that are in read-only mode (currBucket.isReadOnly() == false -> error). This prevents renaming a bucket that may still accept writes, which would break the invariant that writes land in the registered bucket name. The bucket must be flipped to storagestate.StatusReadOnly first.","triggerScenarios":"Calling Store.RenameBucket on a bucket that is still writable — i.e. the caller did not put the bucket (or its shard) into read-only state before renaming.","commonSituations":"Migration code forgetting the read-only step; renaming a tenant shard bucket while writes are still flowing; calling rename during active ingest instead of after quiescing writes.","solutions":["Put the bucket into read-only mode before renaming (the shard/schema layer sets this, e.g. via shard.SetReadOnly / stop writes)","Quiesce all writes to the bucket, then confirm its status is read-only, then rename","If the bucket should never be writable, verify how it was created — a writable bucket requires the full read-only transition"],"exampleFix":"// before\nerr := store.RenameBucket(ctx, oldName, newName)\n// after\nbucket := store.Bucket(oldName)\nif !bucket.IsReadOnly() {\n    if err := bucket.SetReadOnly(); err != nil { return err }\n}\nerr := store.RenameBucket(ctx, oldName, newName)","handlingStrategy":"validation","validationCode":"b := store.Bucket(bucketName)\nif b != nil && !b.IsReadOnly() {\n    return fmt.Errorf(\"bucket %q must be set read-only before rename\", bucketName)\n}","typeGuard":"func bucketIsReadOnly(b *lsmkv.Bucket) bool { return b != nil && b.IsReadOnly() }","tryCatchPattern":"if err := store.RenameBucket(ctx, a, b); err != nil {\n    if strings.Contains(err.Error(), \"must be in read-only mode\") {\n        return fmt.Errorf(\"put bucket in read-only (quiesce writes) before rename: %w\", err)\n    }\n    return err\n}","preventionTips":["Always transition the shard/bucket to read-only (stop writes + flush) before renaming","Never rename during active ingest; quiesce writes at the schema/shard layer first","Assert read-only status in migration code before invoking RenameBucket"],"tags":["lsmkv","bucket-rename","read-only","write-mode"],"backgroundTag":"bucket-not-read-only","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"}