CephLXXX · Blocked OperationsBlocked Operations
Pool-level blocking conditions
What you'll learn
- Identify pool-level blocking conditions
- Diagnose each from its symptom
- Restore access appropriately
- Prevent recurrence
Prerequisites
None — start here.
Verified against Ceph Tentacle 20.2.x · Ceph Squid 19.2.x (supported previous) · cephadm matches the verified Ceph release · podman 4.x · csi-rbd and csi-cephfs current · RBD / CephFS / RGW current (matches Ceph release) · Linux kernel 5.15+ (5.10 minimum) · Ubuntu 24.04 LTS (Ceph host baseline) · Debian 12 (Bookworm) (Ceph host baseline) · Rocky Linux / RHEL / AlmaLinux 9.x (Ceph host baseline) · Proxmox VE 9.x (cross-course integration) · Kubernetes 1.31+ (cross-course integration) · 2026-08-18
Why this matters in production
One pool blocked while everything else works points at pool-level configuration, and the sweep for it is short and specific.
The conditions
| Condition | Symptom | Check |
|---|---|---|
max_bytes quota reached | writes rejected | ceph osd pool get-quota |
max_objects quota reached | writes rejected | same |
| Pool has no application enabled | health warning, not blocking | ceph osd pool application get |
Pool marked nodelete | deletion refused | ceph osd pool get <pool> nodelete |
Pool marked nopgchange | PG changes refused | ceph osd pool get <pool> nopgchange |
Pool marked nosizechange | size changes refused | ceph osd pool get <pool> nosizechange |
| CRUSH rule cannot place PGs | PGs inactive | ceph pg dump pgs |
min_size unmet | PGs inactive | ceph pg dump pgs |
ceph osd pool ls detail | grep -A2 "^pool.*'rbd-vms'"
ceph osd pool get-quota rbd-vms
Quotas
ceph osd pool get-quota rbd-vms
# quotas for pool 'rbd-vms':
# max objects: N/A
# max bytes : 50 TiB (current num bytes: 53687091200000)
# raise, or remove
ceph osd pool set-quota rbd-vms max_bytes 80T
ceph osd pool set-quota rbd-vms max_bytes 0 # 0 removes the limit
Quota enforcement depends on periodically-updated statistics, so a burst can exceed the limit before it takes effect — which is why the current figure may exceed the configured maximum.
CRUSH rule placement failure
RULE=replicated_rule
ceph osd pool get rbd-vms crush_rule
ceph osd crush rule dump ${RULE}
ceph pg dump pgs | awk '$10 !~ /active/ {print $1, $10}' | head
A rule requiring more failure domains than exist leaves PGs unable to peer:
size=3, failure_domain=rack, 2 racks available
→ CRUSH cannot select a third rack
→ PGs stay undersized or inactive
# how many of the failure domain exist?
ceph osd tree | grep -c 'rack '
ceph osd pool get rbd-vms size
The protection flags
ceph osd pool set rbd-vms nodelete true
ceph osd pool set rbd-vms nosizechange true
ceph osd pool set rbd-vms nopgchange true
These prevent accidental changes and produce confusing failures when
forgotten — an operator attempting to raise size receives a refusal with
no obvious cause.
ceph osd pool ls detail | grep -oE 'no(delete|sizechange|pgchange)'
Preventing recurrence
| Prevention | Effect |
|---|---|
| Alert on quota utilisation, not just quota reached | warning before blocking |
| Verify failure domain count before setting a CRUSH rule | placement always possible |
| Document protection flags where the pool is documented | refusals are explicable |
| Set quotas with margin above the stated requirement | bursts do not block |
- alert: CephPoolQuotaApproaching
expr: ceph_pool_stored / ceph_pool_quota_bytes > 0.85
for: 1h
labels: { severity: ticket }
Quiz
Knowledge check · 4 questions
Q1. A pool with size=3 and failure_domain=rack sits on a cluster with two racks. What happens?
Q2. A pool quota acts as a hard byte-level barrier that cannot be exceeded.
Q3. Diagnose one blocked pool.
One pool has stopped accepting writes. Every other pool works normally. Cluster capacity is at 61% and no OSD is nearfull.
Q4. Why do pool protection flags produce confusing failures?
Passing score: 75%. Answers are checked in this browser.
Production discipline
Check ceph osd pool get-quota first when one pool is blocked and the
cluster is healthy — it is the most common cause and takes one command.
Verify the failure domain count against the pool size before setting any
CRUSH rule; a rule that cannot place is permanent until the topology or
the rule changes.
Cross-course references
- Kubernetes: a namespace-scoped limit blocking one workload while the cluster is idle
- Linux: per-user quotas produce identical single-tenant blocking