@@ -71,6 +71,7 @@ public class PipeMemoryManager {
7171 private final Map <PipeIdentity , ArrayDeque <PipeRegionIdentity >>
7272 waitingTsFileParserRegionOrderByPipe = new HashMap <>();
7373 private final ArrayDeque <PipeIdentity > waitingTsFileParserPipeOrder = new ArrayDeque <>();
74+ private PipeIdentity lastAdmittedWaitingTsFileParserPipe ;
7475
7576 // Only non-zero memory blocks will be added to this set.
7677 private final Set <PipeMemoryBlock > allocatedBlocks = new HashSet <>();
@@ -177,7 +178,8 @@ public synchronized boolean tryReserveTsFileParserMemory(
177178 final PipeIdentity pipeIdentity = new PipeIdentity (pipeName , creationTime );
178179 final PipeRegionIdentity pipeRegionIdentity =
179180 new PipeRegionIdentity (pipeIdentity , dataRegionId );
180- enqueueTsFileParserReservationRequest (pipeRegionIdentity , reservationKey );
181+ final boolean wasRequestAlreadyWaiting =
182+ enqueueTsFileParserReservationRequest (pipeRegionIdentity , reservationKey );
181183
182184 final int globalLimit = Math .max (1 , PIPE_CONFIG .getPipeTsFileParserInFlightMaxNum ());
183185 final int perPipeRegionLimit =
@@ -212,6 +214,9 @@ public synchronized boolean tryReserveTsFileParserMemory(
212214 }
213215
214216 removeTsFileParserReservationRequest (pipeRegionIdentity , reservationKey , true );
217+ if (wasRequestAlreadyWaiting ) {
218+ lastAdmittedWaitingTsFileParserPipe = pipeIdentity ;
219+ }
215220 reservedTsFileParserCount ++;
216221 reservedTsFileParserCountByPipe .merge (pipeIdentity , 1 , Integer ::sum );
217222 reservedTsFileParserCountByPipeRegion .put (pipeRegionIdentity , reservedCountOfPipeRegion + 1 );
@@ -262,10 +267,11 @@ public synchronized void releaseTsFileParserMemory(
262267 reservedTsFileParserCountByPipe .put (pipeIdentity , reservedCountOfPipe - 1 );
263268 }
264269 reservedTsFileParserCount --;
270+ clearTsFileParserAdmissionCursorIfIdle ();
265271 notifyNextTsFileParserMemoryReservationInternal ();
266272 }
267273
268- private void enqueueTsFileParserReservationRequest (
274+ private boolean enqueueTsFileParserReservationRequest (
269275 final PipeRegionIdentity pipeRegionIdentity ,
270276 final TsFileParserMemoryReservation reservationKey ) {
271277 final LinkedHashSet <TsFileParserMemoryReservation > requestsOfPipeRegion =
@@ -282,7 +288,7 @@ private void enqueueTsFileParserReservationRequest(
282288 regionOrder .addLast (key );
283289 return new LinkedHashSet <>();
284290 });
285- requestsOfPipeRegion .add (reservationKey );
291+ return ! requestsOfPipeRegion .add (reservationKey );
286292 }
287293
288294 public synchronized void notifyNextTsFileParserMemoryReservation () {
@@ -322,7 +328,14 @@ private void notifyNextTsFileParserMemoryReservationInternal() {
322328
323329 private PipeRegionIdentity getNextEligibleTsFileParserPipeRegion (
324330 final int perPipeRegionLimit , final boolean requirePipeWithoutReservedParser ) {
331+ PipeRegionIdentity firstEligiblePipeRegion = null ;
332+ boolean hasVisitedLastAdmittedPipe = lastAdmittedWaitingTsFileParserPipe == null ;
325333 for (final PipeIdentity pipeIdentity : waitingTsFileParserPipeOrder ) {
334+ final boolean isLastAdmittedPipe = pipeIdentity .equals (lastAdmittedWaitingTsFileParserPipe );
335+ if (isLastAdmittedPipe ) {
336+ hasVisitedLastAdmittedPipe = true ;
337+ }
338+
326339 // Under soft memory pressure, reserve the hard-threshold headroom for a pipe that has no
327340 // parser yet. Otherwise a busy pipe at the queue head can block every pipe behind it.
328341 if (requirePipeWithoutReservedParser
@@ -335,14 +348,32 @@ private PipeRegionIdentity getNextEligibleTsFileParserPipeRegion(
335348 if (regionOrder == null ) {
336349 continue ;
337350 }
351+ PipeRegionIdentity eligiblePipeRegion = null ;
338352 for (final PipeRegionIdentity pipeRegionIdentity : regionOrder ) {
339353 if (reservedTsFileParserCountByPipeRegion .getOrDefault (pipeRegionIdentity , 0 )
340354 < perPipeRegionLimit ) {
341- return pipeRegionIdentity ;
355+ eligiblePipeRegion = pipeRegionIdentity ;
356+ break ;
342357 }
343358 }
359+ if (eligiblePipeRegion == null ) {
360+ continue ;
361+ }
362+
363+ if (firstEligiblePipeRegion == null ) {
364+ firstEligiblePipeRegion = eligiblePipeRegion ;
365+ }
366+ if (hasVisitedLastAdmittedPipe && !isLastAdmittedPipe ) {
367+ return eligiblePipeRegion ;
368+ }
369+ }
370+ return firstEligiblePipeRegion ;
371+ }
372+
373+ private void clearTsFileParserAdmissionCursorIfIdle () {
374+ if (reservedTsFileParserCount == 0 && waitingTsFileParserPipeOrder .isEmpty ()) {
375+ lastAdmittedWaitingTsFileParserPipe = null ;
344376 }
345- return null ;
346377 }
347378
348379 private void removeTsFileParserReservationRequest (
@@ -365,6 +396,9 @@ private void removeTsFileParserReservationRequest(
365396 if (regionOrder .isEmpty ()) {
366397 waitingTsFileParserRegionOrderByPipe .remove (pipeIdentity );
367398 waitingTsFileParserPipeOrder .remove (pipeIdentity );
399+ if (!rotateAfterAdmission ) {
400+ clearTsFileParserAdmissionCursorIfIdle ();
401+ }
368402 return ;
369403 }
370404 }
@@ -376,6 +410,8 @@ private void removeTsFileParserReservationRequest(
376410 if (rotateAfterAdmission ) {
377411 waitingTsFileParserPipeOrder .remove (pipeIdentity );
378412 waitingTsFileParserPipeOrder .addLast (pipeIdentity );
413+ } else {
414+ clearTsFileParserAdmissionCursorIfIdle ();
379415 }
380416 }
381417
0 commit comments