|
40 | 40 | import org.elasticsearch.common.settings.Settings; |
41 | 41 | import org.elasticsearch.common.xcontent.XContentHelper; |
42 | 42 | import org.elasticsearch.core.Nullable; |
| 43 | +import org.elasticsearch.core.Releasables; |
43 | 44 | import org.elasticsearch.core.Strings; |
44 | 45 | import org.elasticsearch.core.TimeValue; |
45 | 46 | import org.elasticsearch.core.Tuple; |
@@ -167,13 +168,15 @@ protected void dispatchedShardOperationOnPrimary( |
167 | 168 | IndexShard primary, |
168 | 169 | ActionListener<PrimaryResult<BulkShardRequest, BulkShardResponse>> outerListener |
169 | 170 | ) { |
170 | | - var listener = ActionListener.releaseAfter( |
| 171 | + var primaryOperationExpansionReleasable = indexingPressure.trackPrimaryOperationExpansion( |
| 172 | + primaryOperationCount(request), |
| 173 | + getMaxOperationMemoryOverhead(request), |
| 174 | + force(request) |
| 175 | + ); |
| 176 | + // Ensure that we release the accounted memory for document expansion as soon as we're done processing the operations. |
| 177 | + var listener = ActionListener.runBefore( |
171 | 178 | outerListener, |
172 | | - indexingPressure.trackPrimaryOperationExpansion( |
173 | | - primaryOperationCount(request), |
174 | | - getMaxOperationMemoryOverhead(request), |
175 | | - force(request) |
176 | | - ) |
| 179 | + () -> Releasables.closeExpectNoException(primaryOperationExpansionReleasable) |
177 | 180 | ); |
178 | 181 | ClusterStateObserver observer = new ClusterStateObserver(clusterService, request.timeout(), logger, threadPool.getThreadContext()); |
179 | 182 | performOnPrimary(request, primary, updateHelper, threadPool::absoluteTimeInMillis, (update, shardId, mappingListener) -> { |
@@ -664,9 +667,14 @@ protected void dispatchedShardOperationOnReplica( |
664 | 667 | IndexShard replica, |
665 | 668 | ActionListener<ReplicaResult> outerListener |
666 | 669 | ) { |
667 | | - var listener = ActionListener.releaseAfter( |
| 670 | + var replicaOperationExpansionReleasable = indexingPressure.trackReplicaOperationExpansion( |
| 671 | + getMaxOperationMemoryOverhead(request), |
| 672 | + force(request) |
| 673 | + ); |
| 674 | + // Ensure that we release the accounted memory for document expansion as soon as we're done processing the operations. |
| 675 | + var listener = ActionListener.runBefore( |
668 | 676 | outerListener, |
669 | | - indexingPressure.trackReplicaOperationExpansion(getMaxOperationMemoryOverhead(request), force(request)) |
| 677 | + () -> Releasables.closeExpectNoException(replicaOperationExpansionReleasable) |
670 | 678 | ); |
671 | 679 | ActionListener.completeWith(listener, () -> { |
672 | 680 | final long startBulkTime = System.nanoTime(); |
|
0 commit comments