Uploaded image for project: 'Apache Cassandra'
  1. Apache Cassandra
  2. CASSANDRA-7664

IndexOutOfBoundsException thrown during repair

Agile BoardAttach filesAttach ScreenshotBulk Copy AttachmentsBulk Move AttachmentsVotersWatch issueWatchersCreate sub-taskConvert to sub-taskMoveLinkCloneLabelsUpdate Comment AuthorReplace String in CommentUpdate Comment VisibilityDelete Comments
    XMLWordPrintableJSON

Details

    • Bug
    • Status: Resolved
    • Normal
    • Resolution: Fixed
    • 2.0.10
    • None
    • None
    • RHEL 6.1
      Casandra 1.2.3 - 1.2.18

    • Normal

    Description

      I was running repair command with moderate read and write load at the same time. And I found tens of IndexOutOfBoundsException in system log as follows:

      ERROR [Thread-6056] 2013-05-22 14:47:59,416 CassandraDaemon.java (line132) Exception in thread Thread[Thread-6056,5,main]
      java.lang.IndexOutOfBoundsException
      at sun.nio.ch.ChannelInputStream.read(ChannelInputStream.java:75)
      at org.apache.cassandra.streaming.compress.CompressedInputStream$Reader.runMayThrow(CompressedInputStream.java:151)
      at org.apache.cassandra.utils.WrappedRunnable.run(WrappedRunnable.java:28)
      at java.lang.Thread.run(Thread.java:662)

      I read the source code of CompressedInputStream.java and found there surely will throw IndexOutOfBoundsException in the following situation:

      CompressedInputStream.java
      // Part of CompressedInputStream.java start from Line 139
              protected void runMayThrow() throws Exception
              {
                  byte[] compressedWithCRC;
                  while (chunks.hasNext())
                  {
                      CompressionMetadata.Chunk chunk = chunks.next();
      
                      int readLength = chunk.length + 4; // read with CRC
                      compressedWithCRC = new byte[readLength];
      
                      int bufferRead = 0;
                      while (bufferRead < readLength)
                          bufferRead += source.read(compressedWithCRC, bufferRead, readLength - bufferRead);
                      dataBuffer.put(compressedWithCRC);
                  }
              }
      

      If read function read nothing because the end of the stream has been reached, it will return -1, thus bufferRead can be negetive. In the next circle, read function will throw IndexOutOfBoundsException because bufferRead is negetive.

      Attachments

        Activity

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

          People

            marcuse Marcus Eriksson Assign to me
            zhongyu09 Yu Zhong
            Marcus Eriksson
            Yuki Morishita
            Votes:
            2 Vote for this issue
            Watchers:
            5 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved:

              Slack

                Issue deployment