|
24 | 24 | import java.util.Map; |
25 | 25 | import java.util.Map.Entry; |
26 | 26 | import java.util.Set; |
| 27 | +import java.util.concurrent.TimeUnit; |
27 | 28 | import java.util.concurrent.atomic.AtomicLong; |
28 | 29 | import java.util.concurrent.locks.ReentrantReadWriteLock; |
29 | 30 |
|
@@ -65,6 +66,7 @@ public class ShuffleBufferManager { |
65 | 66 | private static final Logger LOG = LoggerFactory.getLogger(ShuffleBufferManager.class); |
66 | 67 |
|
67 | 68 | private final ShuffleBufferType shuffleBufferType; |
| 69 | + private final int flushTryLockTimeout; |
68 | 70 | private ShuffleTaskManager shuffleTaskManager; |
69 | 71 | private final ShuffleFlushManager shuffleFlushManager; |
70 | 72 | private long capacity; |
@@ -150,7 +152,7 @@ public ShuffleBufferManager( |
150 | 152 | appBlockSizeMetricEnabled = |
151 | 153 | conf.getBoolean(ShuffleServerConf.APP_LEVEL_SHUFFLE_BLOCK_SIZE_METRIC_ENABLED); |
152 | 154 | shuffleBufferType = conf.get(ShuffleServerConf.SERVER_SHUFFLE_BUFFER_TYPE); |
153 | | - |
| 155 | + flushTryLockTimeout = conf.get(ShuffleServerConf.SERVER_SHUFFLE_FLUSH_TRYLOCK_TIMEOUT); |
154 | 156 | ShuffleServerMetrics.addLabeledCacheGauge( |
155 | 157 | BLOCK_COUNT_IN_BUFFER_POOL, |
156 | 158 | () -> |
@@ -597,30 +599,47 @@ private synchronized void flush(Map<String, Set<Integer>> requiredFlush) { |
597 | 599 | bufferPool.entrySet()) { |
598 | 600 | String appId = appIdToBuffers.getKey(); |
599 | 601 | if (requiredFlush.containsKey(appId)) { |
600 | | - for (Map.Entry<Integer, RangeMap<Integer, ShuffleBuffer>> shuffleIdToBuffers : |
601 | | - appIdToBuffers.getValue().entrySet()) { |
602 | | - int shuffleId = shuffleIdToBuffers.getKey(); |
603 | | - Set<Integer> requiredShuffleId = requiredFlush.get(appId); |
604 | | - if (requiredShuffleId != null && requiredShuffleId.contains(shuffleId)) { |
605 | | - for (Map.Entry<Range<Integer>, ShuffleBuffer> rangeEntry : |
606 | | - shuffleIdToBuffers.getValue().asMapOfRanges().entrySet()) { |
607 | | - Range<Integer> range = rangeEntry.getKey(); |
608 | | - ShuffleBuffer shuffleBuffer = rangeEntry.getValue(); |
609 | | - pickedFlushSize += shuffleBuffer.getEncodedLength(); |
610 | | - flushBuffer( |
611 | | - shuffleBuffer, |
612 | | - appId, |
613 | | - shuffleId, |
614 | | - range.lowerEndpoint(), |
615 | | - range.upperEndpoint(), |
616 | | - HugePartitionUtils.isHugePartition( |
617 | | - shuffleTaskManager, appId, shuffleId, range.lowerEndpoint())); |
618 | | - if (pickedFlushSize > expectedFlushSize) { |
619 | | - LOG.info("Already picked enough buffers to flush {} bytes", pickedFlushSize); |
620 | | - return; |
| 602 | + if (shuffleTaskManager.isAppExpired(appId)) { |
| 603 | + continue; |
| 604 | + } |
| 605 | + ReentrantReadWriteLock.ReadLock readLock = shuffleTaskManager.getAppReadLock(appId); |
| 606 | + boolean lockAcquired = false; |
| 607 | + try { |
| 608 | + lockAcquired = readLock.tryLock(flushTryLockTimeout, TimeUnit.MILLISECONDS); |
| 609 | + if (!lockAcquired) { |
| 610 | + continue; |
| 611 | + } |
| 612 | + for (Map.Entry<Integer, RangeMap<Integer, ShuffleBuffer>> shuffleIdToBuffers : |
| 613 | + appIdToBuffers.getValue().entrySet()) { |
| 614 | + int shuffleId = shuffleIdToBuffers.getKey(); |
| 615 | + Set<Integer> requiredShuffleId = requiredFlush.get(appId); |
| 616 | + if (requiredShuffleId != null && requiredShuffleId.contains(shuffleId)) { |
| 617 | + for (Map.Entry<Range<Integer>, ShuffleBuffer> rangeEntry : |
| 618 | + shuffleIdToBuffers.getValue().asMapOfRanges().entrySet()) { |
| 619 | + Range<Integer> range = rangeEntry.getKey(); |
| 620 | + ShuffleBuffer shuffleBuffer = rangeEntry.getValue(); |
| 621 | + pickedFlushSize += shuffleBuffer.getEncodedLength(); |
| 622 | + flushBuffer( |
| 623 | + shuffleBuffer, |
| 624 | + appId, |
| 625 | + shuffleId, |
| 626 | + range.lowerEndpoint(), |
| 627 | + range.upperEndpoint(), |
| 628 | + HugePartitionUtils.isHugePartition( |
| 629 | + shuffleTaskManager, appId, shuffleId, range.lowerEndpoint())); |
| 630 | + if (pickedFlushSize > expectedFlushSize) { |
| 631 | + LOG.info("Already picked enough buffers to flush {} bytes", pickedFlushSize); |
| 632 | + return; |
| 633 | + } |
621 | 634 | } |
622 | 635 | } |
623 | 636 | } |
| 637 | + } catch (InterruptedException e) { |
| 638 | + LOG.warn("Ignore the InterruptedException which should be caused by internal killed"); |
| 639 | + } finally { |
| 640 | + if (lockAcquired) { |
| 641 | + readLock.unlock(); |
| 642 | + } |
624 | 643 | } |
625 | 644 | } |
626 | 645 | } |
|
0 commit comments