Uploaded image for project: 'Kafka'
  1. Kafka
  2. KAFKA-4293

ByteBufferMessageSet.deepIterator burns CPU catching EOFExceptions

Attach filesAttach ScreenshotAdd voteVotersWatch issueWatchersCreate sub-taskLinkCloneUpdate Comment AuthorReplace String in CommentUpdate Comment VisibilityDelete Comments
    XMLWordPrintableJSON

Details

    • Bug
    • Status: Open
    • Major
    • Resolution: Unresolved
    • 0.10.0.1
    • None
    • core
    • None

    Description

      around line 110:

      try {
          while (true)
              innerMessageAndOffsets.add(readMessageFromStream(compressed))
      } catch {
          case eofe: EOFException =>
          // we don't do anything at all here, because the finally
          // will close the compressed input stream, and we simply
          // want to return the innerMessageAndOffsets
      

      the only indication the code has that the end of the oteration was reached is by catching EOFException (which will be thrown inside readMessageFromStream()).

      profiling runs performed at linkedIn show 10% of the total broker CPU time taken up by Throwable.fillInStack() because of this behaviour.

      unfortunately InputStream.available() cannot be relied upon (concrete example - GZipInputStream will not correctly return 0) so the fix would probably be a wire format change to also encode the number of messages.

      Attachments

        Issue Links

        Activity

          This comment will be Viewable by All Users Viewable by All Users
          Cancel

          People

            radai Radai Rosenblatt
            radai Radai Rosenblatt

            Dates

              Created:
              Updated:

              Slack

                Issue deployment