@Test public void partitionIdsGreaterThanMaximumPartitionIdWillOverflowOrTriggerError() { PackedRecordPointer packedPointer = new PackedRecordPointer(); try { // Pointers greater than the maximum partition ID will overflow or trigger an assertion error packedPointer.set(PackedRecordPointer.packPointer(0, MAXIMUM_PARTITION_ID + 1)); assertFalse(MAXIMUM_PARTITION_ID + 1 == packedPointer.getPartitionId()); } catch (AssertionError e ) { // pass } }
while (sortedRecords.hasNext()) { sortedRecords.loadNext(); final int partition = sortedRecords.packedRecordPointer.getPartitionId(); assert (partition >= currentPartition); if (partition != currentPartition) { final long recordPointer = sortedRecords.packedRecordPointer.getRecordPointer(); final Object recordPage = taskMemoryManager.getPage(recordPointer); final long recordOffsetInPage = taskMemoryManager.getOffsetInPage(recordPointer);
@Override public int compare(PackedRecordPointer left, PackedRecordPointer right) { int leftId = left.getPartitionId(); int rightId = right.getPartitionId(); return leftId < rightId ? -1 : (leftId > rightId ? 1 : 0); } }
public void loadNext() { packedRecordPointer.set(pointerArray.get(position)); position++; } }
@Override public PackedRecordPointer newKey() { return new PackedRecordPointer(); }
/** * Inserts a record to be sorted. * * @param recordPointer a pointer to the record, encoded by the task memory manager. Due to * certain pointer compression techniques used by the sorter, the sort can * only operate on pointers that point to locations in the first * {@link PackedRecordPointer#MAXIMUM_PAGE_SIZE_BYTES} bytes of a data page. * @param partitionId the partition id, which must be less than or equal to * {@link PackedRecordPointer#MAXIMUM_PARTITION_ID}. */ public void insertRecord(long recordPointer, int partitionId) { if (!hasSpaceForAnotherRecord()) { throw new IllegalStateException("There is no space for new record"); } array.set(pos, PackedRecordPointer.packPointer(recordPointer, partitionId)); pos++; }
while (sortedRecords.hasNext()) { sortedRecords.loadNext(); final int partition = sortedRecords.packedRecordPointer.getPartitionId(); assert (partition >= currentPartition); if (partition != currentPartition) { final long recordPointer = sortedRecords.packedRecordPointer.getRecordPointer(); final Object recordPage = taskMemoryManager.getPage(recordPointer); final long recordOffsetInPage = taskMemoryManager.getOffsetInPage(recordPointer);
@Override public int compare(PackedRecordPointer left, PackedRecordPointer right) { int leftId = left.getPartitionId(); int rightId = right.getPartitionId(); return leftId < rightId ? -1 : (leftId > rightId ? 1 : 0); } }
@Override public PackedRecordPointer getKey(LongArray data, int pos, PackedRecordPointer reuse) { reuse.set(data.get(pos)); return reuse; }
@Override public PackedRecordPointer newKey() { return new PackedRecordPointer(); }
/** * Inserts a record to be sorted. * * @param recordPointer a pointer to the record, encoded by the task memory manager. Due to * certain pointer compression techniques used by the sorter, the sort can * only operate on pointers that point to locations in the first * {@link PackedRecordPointer#MAXIMUM_PAGE_SIZE_BYTES} bytes of a data page. * @param partitionId the partition id, which must be less than or equal to * {@link PackedRecordPointer#MAXIMUM_PARTITION_ID}. */ public void insertRecord(long recordPointer, int partitionId) { if (!hasSpaceForAnotherRecord()) { throw new IllegalStateException("There is no space for new record"); } array.set(pos, PackedRecordPointer.packPointer(recordPointer, partitionId)); pos++; }
@Test public void maximumPartitionIdCanBeEncoded() { PackedRecordPointer packedPointer = new PackedRecordPointer(); packedPointer.set(PackedRecordPointer.packPointer(0, MAXIMUM_PARTITION_ID)); assertEquals(MAXIMUM_PARTITION_ID, packedPointer.getPartitionId()); }
while (sortedRecords.hasNext()) { sortedRecords.loadNext(); final int partition = sortedRecords.packedRecordPointer.getPartitionId(); assert (partition >= currentPartition); if (partition != currentPartition) { final long recordPointer = sortedRecords.packedRecordPointer.getRecordPointer(); final Object recordPage = taskMemoryManager.getPage(recordPointer); final long recordOffsetInPage = taskMemoryManager.getOffsetInPage(recordPointer);
@Override public int compare(PackedRecordPointer left, PackedRecordPointer right) { int leftId = left.getPartitionId(); int rightId = right.getPartitionId(); return leftId < rightId ? -1 : (leftId > rightId ? 1 : 0); } }
@Override public PackedRecordPointer getKey(LongArray data, int pos, PackedRecordPointer reuse) { reuse.set(data.get(pos)); return reuse; }
@Override public PackedRecordPointer newKey() { return new PackedRecordPointer(); }
/** * Inserts a record to be sorted. * * @param recordPointer a pointer to the record, encoded by the task memory manager. Due to * certain pointer compression techniques used by the sorter, the sort can * only operate on pointers that point to locations in the first * {@link PackedRecordPointer#MAXIMUM_PAGE_SIZE_BYTES} bytes of a data page. * @param partitionId the partition id, which must be less than or equal to * {@link PackedRecordPointer#MAXIMUM_PARTITION_ID}. */ public void insertRecord(long recordPointer, int partitionId) { if (!hasSpaceForAnotherRecord()) { throw new IllegalStateException("There is no space for new record"); } array.set(pos, PackedRecordPointer.packPointer(recordPointer, partitionId)); pos++; }
@Test public void maximumPartitionIdCanBeEncoded() { PackedRecordPointer packedPointer = new PackedRecordPointer(); packedPointer.set(PackedRecordPointer.packPointer(0, MAXIMUM_PARTITION_ID)); assertEquals(MAXIMUM_PARTITION_ID, packedPointer.getPartitionId()); }
Assert.assertTrue(iter.hasNext()); iter.loadNext(); final int partitionId = iter.packedRecordPointer.getPartitionId(); Assert.assertTrue(partitionId >= 0 && partitionId <= 3); Assert.assertTrue("Partition id " + partitionId + " should be >= prev id " + prevPartitionId, partitionId >= prevPartitionId); final long recordAddress = iter.packedRecordPointer.getRecordPointer(); final int recordLength = Platform.getInt( memoryManager.getPage(recordAddress), memoryManager.getOffsetInPage(recordAddress));
@Test public void testSortingManyNumbers() throws Exception { ShuffleInMemorySorter sorter = new ShuffleInMemorySorter(consumer, 4, shouldUseRadixSort()); int[] numbersToSort = new int[128000]; Random random = new Random(16); for (int i = 0; i < numbersToSort.length; i++) { if (!sorter.hasSpaceForAnotherRecord()) { sorter.expandPointerArray(consumer.allocateArray(sorter.getMemoryUsage() / 8 * 2)); } numbersToSort[i] = random.nextInt(PackedRecordPointer.MAXIMUM_PARTITION_ID + 1); sorter.insertRecord(0, numbersToSort[i]); } Arrays.sort(numbersToSort); int[] sorterResult = new int[numbersToSort.length]; ShuffleInMemorySorter.ShuffleSorterIterator iter = sorter.getSortedIterator(); int j = 0; while (iter.hasNext()) { iter.loadNext(); sorterResult[j] = iter.packedRecordPointer.getPartitionId(); j += 1; } Assert.assertArrayEquals(numbersToSort, sorterResult); } }