This is an automated email from the ASF dual-hosted git repository.

vvivekiyer pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/pinot.git


The following commit(s) were added to refs/heads/master by this push:
     new dbb6e30298 Fix potential int overflow issue for memory allocation of 
indices in segment-local module (#13717)
dbb6e30298 is described below

commit dbb6e30298e4983b5fa206d29aa5fe7a5c186cba
Author: Sajjad Moradi <moradi.saj...@gmail.com>
AuthorDate: Wed Aug 7 09:05:05 2024 -0700

    Fix potential int overflow issue for memory allocation of indices in 
segment-local module (#13717)
    
    * Add proper error message for handling large forward index size
    
    * Fix all potential INT overflow issues in segment local module
    
    * fix linter issues
---
 .../impl/FixedByteSingleValueMultiColumnReaderWriter.java      |  6 +++---
 .../local/io/writer/impl/FixedByteChunkForwardIndexWriter.java |  2 +-
 .../realtime/impl/dictionary/BaseOffHeapMutableDictionary.java |  2 +-
 .../realtime/impl/forward/FixedByteSVMutableForwardIndex.java  |  2 +-
 .../local/segment/creator/impl/inv/RangeIndexCreator.java      |  4 ++--
 .../index/readers/forward/BaseChunkForwardIndexReader.java     |  4 ++--
 .../index/readers/forward/FixedBitMVForwardIndexReader.java    |  2 +-
 .../readers/forward/VarByteChunkSVForwardIndexReader.java      | 10 ++++++----
 .../segment/index/readers/sorted/SortedIndexReaderImpl.java    |  2 +-
 .../local/startree/v2/builder/OffHeapSingleTreeBuilder.java    | 10 +++++-----
 10 files changed, 23 insertions(+), 21 deletions(-)

diff --git 
a/pinot-segment-local/src/main/java/org/apache/pinot/segment/local/io/readerwriter/impl/FixedByteSingleValueMultiColumnReaderWriter.java
 
b/pinot-segment-local/src/main/java/org/apache/pinot/segment/local/io/readerwriter/impl/FixedByteSingleValueMultiColumnReaderWriter.java
index 2084a45373..601b09a251 100644
--- 
a/pinot-segment-local/src/main/java/org/apache/pinot/segment/local/io/readerwriter/impl/FixedByteSingleValueMultiColumnReaderWriter.java
+++ 
b/pinot-segment-local/src/main/java/org/apache/pinot/segment/local/io/readerwriter/impl/FixedByteSingleValueMultiColumnReaderWriter.java
@@ -43,10 +43,10 @@ public class FixedByteSingleValueMultiColumnReaderWriter 
implements Closeable {
 
   private final int[] _columnSizesInBytes;
   private final PinotDataBufferMemoryManager _memoryManager;
-  private String _allocationContext;
+  private final String _allocationContext;
   private final long _chunkSizeInBytes;
   private int _capacityInRows;
-  private int _numColumns;
+  private final int _numColumns;
 
   /**
    * Constructor for the class.
@@ -74,7 +74,7 @@ public class FixedByteSingleValueMultiColumnReaderWriter 
implements Closeable {
     }
 
     _numColumns = _columnSizesInBytes.length;
-    _chunkSizeInBytes = rowSizeInBytes * numRowsPerChunk;
+    _chunkSizeInBytes = (long) rowSizeInBytes * numRowsPerChunk;
   }
 
   public int getInt(int row, int column) {
diff --git 
a/pinot-segment-local/src/main/java/org/apache/pinot/segment/local/io/writer/impl/FixedByteChunkForwardIndexWriter.java
 
b/pinot-segment-local/src/main/java/org/apache/pinot/segment/local/io/writer/impl/FixedByteChunkForwardIndexWriter.java
index 11a250791b..8b517a84f9 100644
--- 
a/pinot-segment-local/src/main/java/org/apache/pinot/segment/local/io/writer/impl/FixedByteChunkForwardIndexWriter.java
+++ 
b/pinot-segment-local/src/main/java/org/apache/pinot/segment/local/io/writer/impl/FixedByteChunkForwardIndexWriter.java
@@ -49,7 +49,7 @@ public class FixedByteChunkForwardIndexWriter extends 
BaseChunkForwardIndexWrite
       int numDocsPerChunk, int sizeOfEntry, int writerVersion)
       throws IOException {
     super(file, compressionType, totalDocs, 
normalizeDocsPerChunk(writerVersion, numDocsPerChunk),
-        (sizeOfEntry * normalizeDocsPerChunk(writerVersion, numDocsPerChunk)), 
sizeOfEntry, writerVersion, true);
+        (long) sizeOfEntry * normalizeDocsPerChunk(writerVersion, 
numDocsPerChunk), sizeOfEntry, writerVersion, true);
     _chunkDataOffset = 0;
   }
 
diff --git 
a/pinot-segment-local/src/main/java/org/apache/pinot/segment/local/realtime/impl/dictionary/BaseOffHeapMutableDictionary.java
 
b/pinot-segment-local/src/main/java/org/apache/pinot/segment/local/realtime/impl/dictionary/BaseOffHeapMutableDictionary.java
index ae50758e42..3fca1354bd 100644
--- 
a/pinot-segment-local/src/main/java/org/apache/pinot/segment/local/realtime/impl/dictionary/BaseOffHeapMutableDictionary.java
+++ 
b/pinot-segment-local/src/main/java/org/apache/pinot/segment/local/realtime/impl/dictionary/BaseOffHeapMutableDictionary.java
@@ -420,7 +420,7 @@ public abstract class BaseOffHeapMutableDictionary 
implements MutableDictionary
     ValueToDictId valueToDictId = _valueToDict;
     long size = 0;
     for (IntBuffer iBuf : valueToDictId._iBufList) {
-      size = size + iBuf.capacity() * Integer.BYTES;
+      size = size + (long) iBuf.capacity() * Integer.BYTES;
     }
     return size;
   }
diff --git 
a/pinot-segment-local/src/main/java/org/apache/pinot/segment/local/realtime/impl/forward/FixedByteSVMutableForwardIndex.java
 
b/pinot-segment-local/src/main/java/org/apache/pinot/segment/local/realtime/impl/forward/FixedByteSVMutableForwardIndex.java
index 7ceab2a941..8c25bb0706 100644
--- 
a/pinot-segment-local/src/main/java/org/apache/pinot/segment/local/realtime/impl/forward/FixedByteSVMutableForwardIndex.java
+++ 
b/pinot-segment-local/src/main/java/org/apache/pinot/segment/local/realtime/impl/forward/FixedByteSVMutableForwardIndex.java
@@ -81,7 +81,7 @@ public class FixedByteSVMutableForwardIndex implements 
MutableForwardIndex {
       _valueSizeInBytes = storedType.size();
     }
     _numRowsPerChunk = numRowsPerChunk;
-    _chunkSizeInBytes = numRowsPerChunk * _valueSizeInBytes;
+    _chunkSizeInBytes = (long) numRowsPerChunk * _valueSizeInBytes;
     _memoryManager = memoryManager;
     _allocationContext = allocationContext;
     addBuffer();
diff --git 
a/pinot-segment-local/src/main/java/org/apache/pinot/segment/local/segment/creator/impl/inv/RangeIndexCreator.java
 
b/pinot-segment-local/src/main/java/org/apache/pinot/segment/local/segment/creator/impl/inv/RangeIndexCreator.java
index e1c5479214..a97c45fec6 100644
--- 
a/pinot-segment-local/src/main/java/org/apache/pinot/segment/local/segment/creator/impl/inv/RangeIndexCreator.java
+++ 
b/pinot-segment-local/src/main/java/org/apache/pinot/segment/local/segment/creator/impl/inv/RangeIndexCreator.java
@@ -347,7 +347,7 @@ public final class RangeIndexCreator implements 
CombinedInvertedIndexCreator {
         Number rangeStart = _numberValueBuffer.get(range.getLeft());
         writeNumberToHeader(header, rangeStart);
       }
-      bytesWritten += ranges.size() * _valueType.size(); // Range start values
+      bytesWritten += (long) ranges.size() * _valueType.size(); // Range start 
values
 
       Number lastRangeEnd = _numberValueBuffer.get(ranges.get(ranges.size() - 
1).getRight());
       writeNumberToHeader(header, lastRangeEnd);
@@ -355,7 +355,7 @@ public final class RangeIndexCreator implements 
CombinedInvertedIndexCreator {
 
       //compute the offset where the bitmap for the first range would be 
written
       //bitmap start offset for each range, one extra to make it easy to get 
the length for last one.
-      long bitmapOffsetHeaderSize = (ranges.size() + 1) * Long.BYTES;
+      long bitmapOffsetHeaderSize = (long) (ranges.size() + 1) * Long.BYTES;
 
       long bitmapOffset = bytesWritten + bitmapOffsetHeaderSize;
       header.writeLong(bitmapOffset);
diff --git 
a/pinot-segment-local/src/main/java/org/apache/pinot/segment/local/segment/index/readers/forward/BaseChunkForwardIndexReader.java
 
b/pinot-segment-local/src/main/java/org/apache/pinot/segment/local/segment/index/readers/forward/BaseChunkForwardIndexReader.java
index 745bd18fde..80ed58a416 100644
--- 
a/pinot-segment-local/src/main/java/org/apache/pinot/segment/local/segment/index/readers/forward/BaseChunkForwardIndexReader.java
+++ 
b/pinot-segment-local/src/main/java/org/apache/pinot/segment/local/segment/index/readers/forward/BaseChunkForwardIndexReader.java
@@ -241,10 +241,10 @@ public abstract class BaseChunkForwardIndexReader 
implements ForwardIndexReader<
 
   protected long getChunkPositionAndRecordRanges(int chunkId, List<ByteRange> 
ranges) {
     if (_headerEntryChunkOffsetSize == Integer.BYTES) {
-      ranges.add(new ByteRange(_dataHeaderStart + chunkId * 
_headerEntryChunkOffsetSize, Integer.BYTES));
+      ranges.add(new ByteRange(_dataHeaderStart + (long) chunkId * 
_headerEntryChunkOffsetSize, Integer.BYTES));
       return _dataHeader.getInt(chunkId * _headerEntryChunkOffsetSize);
     } else {
-      ranges.add(new ByteRange(_dataHeaderStart + chunkId * 
_headerEntryChunkOffsetSize, Long.BYTES));
+      ranges.add(new ByteRange(_dataHeaderStart + (long) chunkId * 
_headerEntryChunkOffsetSize, Long.BYTES));
       return _dataHeader.getLong(chunkId * _headerEntryChunkOffsetSize);
     }
   }
diff --git 
a/pinot-segment-local/src/main/java/org/apache/pinot/segment/local/segment/index/readers/forward/FixedBitMVForwardIndexReader.java
 
b/pinot-segment-local/src/main/java/org/apache/pinot/segment/local/segment/index/readers/forward/FixedBitMVForwardIndexReader.java
index 983de9c6b9..ddb9436c76 100644
--- 
a/pinot-segment-local/src/main/java/org/apache/pinot/segment/local/segment/index/readers/forward/FixedBitMVForwardIndexReader.java
+++ 
b/pinot-segment-local/src/main/java/org/apache/pinot/segment/local/segment/index/readers/forward/FixedBitMVForwardIndexReader.java
@@ -68,7 +68,7 @@ public final class FixedBitMVForwardIndexReader implements 
ForwardIndexReader<Fi
     _numValues = numValues;
     _numDocsPerChunk = (int) (Math.ceil((float) PREFERRED_NUM_VALUES_PER_CHUNK 
/ (numValues / numDocs)));
     int numChunks = (numDocs + _numDocsPerChunk - 1) / _numDocsPerChunk;
-    long endOffset = numChunks * Integer.BYTES;
+    long endOffset = (long) numChunks * Integer.BYTES;
     _bitmapReaderStartOffset = endOffset;
     _chunkOffsetReader = new FixedByteValueReaderWriter(dataBuffer.view(0L, 
endOffset));
     int bitmapSize = (numValues + Byte.SIZE - 1) / Byte.SIZE;
diff --git 
a/pinot-segment-local/src/main/java/org/apache/pinot/segment/local/segment/index/readers/forward/VarByteChunkSVForwardIndexReader.java
 
b/pinot-segment-local/src/main/java/org/apache/pinot/segment/local/segment/index/readers/forward/VarByteChunkSVForwardIndexReader.java
index 585d48d7ea..651f7bcdcb 100644
--- 
a/pinot-segment-local/src/main/java/org/apache/pinot/segment/local/segment/index/readers/forward/VarByteChunkSVForwardIndexReader.java
+++ 
b/pinot-segment-local/src/main/java/org/apache/pinot/segment/local/segment/index/readers/forward/VarByteChunkSVForwardIndexReader.java
@@ -99,7 +99,8 @@ public final class VarByteChunkSVForwardIndexReader extends 
BaseChunkForwardInde
 
     // These offsets are offset in the data buffer
     long chunkStartOffset = getChunkPosition(chunkId);
-    long valueStartOffset = chunkStartOffset + 
_dataBuffer.getInt(chunkStartOffset + chunkRowId * ROW_OFFSET_SIZE);
+    long valueStartOffset =
+        chunkStartOffset + _dataBuffer.getInt(chunkStartOffset + (long) 
chunkRowId * ROW_OFFSET_SIZE);
     long valueEndOffset = getValueEndOffset(chunkId, chunkRowId, 
chunkStartOffset);
 
     int length = (int) (valueEndOffset - valueStartOffset);
@@ -152,7 +153,8 @@ public final class VarByteChunkSVForwardIndexReader extends 
BaseChunkForwardInde
 
     // These offsets are offset in the data buffer
     long chunkStartOffset = getChunkPosition(chunkId);
-    long valueStartOffset = chunkStartOffset + 
_dataBuffer.getInt(chunkStartOffset + chunkRowId * ROW_OFFSET_SIZE);
+    long valueStartOffset =
+        chunkStartOffset + _dataBuffer.getInt(chunkStartOffset + (long) 
chunkRowId * ROW_OFFSET_SIZE);
     long valueEndOffset = getValueEndOffset(chunkId, chunkRowId, 
chunkStartOffset);
 
     byte[] bytes = new byte[(int) (valueEndOffset - valueStartOffset)];
@@ -188,7 +190,7 @@ public final class VarByteChunkSVForwardIndexReader extends 
BaseChunkForwardInde
         // Last row in the last chunk
         return _dataBuffer.size();
       } else {
-        int valueEndOffsetInChunk = _dataBuffer.getInt(chunkStartOffset + 
(chunkRowId + 1) * ROW_OFFSET_SIZE);
+        int valueEndOffsetInChunk = _dataBuffer.getInt(chunkStartOffset + 
(long) (chunkRowId + 1) * ROW_OFFSET_SIZE);
         if (valueEndOffsetInChunk == 0) {
           // Last row in the last chunk (chunk is incomplete, which stores 0 
as the offset for the absent rows)
           return _dataBuffer.size();
@@ -201,7 +203,7 @@ public final class VarByteChunkSVForwardIndexReader extends 
BaseChunkForwardInde
         // Last row in the chunk
         return getChunkPosition(chunkId + 1);
       } else {
-        return chunkStartOffset + _dataBuffer.getInt(chunkStartOffset + 
(chunkRowId + 1) * ROW_OFFSET_SIZE);
+        return chunkStartOffset + _dataBuffer.getInt(chunkStartOffset + (long) 
(chunkRowId + 1) * ROW_OFFSET_SIZE);
       }
     }
   }
diff --git 
a/pinot-segment-local/src/main/java/org/apache/pinot/segment/local/segment/index/readers/sorted/SortedIndexReaderImpl.java
 
b/pinot-segment-local/src/main/java/org/apache/pinot/segment/local/segment/index/readers/sorted/SortedIndexReaderImpl.java
index e508b0d013..014d85bcd4 100644
--- 
a/pinot-segment-local/src/main/java/org/apache/pinot/segment/local/segment/index/readers/sorted/SortedIndexReaderImpl.java
+++ 
b/pinot-segment-local/src/main/java/org/apache/pinot/segment/local/segment/index/readers/sorted/SortedIndexReaderImpl.java
@@ -36,7 +36,7 @@ public class SortedIndexReaderImpl implements 
SortedIndexReader<SortedIndexReade
 
   public SortedIndexReaderImpl(PinotDataBuffer dataBuffer, int cardinality) {
     // 2 values per dictionary id
-    Preconditions.checkState(dataBuffer.size() == 2 * cardinality * 
Integer.BYTES);
+    Preconditions.checkState(dataBuffer.size() == 2L * cardinality * 
Integer.BYTES);
     _reader = new FixedByteValueReaderWriter(dataBuffer);
     _cardinality = cardinality;
   }
diff --git 
a/pinot-segment-local/src/main/java/org/apache/pinot/segment/local/startree/v2/builder/OffHeapSingleTreeBuilder.java
 
b/pinot-segment-local/src/main/java/org/apache/pinot/segment/local/startree/v2/builder/OffHeapSingleTreeBuilder.java
index 49a72eedf6..258b5e77ec 100644
--- 
a/pinot-segment-local/src/main/java/org/apache/pinot/segment/local/startree/v2/builder/OffHeapSingleTreeBuilder.java
+++ 
b/pinot-segment-local/src/main/java/org/apache/pinot/segment/local/startree/v2/builder/OffHeapSingleTreeBuilder.java
@@ -172,7 +172,7 @@ public class OffHeapSingleTreeBuilder extends 
BaseSingleTreeBuilder {
   int getDimensionValue(int docId, int dimensionId)
       throws IOException {
     ensureBufferReadable(docId);
-    return _starTreeRecordBuffer.getInt(_starTreeRecordOffsets.get(docId) + 
dimensionId * Integer.BYTES);
+    return _starTreeRecordBuffer.getInt(_starTreeRecordOffsets.get(docId) + 
(long) dimensionId * Integer.BYTES);
   }
 
   private void ensureBufferReadable(int docId)
@@ -219,8 +219,8 @@ public class OffHeapSingleTreeBuilder extends 
BaseSingleTreeBuilder {
         long offset1 = (long) sortedDocIds[i1] * _numDimensions * 
Integer.BYTES;
         long offset2 = (long) sortedDocIds[i2] * _numDimensions * 
Integer.BYTES;
         for (int i = 0; i < _numDimensions; i++) {
-          int dimension1 = dataBuffer.getInt(offset1 + i * Integer.BYTES);
-          int dimension2 = dataBuffer.getInt(offset2 + i * Integer.BYTES);
+          int dimension1 = dataBuffer.getInt(offset1 + (long) i * 
Integer.BYTES);
+          int dimension2 = dataBuffer.getInt(offset2 + (long) i * 
Integer.BYTES);
           if (dimension1 != dimension2) {
             return dimension1 - dimension2;
           }
@@ -282,8 +282,8 @@ public class OffHeapSingleTreeBuilder extends 
BaseSingleTreeBuilder {
       long offset1 = _starTreeRecordOffsets.get(sortedDocIds[i1]);
       long offset2 = _starTreeRecordOffsets.get(sortedDocIds[i2]);
       for (int i = dimensionId + 1; i < _numDimensions; i++) {
-        int dimension1 = _starTreeRecordBuffer.getInt(offset1 + i * 
Integer.BYTES);
-        int dimension2 = _starTreeRecordBuffer.getInt(offset2 + i * 
Integer.BYTES);
+        int dimension1 = _starTreeRecordBuffer.getInt(offset1 + (long) i * 
Integer.BYTES);
+        int dimension2 = _starTreeRecordBuffer.getInt(offset2 + (long) i * 
Integer.BYTES);
         if (dimension1 != dimension2) {
           return dimension1 - dimension2;
         }


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@pinot.apache.org
For additional commands, e-mail: commits-h...@pinot.apache.org

Reply via email to