Elasticsearch cluster won't relocate shards: 'disk threshold exceeded' though df -h shows free space (EC2 EBS ext4 reserved blocks suspected)
Environment
Elasticsearch 7.10 cluster on AWS EC2: three data nodes (m5.large equivalents), each node has a single EBS volume mounted at /var/lib/elasticsearch with ext4 filesystem. cluster.routing.allocation.disk.threshold_enabled=true. Nodes run OpenJDK 11 and are started via systemd with path.data=/var/lib/elasticsearch.
Symptoms
Cluster health moved from green → yellow after one node received large bulk indexing. Elasticsearch 'shard allocation' does not relocate shards away from the node flagged as 'high disk usage'; those shards remain unassigned and some indices degrade. Administrators observe cluster won't allocate replicas to other nodes citing 'cannot allocate, disk threshold exceeded'.
Observations
df -h reports /var/lib/elasticsearch with 35% usage and >200GB available on each node. GET _cluster/allocation/explain for an unassigned shard returns 'too many shards on node' and 'disk usage exceeds high watermark' for the targeted node. Elasticsearch logs show disk-based allocation decisions and reference java.io.File.getUsableSpace returning low usable bytes on the affected node. No other processes are consuming obvious additional space; EBS volumes show expected provisioned size. No snapshots running at the observed time.
Already attempted
Tried temporarily lowering cluster.routing.allocation.disk.watermark.high and reran allocation explain — cluster still refused to move some shards. Restarted the node and Elasticsearch service on the affected host (no change). Verified path.data and mount options; checked for bind mounts and symlinks (none found).
Question
Why is Elasticsearch treating a node as over-high-disk even though df -h shows plenty of free space, and what safe checks can I run to determine whether filesystem reserved blocks, Java usable-space semantics, or path.data misconfiguration are the culprit?
Verified community troubleshooting
No answers yet..