Skip to main content
RunBook Academy

CephLXXX · Blocked OperationsBlocked Operations

Pool-level blocking conditions

Intermediate⏱ ~17 minceph

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

Not yet marked complete on this device.

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

ConditionSymptomCheck
max_bytes quota reachedwrites rejectedceph osd pool get-quota
max_objects quota reachedwrites rejectedsame
Pool has no application enabledhealth warning, not blockingceph osd pool application get
Pool marked nodeletedeletion refusedceph osd pool get <pool> nodelete
Pool marked nopgchangePG changes refusedceph osd pool get <pool> nopgchange
Pool marked nosizechangesize changes refusedceph osd pool get <pool> nosizechange
CRUSH rule cannot place PGsPGs inactiveceph pg dump pgs
min_size unmetPGs inactiveceph 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

PreventionEffect
Alert on quota utilisation, not just quota reachedwarning before blocking
Verify failure domain count before setting a CRUSH ruleplacement always possible
Document protection flags where the pool is documentedrefusals are explicable
Set quotas with margin above the stated requirementbursts 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

  1. Q1. A pool with size=3 and failure_domain=rack sits on a cluster with two racks. What happens?

  2. Q2. A pool quota acts as a hard byte-level barrier that cannot be exceeded.

  3. 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.

  4. 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