@@ -124,10 +124,11 @@ void SharedArbitrator::reserveMemory(MemoryPool* pool, uint64_t /*unused*/) {
124124 pool->grow (reserveBytes);
125125}
126126
127- void SharedArbitrator::releaseMemory (MemoryPool* pool) {
127+ uint64_t SharedArbitrator::releaseMemory (MemoryPool* pool, uint64_t bytes ) {
128128 std::lock_guard<std::mutex> l (mutex_);
129- const uint64_t freedBytes = pool->shrink (0 );
129+ const uint64_t freedBytes = pool->shrink (bytes );
130130 incrementFreeCapacityLocked (freedBytes);
131+ return freedBytes;
131132}
132133
133134std::vector<SharedArbitrator::Candidate> SharedArbitrator::getCandidateStats (
@@ -246,54 +247,59 @@ bool SharedArbitrator::arbitrateMemory(
246247 uint64_t targetBytes) {
247248 VELOX_CHECK (!requestor->aborted ());
248249
249- const uint64_t growTarget = std::min (
250- maxGrowBytes (*requestor),
251- std::max (minMemoryPoolCapacityTransferSize_, targetBytes));
252- uint64_t freedBytes = decrementFreeCapacity (growTarget);
253- if (freedBytes >= targetBytes) {
254- requestor->grow (freedBytes);
255- return true ;
256- }
257- VELOX_CHECK_LT (freedBytes, growTarget);
250+ const uint64_t growTarget =
251+ std::max (minMemoryPoolCapacityTransferSize_, targetBytes);
252+ uint64_t unusedFreedBytes = decrementFreeCapacity (growTarget);
258253
259254 auto freeGuard = folly::makeGuard ([&]() {
260255 // Returns the unused freed memory capacity back to the arbitrator.
261- if (freedBytes > 0 ) {
262- incrementFreeCapacity (freedBytes );
256+ if (unusedFreedBytes > 0 ) {
257+ incrementFreeCapacity (unusedFreedBytes );
263258 }
264259 });
265260
266- freedBytes +=
267- reclaimFreeMemoryFromCandidates (candidates, growTarget - freedBytes);
268- if (freedBytes >= targetBytes) {
269- const uint64_t bytesToGrow = std::min (growTarget, freedBytes);
270- requestor->grow (bytesToGrow);
271- freedBytes -= bytesToGrow;
261+ if (unusedFreedBytes >= targetBytes) {
262+ requestor->grow (unusedFreedBytes);
263+ unusedFreedBytes = 0 ;
264+ return true ;
265+ }
266+ VELOX_CHECK_LT (unusedFreedBytes, growTarget);
267+
268+ reclaimFreeMemoryFromCandidates (candidates, growTarget - unusedFreedBytes);
269+ unusedFreedBytes += decrementFreeCapacity (growTarget - unusedFreedBytes);
270+ if (unusedFreedBytes >= targetBytes) {
271+ requestor->grow (unusedFreedBytes);
272+ unusedFreedBytes = 0 ;
272273 return true ;
273274 }
274275
275- VELOX_CHECK_LT (freedBytes, growTarget);
276- freedBytes += reclaimUsedMemoryFromCandidates (
277- requestor, candidates, growTarget - freedBytes);
276+ VELOX_CHECK_LT (unusedFreedBytes, growTarget);
277+ reclaimUsedMemoryFromCandidates (
278+ requestor, candidates, growTarget - unusedFreedBytes);
279+ unusedFreedBytes += decrementFreeCapacity (growTarget - unusedFreedBytes);
278280 if (requestor->aborted ()) {
279281 ++numFailures_;
280282 VELOX_MEM_POOL_ABORTED (requestor);
281283 }
282284
283285 VELOX_CHECK (!requestor->aborted ());
284286
285- if (freedBytes < targetBytes) {
287+ if (unusedFreedBytes < targetBytes) {
286288 VELOX_MEM_LOG (WARNING)
287289 << " Failed to arbitrate sufficient memory for memory pool "
288290 << requestor->name () << " , request " << succinctBytes (targetBytes)
289- << " , only " << succinctBytes (freedBytes )
291+ << " , only " << succinctBytes (unusedFreedBytes )
290292 << " has been freed, Arbitrator state: " << toString ();
291293 return false ;
292294 }
293295
294- const uint64_t bytesToGrow = std::min (freedBytes, growTarget);
295- requestor->grow (bytesToGrow);
296- freedBytes -= bytesToGrow;
296+ if (unusedFreedBytes > growTarget) {
297+ requestor->grow (growTarget);
298+ unusedFreedBytes -= growTarget;
299+ return true ;
300+ }
301+ requestor->grow (unusedFreedBytes);
302+ unusedFreedBytes = 0 ;
297303 return true ;
298304}
299305
@@ -314,7 +320,9 @@ uint64_t SharedArbitrator::reclaimFreeMemoryFromCandidates(
314320 if (bytesToShrink <= 0 ) {
315321 break ;
316322 }
317- freedBytes += candidate.pool ->shrink (bytesToShrink);
323+ uint64_t shrunk = candidate.pool ->shrink (bytesToShrink);
324+ incrementFreeCapacity (shrunk);
325+ freedBytes += shrunk;
318326 if (freedBytes >= targetBytes) {
319327 break ;
320328 }
@@ -354,6 +362,7 @@ uint64_t SharedArbitrator::reclaim(
354362 uint64_t freedBytes{0 };
355363 try {
356364 freedBytes = pool->shrink (targetBytes);
365+ incrementFreeCapacity (freedBytes);
357366 if (freedBytes < targetBytes) {
358367 pool->reclaim (targetBytes - freedBytes);
359368 }
@@ -363,7 +372,7 @@ uint64_t SharedArbitrator::reclaim(
363372 abort (pool);
364373 // Free up all the free capacity from the aborted pool as the associated
365374 // query has failed at this point.
366- pool->shrink ();
375+ incrementFreeCapacity ( pool->shrink () );
367376 }
368377 const uint64_t newCapacity = pool->capacity ();
369378 VELOX_CHECK_GE (oldCapacity, newCapacity);
0 commit comments