Ceph Dashboard fails on tenant RGW buckets (NoSuchBucket → 500)
Ceph Dashboard fails with 500 Internal Server Error when operating on RGW buckets that belong to a *tenant*, even though the bucket exists and is accessible via radosgw-admin. RGW returns NoSuchBucket because the Dashboard queries the bucket *without the tenant prefix* ----------- 13:02:06.832428866Z"} {"log":"debug 2026-05-04T13:02:06.838+0000 7fbc29896640 0 [dashboard ERROR rest_client] RGW REST API failed GET req status: 404\n","stream":"stderr","time":"2026-05-04T13:02:06.841073842Z"} {"log":"debug 2026-05-04T13:02:06.838+0000 7fbc29896640 0 [dashboard ERROR exception] Internal Server Error\n","stream":"stderr","time":"2026-05-04T13:02:06.842785189Z"} {"log":"Traceback (most recent call last):\n","stream":"stderr","time":"2026-05-04T13:02:06.842818184Z"} {"log":" File \"/usr/share/ceph/mgr/dashboard/services/exception.py\", line 47, in dashboard_exception_handler\n","stream":"stderr","time":"2026-05-04T13:02:06.842831624Z"} {"log":" return handler(*args, **kwargs)\n","stream":"stderr","time":"2026-05-04T13:02:06.842841016Z"} {"log":" File \"/lib/python3.9/site-packages/cherrypy/_cpdispatch.py\", line 54, in __call__\n","stream":"stderr","time":"2026-05-04T13:02:06.842851035Z"} {"log":" return self.callable(*self.args, **self.kwargs)\n","stream":"stderr","time":"2026-05-04T13:02:06.842983312Z"} {"log":" File \"/usr/share/ceph/mgr/dashboard/controllers/_base_controller.py\", line 264, in inner\n","stream":"stderr","time":"2026-05-04T13:02:06.843004859Z"} {"log":" ret = func(*args, **kwargs)\n","stream":"stderr","time":"2026-05-04T13:02:06.843015376Z"} {"log":" File \"/usr/share/ceph/mgr/dashboard/controllers/_rest_controller.py\", line 193, in wrapper\n","stream":"stderr","time":"2026-05-04T13:02:06.843024549Z"} {"log":" return func(*vpath, **params)\n","stream":"stderr","time":"2026-05-04T13:02:06.84303376Z"} {"log":" File \"/usr/share/ceph/mgr/dashboard/controllers/rgw.py\", line 702, in set\n","stream":"stderr","time":"2026-05-04T13:02:06.843050003Z"} {"log":" locking = self._get_locking(uid, daemon_name, bucket_name)\n","stream":"stderr","time":"2026-05-04T13:02:06.843059741Z"} {"log":" File \"/usr/share/ceph/mgr/dashboard/controllers/rgw.py\", line 443, in _get_locking\n","stream":"stderr","time":"2026-05-04T13:02:06.843069083Z"} {"log":" return rgw_client.get_bucket_locking(bucket_name)\n","stream":"stderr","time":"2026-05-04T13:02:06.843078375Z"} {"log":" File \"/usr/share/ceph/mgr/dashboard/rest_client.py\", line 538, in func_wrapper\n","stream":"stderr","time":"2026-05-04T13:02:06.843087524Z"} {"log":" return func(\n","stream":"stderr","time":"2026-05-04T13:02:06.843096712Z"} {"log":" File \"/usr/share/ceph/mgr/dashboard/services/rgw_client.py\", line 899, in get_bucket_locking\n","stream":"stderr","time":"2026-05-04T13:02:06.843105575Z"} {"log":" raise e\n","stream":"stderr","time":"2026-05-04T13:02:06.843114638Z"} {"log":" File \"/usr/share/ceph/mgr/dashboard/services/rgw_client.py\", line 881, in get_bucket_locking\n","stream":"stderr","time":"2026-05-04T13:02:06.843123252Z"} {"log":" result = request() # type: ignore\n","stream":"stderr","time":"2026-05-04T13:02:06.843132275Z"} {"log":" File \"/usr/share/ceph/mgr/dashboard/rest_client.py\", line 324, in __call__\n","stream":"stderr","time":"2026-05-04T13:02:06.843141087Z"} {"log":" resp = self.rest_client.do_request(method, self._gen_path(), params,\n","stream":"stderr","time":"2026-05-04T13:02:06.843163504Z"} {"log":" File \"/usr/share/ceph/mgr/dashboard/rest_client.py\", line 422, in do_request\n","stream":"stderr","time":"2026-05-04T13:02:06.843173809Z"} {"log":" raise RequestException(\n","stream":"stderr","time":"2026-05-04T13:02:06.843367851Z"} {"log":"dashboard.rest_client.RequestException: RGW REST API failed request with status code 404\n","stream":"stderr","time":"2026-05-04T13:02:06.843382042Z"} {"log":"(b'{\"Code\":\"NoSuchBucket\",\"Message\":\"\",\"BucketName\":\"farhad\",\"RequestId\":\"tx000'\n","stream":"stderr","time":"2026-05-04T13:02:06.843391177Z"} {"log":" b'00ab80c789f95808ff-0069f898ce-110717032-vanak\",\"HostId\":\"110717032-vanak-teh'\n","stream":"stderr","time":"2026-05-04T13:02:06.843400934Z"} {"log":" b'ran\"}')\n","stream":"stderr","time":"2026-05-04T13:02:06.843410095Z"} {"log":"debug 2026-05-04T13:02:06.842+0000 7fbc29896640 0 [dashboard ERROR request] [::ffff:172.20.26.54:49876] [PUT] [500] [0.619s] [admin] [513.0B] /api/rgw/bucket/khedrian%2Ffarhad\n","stream":"stderr","time":"2026-05-04T13:02:06.846732997Z"} {"log":"debug 2026-05-04T13:02:06.842+0000 7fbc29896640 0 [dashboard ERROR request] [b'{\"status\": \"500 Internal Server Error\", \"detail\": \"The server encountered an unexpected condition which prevented it from fulfilling the request.\", \"request_id\": \"a3abea21-d73c-4d26-a8bb-1d99fc53a466\"} ']\n","stream":"stderr","time":"2026-05-04T13:02:06.847608634Z"} {"log":"debug 2026-05-04T13:02:06.846+0000 7fbc29896640 0 [dashboard INFO request] [::ffff:172.20.26.54:49876] [PUT] [500] [0.622s] [admin] [513.0B] /api/rgw/bucket/khedrian%2Ffarhad\n","stream":"stderr","time":"2026-05-04T13:02:06.849427429Z"} {"log":"debug 2026-05-04T13:02:07.322+0000 7fbc28053640 0 [dashboard INFO request] [::ffff:172.20.26.54:64634] [GET] [200] [0.691s] [admin] [295.0B] /api/rgw/daemon\n","stream":"stderr","time":"2026-05-04T13:02:07.324402049Z"} {"log":"debug 2026-05-04T13:02:07.850+0000 7fbc2504d640 0 [dashboard INFO request] [::ffff:172.20.26.54:49870] [GET] [200] [0.004s] [admin] [22.0B] /api/prometheus/notifications\n","stream":"stderr","time":"2026-05-04T13:02:07.855794264Z"} {"log":"debug 2026-05-04T13:02:08.110+0000 7fbc5c2fb640 0 log_channel(cluster) log [DBG] : pgmap v611376: 449 pgs: 449 active+clean; 202 MiB data, 10 GiB used, 1.2 TiB / 1.2 TiB avail; 6.0 KiB/s rd, 0 B/s wr, 8 op/s\n","stream":"stderr","time":"2026-05-04T13:02:08.113933657Z"} {"log":"debug 2026-05-04T13:02:10.111+0000 7fbc5c2fb640 0 log_channel(cluster) log [DBG] : pgmap v611377: 449 pgs: 449 active+clean; 202 MiB data, 10 GiB used, 1.2 TiB / 1.2 TiB avail; 5.7 KiB/s rd, 0 B/s wr, 8 op/s\n","stream":"stderr","time":"2026-05-04T13:02:10.115433742Z"} {"log":"debug 2026-05-04T13:02:10.211+0000 7fbc2484c640 0 [dashboard INFO request] [::ffff:172.20.26.54:49876] [GET] [200] [0.003s] [admin] [22.0B] /api/prometheus/notifications\n","stream":"stderr","time":"2026-05-04T13:02:10.2151369Z"} ---------------- root@dev-ceph01:~# ceph -v ceph version 20.2.0 (69f84cc2651aa259a15bc192ddaabd3baba07489) tentacle (stable) { "Version": "2012-10-17", "Statement": [ { "Sid": "PublicReadGetObject", "Effect": "Allow", "Principal": "*", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::khedrian:farhad/*" } ] } - Bucket exists and is accessible via radosgw-admin - Issue only occurs for *tenant buckets* - Non‑tenant buckets work correctly - Appears to be a *Dashboard RGW tenant parsing bug* - Possibly missing tenant propagation when calling get_bucket_locking() and similar RGW APIs can anyone explain this ? what should i do ?
participants (1)
-
farhad kh