CircuitBreakingException: [<breaker>] Data too large, data for [<source>] would be [X/...gb], which is larger than the limit of [Y/...gb] is logged when an operation in Elasticsearch would push JVM heap usage past one of the configured circuit breaker limits. The request is rejected before the allocation happens, which protects the node from OutOfMemoryError. Other queries continue to run. The exception names which breaker tripped - parent (default 95% of heap), request (60%), fielddata (40%), or accounting (100%) - and the immediate fix depends on which it is.
What This Error Means
Elasticsearch uses four indices.breaker.* circuit breakers to estimate the memory cost of an operation before allocating it. The parent breaker tracks total heap reservations across all breakers; the others track specific use cases:
| Breaker | Setting | Default | Tracks |
|---|---|---|---|
| Parent | indices.breaker.total.limit |
95% of heap (with use_real_memory: true, the default) |
Sum of all child breakers |
| Request | indices.breaker.request.limit |
60% of heap | Memory used by aggregations and similar per-request structures |
| Fielddata | indices.breaker.fielddata.limit |
40% of heap | In-heap fielddata for text fields |
| Accounting | indices.breaker.accounting.limit |
100% of heap | Long-lived allocations (Lucene segment readers, etc.) |
| In-flight requests | network.breaker.inflight_requests.limit |
100% of heap | Bytes used by transport-layer in-flight requests |
The parent breaker's use_real_memory: true mode (default since 7.0) checks actual JVM heap usage rather than estimated, so it can trip even when child breaker estimates look fine.
Common Causes
- Heap pressure from sustained traffic, large aggregations, or oversize shards. How to confirm:
GET _nodes/stats/jvm- look atmem.heap_used_percent. - Aggregation cardinality higher than expected. How to confirm: identify the slow query in the slow log and measure its memory with the
_search/_profileAPI. - Fielddata loaded on
textfields. How to confirm:GET _cat/fielddata?vand look for nonzero entries. - Many open Lucene segments (high
accountingbreaker usage). How to confirm:GET _cat/segments?vand count per-node; consider force-merging read-only indices. - JVM heap undersized for the working set. How to confirm:
GET _nodes/stats/jvmshowsheap_used_percentconsistently above 75% even at idle.
How to Fix CircuitBreakingException
Identify which breaker tripped. The exception text includes
[<breaker_name>]. Treat parent, request, fielddata, and accounting differently.Check live breaker stats:
GET /_nodes/stats/breakerCompare each
estimated_size_in_bytestolimit_size_in_bytes.For request breaker trips: reduce aggregation cost. Use
compositeaggregations for pagination instead of largetermsagg, capsizeontermsaggregations, and avoidcardinalityon high-cardinality keyword fields withoutprecision_threshold.For fielddata breaker trips: see the fielddata breaker page. Move aggregations to
.keywordsubfields backed by doc values.For parent breaker trips: reduce overall heap pressure. Force-merge read-only indices to drop accounting overhead:
POST /<index>/_forcemerge?max_num_segments=1Drop the fielddata cache as a short-term release:
POST /_cache/clear?fielddata=true&query=true&request=trueRight-size heap. Set heap to 50% of system RAM and no more than ~26 GB (to keep compressed object pointers) per the Elastic heap sizing guidance. Edit
config/jvm.options.d/heap.options:-Xms16g -Xmx16gRaise specific breakers only as a last resort. Raising the parent breaker above 95% defeats its purpose; raising fielddata or request requires confidence the heap can hold it.
Resolve CircuitBreakingException Automatically with Pulse
Pulse is an AI DBA for Elasticsearch and OpenSearch. When CircuitBreakingException: Data too large fires, Pulse:
- Reads
_nodes/stats/breakerfor all four breakers (parent, request, fielddata, accounting) plus in-flight requests, plotsestimated_size_in_bytesagainstlimit_size_in_bytes, correlates with_nodes/stats/jvmheap_used_percent, the slow log, and_cat/segmentsper-node counts - Identifies which breaker tripped (the
[<breaker>]in the exception text) and the dominant heap consumer: request structures from an oversized aggregation, fielddata on atextfield, accounting from too many open Lucene segments, or genuine heap undersizing withuse_real_memory: true - Generates the right remediation: the
_forcemerge?max_num_segments=1call on read-only indices, thecompositeaggregation rewrite withsizeandprecision_thresholdcaps, the_cache/clear?fielddata=true&query=true&request=truerelease, thejvm.options.d/heap.optionsheap resize (50% of RAM up to ~26 GB), or a targetedindices.breaker.*.limitadjustment - Applies dynamic
_cluster/settingschanges and cache clears automatically with operator approval; leaves heap-options edits, force-merges, and aggregation rewrites as one-click PRs
Pulse alerts on rising breaker-trip rates and heap_used_percent sustained above 75% so steady-state pressure surfaces before the parent breaker fires under a burst.
Start a free trial to connect your cluster.
Frequently Asked Questions
Q: What is the default circuit breaker limit in Elasticsearch?
A: Defaults vary by breaker: parent 95% (with use_real_memory: true), request 60%, fielddata 40%, accounting 100%, and in-flight requests 100%. All are percentages of the JVM heap.
Q: What does the parent circuit breaker do?
A: The parent breaker (indices.breaker.total.limit, default 95%) tracks total heap reservations across all child breakers and, with use_real_memory: true, also checks actual JVM heap usage. It is the last line of defense before OutOfMemoryError.
Q: How do I find out which query caused the CircuitBreakingException?
A: Enable the search slow log (index.search.slowlog.threshold.query.warn) to capture expensive queries, then match by timestamp to the CircuitBreakingException line in <cluster>.log. The exception itself names the source (request ID or fielddata field name).
Q: Can I disable circuit breakers in Elasticsearch?
A: Setting any breaker limit to -1 disables that specific check, but doing so removes the protection against JVM OutOfMemoryError. Tune workload and heap instead of disabling breakers.
Q: Does a CircuitBreakingException corrupt my index or cause data loss?
A: No. The breaker fires before the allocation, so the rejected request is the only thing affected. The cluster stays running and other queries complete normally. Watch for partial success in _bulk responses.
Q: Why does the parent breaker trip when child breakers report low usage?
A: With use_real_memory: true (default in 7.0+), the parent breaker checks actual JVM heap, not just child reservations. Garbage on heap from unaccounted allocations - including Lucene segment readers, Painless script caches, and incoming network buffers - can push real usage past 95% even when child estimates look fine.
Q: What's the fastest way to diagnose CircuitBreakingException in production?
A: Pulse, the AI DBA for Elasticsearch and OpenSearch, identifies which of the four breakers tripped, names the dominant heap consumer (segments, fielddata, or request structures), and ties the trip to the responsible query, index, or shard. It proposes the right action - force-merge, mapping fix, heap resize, or breaker tuning - and applies dynamic cluster settings automatically when approved.
Related Reading
- Elasticsearch field data circuit breaker tripped: the fielddata-specific case.
- Elasticsearch circuit breaker exceptions fix: cross-breaker remediation walkthrough.
- What is the Elasticsearch field data cache: underlying mechanism.
- Elasticsearch heap size setting: JVM sizing.
- Elasticsearch monitoring: catching breaker trips proactively.