aeron-client/src/main/java/io/aeron/logbuffer/TermUnblocker.java
public static Status unblock(
        final UnsafeBuffer logMetaDataBuffer,
        final UnsafeBuffer termBuffer,
        final int blockedOffset,
        final int tailOffset,
        final int termId)
    {
        Status status = NO_ACTION;
        int frameLength = frameLengthVolatile(termBuffer, blockedOffset);

        if (frameLength < 0)
        {
            resetHeader(logMetaDataBuffer, termBuffer, blockedOffset, termId, -frameLength);
            status = UNBLOCKED;
        }
        else if (0 == frameLength)
        {
            int currentOffset = blockedOffset + FRAME_ALIGNMENT;

            while (currentOffset < tailOffset)
            {
                frameLength = frameLengthVolatile(termBuffer, currentOffset);

                if (frameLength != 0)
                {
                    if (scanBackToConfirmZeroed(termBuffer, currentOffset, blockedOffset))
                    {
                        final int length = currentOffset - blockedOffset;
                        resetHeader(logMetaDataBuffer, termBuffer, blockedOffset, termId, length);
                        status = UNBLOCKED;
                    }

                    break;
                }

                currentOffset += FRAME_ALIGNMENT;
            }

            if (currentOffset == termBuffer.capacity())
            {
                if (0 == frameLengthVolatile(termBuffer, blockedOffset))
                {
                    final int length = currentOffset - blockedOffset;
                    resetHeader(logMetaDataBuffer, termBuffer, blockedOffset, termId, length);
                    status = UNBLOCKED_TO_END;
                }
            }
        }

        return status;
    }
public static Status unblock(
        final UnsafeBuffer logMetaDataBuffer,
        final UnsafeBuffer termBuffer,
        final int blockedOffset,
        final int tailOffset,
        final int termId)
    {
        Status status = NO_ACTION;
        int frameLength = frameLengthVolatile(termBuffer, blockedOffset);

        if (frameLength < 0)
        {
            resetHeader(logMetaDataBuffer, termBuffer, blockedOffset, termId, -frameLength);
            status = UNBLOCKED;
        }
        else if (0 == frameLength)
        {
            int currentOffset = blockedOffset + FRAME_ALIGNMENT;

            while (currentOffset < tailOffset)
            {
                frameLength = frameLengthVolatile(termBuffer, currentOffset);

                if (frameLength != 0)
                {
                    if (scanBackToConfirmZeroed(termBuffer, currentOffset, blockedOffset))
                    {
                        final int length = currentOffset - blockedOffset;
                        resetHeader(logMetaDataBuffer, termBuffer, blockedOffset, termId, length);
                        status = UNBLOCKED;
                    }

                    break;
                }

                currentOffset += FRAME_ALIGNMENT;
            }

            if (currentOffset == termBuffer.capacity())
            {
                if (0 == frameLengthVolatile(termBuffer, blockedOffset))
                {
                    final int length = currentOffset - blockedOffset;
                    resetHeader(logMetaDataBuffer, termBuffer, blockedOffset, termId, length);
                    status = UNBLOCKED_TO_END;
                }
            }
        }

        return status;
    }
public static Status unblock ( final UnsafeBuffer logMetaDataBuffer , final UnsafeBuffer termBuffer , final int blockedOffset , final int tailOffset , final int termId ) { Status status = NO_ACTION ; int frameLength = frameLengthVolatile ( termBuffer , blockedOffset ) ; if ( frameLength < 0 ) { resetHeader ( logMetaDataBuffer , termBuffer , blockedOffset , termId , - frameLength ) ; status = UNBLOCKED ; } else if ( 0 == frameLength ) { int currentOffset = blockedOffset + FRAME_ALIGNMENT ; while ( currentOffset < tailOffset ) { frameLength = frameLengthVolatile ( termBuffer , currentOffset ) ; if ( frameLength != 0 ) { if ( scanBackToConfirmZeroed ( termBuffer , currentOffset , blockedOffset ) ) { final int length = currentOffset - blockedOffset ; resetHeader ( logMetaDataBuffer , termBuffer , blockedOffset , termId , length ) ; status = UNBLOCKED ; } break ; } currentOffset += FRAME_ALIGNMENT ; } if ( currentOffset == termBuffer . capacity ( ) ) { if ( 0 == frameLengthVolatile ( termBuffer , blockedOffset ) ) { final int length = currentOffset - blockedOffset ; resetHeader ( logMetaDataBuffer , termBuffer , blockedOffset , termId , length ) ; status = UNBLOCKED_TO_END ; } } } return status ; }
Attempt to unblock the current term at the current offset.
<ol>
<li>Current position length is &gt; 0, then return</li>
<li>Current position length is 0, scan forward by frame alignment until, one of the following:
<ol>
<li>reach a non-0 length, unblock up to indicated position (check original frame length for non-0)</li>
<li>reach end of term and tail position &gt;= end of term, unblock up to end of term (check original
frame length for non-0)
</li>
<li>reach tail position &lt; end of term, do NOT unblock</li>
</ol>
</li>
</ol>

@param logMetaDataBuffer containing the default headers
@param termBuffer        to unblock
@param blockedOffset     to unblock at
@param tailOffset        to unblock up to
@param termId            for the current term.
@return whether unblocking was done, not done, or applied to end of term
Attempt to unblock the current term at the current offset . <ol > <li > Current position length is &gt ; 0 then return< / li > <li > Current position length is 0 scan forward by frame alignment until one of the following : <ol > <li > reach a non - 0 length unblock up to indicated position ( check original frame length for non - 0 ) < / li > <li > reach end of term and tail position &gt ; = end of term unblock up to end of term ( check original frame length for non - 0 ) < / li > <li > reach tail position &lt ; end of term do NOT unblock< / li > < / ol > < / li > < / ol >