-
Notifications
You must be signed in to change notification settings - Fork 1.3k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Marks end criteria reached for the segment if the Index cannot consume more rows #14479
Merged
Merged
Changes from all commits
Commits
Show all changes
48 commits
Select commit
Hold shift + click to select a range
f03043a
initial refactoring for handling threshold logic
noob-se7en 09d43d7
Adds logic for endCriteriaReached based upon numValues
noob-se7en 121d23a
add logic inside endCriteriaReached
noob-se7en 06523b6
renames var
noob-se7en f47cb08
renames constant
noob-se7en da8d691
nit
noob-se7en 2cff520
nit
noob-se7en 55bf033
refactors logic to inside of addNewRow
noob-se7en 4549e5c
remove comments
noob-se7en 36c5f0d
removes usage of map
noob-se7en c2f78cb
nit
noob-se7en 0acb3f6
fixes lint
noob-se7en 96e8663
nit
noob-se7en ea48ba0
refactoring
noob-se7en 58370ca
nit
noob-se7en fbc9c93
Adds test
noob-se7en 8722efc
Adds test
noob-se7en a1467b5
Adds test for realtimesegmentDataManager
noob-se7en 27c4443
lint
noob-se7en a2b95b6
refactors config
noob-se7en 6c3df28
resolves commit
noob-se7en c8f5ed2
changes log
noob-se7en ba59830
nit
noob-se7en 9f13ff1
nit
noob-se7en b1143d5
Adds test and minor refactoring
noob-se7en 33d40a5
nit
noob-se7en be8ab39
nit
noob-se7en 3a185dd
nit
noob-se7en d3a6ea2
fixes lint
noob-se7en ba07fc3
Addresses Pr comments
noob-se7en 69b7e32
nit
noob-se7en c60f1bd
nit
noob-se7en 5511e1f
refactors method name
noob-se7en ffa984d
nit
noob-se7en 783f8c0
nit
noob-se7en f9e4b9c
Fixes lint
noob-se7en 3e1dde2
fixes lint
noob-se7en ed32e3d
Addresses PR comment
noob-se7en e57d726
fix bug
noob-se7en 24243bd
removes reflection in test
noob-se7en 541a7d9
fix test
noob-se7en 9f67ce4
fixes lint
noob-se7en 65fcaab
fix log
noob-se7en e6c1f43
move log to debug
noob-se7en dbaaf5c
fixes test
noob-se7en d15a3fd
Addresses PR comment
noob-se7en 6960b5f
nit
noob-se7en eb3662f
nit
noob-se7en File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
194 changes: 194 additions & 0 deletions
194
...che/pinot/segment/local/indexsegment/mutable/MutableSegmentEntriesAboveThresholdTest.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,194 @@ | ||
/** | ||
* Licensed to the Apache Software Foundation (ASF) under one | ||
* or more contributor license agreements. See the NOTICE file | ||
* distributed with this work for additional information | ||
* regarding copyright ownership. The ASF licenses this file | ||
* to you under the Apache License, Version 2.0 (the | ||
* "License"); you may not use this file except in compliance | ||
* with the License. You may obtain a copy of the License at | ||
* | ||
* http://www.apache.org/licenses/LICENSE-2.0 | ||
* | ||
* Unless required by applicable law or agreed to in writing, | ||
* software distributed under the License is distributed on an | ||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | ||
* KIND, either express or implied. See the License for the | ||
* specific language governing permissions and limitations | ||
* under the License. | ||
*/ | ||
package org.apache.pinot.segment.local.indexsegment.mutable; | ||
|
||
import java.io.File; | ||
import java.io.IOException; | ||
import java.lang.reflect.Field; | ||
import java.net.URL; | ||
import java.util.Collections; | ||
import java.util.Map; | ||
import org.apache.commons.io.FileUtils; | ||
import org.apache.pinot.segment.local.segment.creator.SegmentTestUtils; | ||
import org.apache.pinot.segment.local.segment.creator.impl.SegmentIndexCreationDriverImpl; | ||
import org.apache.pinot.segment.local.segment.index.forward.ForwardIndexPlugin; | ||
import org.apache.pinot.segment.local.segment.virtualcolumn.VirtualColumnProviderFactory; | ||
import org.apache.pinot.segment.spi.creator.SegmentGeneratorConfig; | ||
import org.apache.pinot.segment.spi.creator.SegmentIndexCreationDriver; | ||
import org.apache.pinot.segment.spi.index.IndexType; | ||
import org.apache.pinot.segment.spi.index.StandardIndexes; | ||
import org.apache.pinot.segment.spi.index.mutable.MutableForwardIndex; | ||
import org.apache.pinot.segment.spi.index.mutable.MutableIndex; | ||
import org.apache.pinot.spi.data.FieldSpec; | ||
import org.apache.pinot.spi.data.Schema; | ||
import org.apache.pinot.spi.data.readers.FileFormat; | ||
import org.apache.pinot.spi.data.readers.GenericRow; | ||
import org.apache.pinot.spi.data.readers.RecordReader; | ||
import org.apache.pinot.spi.data.readers.RecordReaderFactory; | ||
import org.apache.pinot.spi.stream.StreamMessageMetadata; | ||
import org.testng.Assert; | ||
import org.testng.annotations.Test; | ||
|
||
|
||
public class MutableSegmentEntriesAboveThresholdTest { | ||
private static final File TEMP_DIR = | ||
new File(FileUtils.getTempDirectory(), MutableSegmentEntriesAboveThresholdTest.class.getSimpleName()); | ||
private static final String AVRO_FILE = "data/test_data-mv.avro"; | ||
private Schema _schema; | ||
|
||
private static class FakeMutableForwardIndex implements MutableForwardIndex { | ||
|
||
private final MutableForwardIndex _mutableForwardIndex; | ||
private static final int THRESHOLD = 2; | ||
private int _numValues; | ||
|
||
FakeMutableForwardIndex(MutableForwardIndex mutableForwardIndex) { | ||
_mutableForwardIndex = mutableForwardIndex; | ||
_numValues = 0; | ||
} | ||
|
||
@Override | ||
public boolean canAddMore() { | ||
return _numValues < THRESHOLD; | ||
} | ||
|
||
@Override | ||
public void setDictIdMV(int docId, int[] dictIds) { | ||
_numValues += dictIds.length; | ||
_mutableForwardIndex.setDictIdMV(docId, dictIds); | ||
} | ||
|
||
@Override | ||
public int getLengthOfShortestElement() { | ||
return _mutableForwardIndex.getLengthOfShortestElement(); | ||
} | ||
|
||
@Override | ||
public int getLengthOfLongestElement() { | ||
return _mutableForwardIndex.getLengthOfLongestElement(); | ||
} | ||
|
||
@Override | ||
public void setDictId(int docId, int dictId) { | ||
_mutableForwardIndex.setDictId(docId, dictId); | ||
} | ||
|
||
@Override | ||
public boolean isDictionaryEncoded() { | ||
return _mutableForwardIndex.isDictionaryEncoded(); | ||
} | ||
|
||
@Override | ||
public boolean isSingleValue() { | ||
return _mutableForwardIndex.isSingleValue(); | ||
} | ||
|
||
@Override | ||
public FieldSpec.DataType getStoredType() { | ||
return _mutableForwardIndex.getStoredType(); | ||
} | ||
|
||
@Override | ||
public void close() | ||
throws IOException { | ||
_mutableForwardIndex.close(); | ||
} | ||
} | ||
|
||
private File getAvroFile() { | ||
URL resourceUrl = MutableSegmentImplTest.class.getClassLoader().getResource(AVRO_FILE); | ||
Assert.assertNotNull(resourceUrl); | ||
return new File(resourceUrl.getFile()); | ||
} | ||
|
||
private MutableSegmentImpl getMutableSegment(File avroFile) | ||
throws Exception { | ||
FileUtils.deleteQuietly(TEMP_DIR); | ||
|
||
SegmentGeneratorConfig config = | ||
SegmentTestUtils.getSegmentGeneratorConfigWithoutTimeColumn(avroFile, TEMP_DIR, "testTable"); | ||
SegmentIndexCreationDriver driver = new SegmentIndexCreationDriverImpl(); | ||
driver.init(config); | ||
driver.build(); | ||
|
||
_schema = config.getSchema(); | ||
VirtualColumnProviderFactory.addBuiltInVirtualColumnsToSegmentSchema(_schema, "testSegment"); | ||
return MutableSegmentImplTestUtils | ||
.createMutableSegmentImpl(_schema, Collections.emptySet(), Collections.emptySet(), Collections.emptySet(), | ||
Collections.emptyMap(), | ||
false, false, null, null, null, null, null, null, Collections.emptyList()); | ||
} | ||
|
||
@Test | ||
public void testNoLimitBreached() | ||
throws Exception { | ||
File avroFile = getAvroFile(); | ||
MutableSegmentImpl mutableSegment = getMutableSegment(avroFile); | ||
StreamMessageMetadata defaultMetadata = new StreamMessageMetadata(System.currentTimeMillis(), new GenericRow()); | ||
try (RecordReader recordReader = RecordReaderFactory | ||
.getRecordReader(FileFormat.AVRO, avroFile, _schema.getColumnNames(), null)) { | ||
GenericRow reuse = new GenericRow(); | ||
while (recordReader.hasNext()) { | ||
mutableSegment.index(recordReader.next(reuse), defaultMetadata); | ||
} | ||
} | ||
assert mutableSegment.canAddMore(); | ||
} | ||
|
||
@Test | ||
public void testLimitBreached() | ||
throws Exception { | ||
File avroFile = getAvroFile(); | ||
MutableSegmentImpl mutableSegment = getMutableSegment(avroFile); | ||
|
||
Field indexContainerMapField = MutableSegmentImpl.class.getDeclaredField("_indexContainerMap"); | ||
indexContainerMapField.setAccessible(true); | ||
Map<String, Object> colVsIndexContainer = (Map<String, Object>) indexContainerMapField.get(mutableSegment); | ||
|
||
for (Map.Entry<String, Object> entry : colVsIndexContainer.entrySet()) { | ||
Object indexContainer = entry.getValue(); | ||
Field mutableIndexesField = indexContainer.getClass().getDeclaredField("_mutableIndexes"); | ||
mutableIndexesField.setAccessible(true); | ||
Map<IndexType, MutableIndex> indexTypeVsMutableIndex = | ||
(Map<IndexType, MutableIndex>) mutableIndexesField.get(indexContainer); | ||
|
||
MutableForwardIndex mutableForwardIndex = null; | ||
for (IndexType indexType : indexTypeVsMutableIndex.keySet()) { | ||
if (indexType.getId().equals(StandardIndexes.FORWARD_ID)) { | ||
mutableForwardIndex = (MutableForwardIndex) indexTypeVsMutableIndex.get(indexType); | ||
} | ||
} | ||
|
||
assert mutableForwardIndex != null; | ||
|
||
indexTypeVsMutableIndex.put(new ForwardIndexPlugin().getIndexType(), | ||
new FakeMutableForwardIndex(mutableForwardIndex)); | ||
} | ||
StreamMessageMetadata defaultMetadata = new StreamMessageMetadata(System.currentTimeMillis(), new GenericRow()); | ||
try (RecordReader recordReader = RecordReaderFactory | ||
.getRecordReader(FileFormat.AVRO, avroFile, _schema.getColumnNames(), null)) { | ||
GenericRow reuse = new GenericRow(); | ||
while (recordReader.hasNext()) { | ||
mutableSegment.index(recordReader.next(reuse), defaultMetadata); | ||
} | ||
} | ||
|
||
assert !mutableSegment.canAddMore(); | ||
} | ||
} |
Oops, something went wrong.
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
(minor) Annotate it with
@VisibleForTesting