gokceni commented on a change in pull request #625: PHOENIX-5565 Unify index
update structures in IndexRegionObserver and…
URL: https://github.com/apache/phoenix/pull/625#discussion_r344820717
##########
File path:
phoenix-core/src/main/java/org/apache/phoenix/hbase/index/IndexRegionObserver.java
##########
@@ -512,86 +515,84 @@ public static void removeEmptyColumn(Mutation m, byte[]
emptyCF, byte[] emptyCQ)
}
}
+ private void
handleLocalIndexUpdates(ObserverContext<RegionCoprocessorEnvironment> c,
+ MiniBatchOperationInProgress<Mutation>
miniBatchOp,
+ ListMultimap<HTableInterfaceReference,
Pair<Mutation, byte[]>> indexUpdates) {
+ byte[] tableName =
c.getEnvironment().getRegion().getTableDescriptor().getTableName().getName();
+ HTableInterfaceReference hTableInterfaceReference =
+ new HTableInterfaceReference(new
ImmutableBytesPtr(tableName));
+ List<Pair<Mutation, byte[]>> localIndexUpdates =
indexUpdates.removeAll(hTableInterfaceReference);
+ if (localIndexUpdates == null) {
+ return;
+ }
+ List<Mutation> localUpdates = new ArrayList<Mutation>();
+ Iterator<Pair<Mutation, byte[]>> indexUpdatesItr =
localIndexUpdates.iterator();
+ while (indexUpdatesItr.hasNext()) {
+ Pair<Mutation, byte[]> next = indexUpdatesItr.next();
+ localUpdates.add(next.getFirst());
+ }
+ if (!localUpdates.isEmpty()) {
+ miniBatchOp.addOperationsFromCP(0, localUpdates.toArray(new
Mutation[localUpdates.size()]));
+ }
+ }
+
private void prepareIndexMutations(
ObserverContext<RegionCoprocessorEnvironment> c,
MiniBatchOperationInProgress<Mutation> miniBatchOp,
BatchMutateContext context,
Collection<? extends Mutation> mutations,
long now,
PhoenixIndexMetaData indexMetaData) throws Throwable {
-
List<IndexMaintainer> maintainers = indexMetaData.getIndexMaintainers();
-
// get the current span, or just use a null-span to avoid a bunch of if
statements
try (TraceScope scope = Trace.startSpan("Starting to build index
updates")) {
Span current = scope.getSpan();
if (current == null) {
current = NullSpan.INSTANCE;
}
-
// get the index updates for all elements in this batch
- Collection<Pair<Pair<Mutation, byte[]>, byte[]>> indexUpdates =
- this.builder.getIndexUpdates(miniBatchOp, mutations,
indexMetaData);
-
+ context.intermediatePostIndexUpdates =
ArrayListMultimap.<HTableInterfaceReference, Pair<Mutation, byte[]>>create();
+ this.builder.getIndexUpdates(context.intermediatePostIndexUpdates,
miniBatchOp, mutations, indexMetaData);
current.addTimelineAnnotation("Built index updates, doing preStep");
- TracingUtils.addAnnotation(current, "index update count",
indexUpdates.size());
- byte[] tableName =
c.getEnvironment().getRegion().getTableDescriptor().getTableName().getName();
- Iterator<Pair<Pair<Mutation, byte[]>, byte[]>> indexUpdatesItr =
indexUpdates.iterator();
- List<Mutation> localUpdates = new
ArrayList<Mutation>(indexUpdates.size());
- context.preIndexUpdates = new ArrayList<>(indexUpdates.size());
- context.intermediatePostIndexUpdates = new
ArrayList<>(indexUpdates.size());
- while(indexUpdatesItr.hasNext()) {
- Pair<Pair<Mutation, byte[]>, byte[]> next =
indexUpdatesItr.next();
- if (Bytes.compareTo(next.getFirst().getSecond(), tableName) ==
0) {
- localUpdates.add(next.getFirst().getFirst());
- indexUpdatesItr.remove();
- }
- else {
- // get index maintainer for this index table
- IndexMaintainer indexMaintainer =
getIndexMaintainer(maintainers, next.getFirst().getSecond());
- if (indexMaintainer == null) {
- throw new DoNotRetryIOException(
- "preBatchMutateWithExceptions: indexMaintainer
is null " +
-
c.getEnvironment().getRegion().getRegionInfo().getTable().getNameAsString());
- }
- byte[] emptyCF =
indexMaintainer.getEmptyKeyValueFamily().copyBytesIfNecessary();
- byte[] emptyCQ = indexMaintainer.getEmptyKeyValueQualifier();
+ handleLocalIndexUpdates(c, miniBatchOp,
context.intermediatePostIndexUpdates);
+ context.preIndexUpdates =
ArrayListMultimap.<HTableInterfaceReference, Mutation>create();
+ int updateCount = 0;
+ for (IndexMaintainer indexMaintainer : maintainers) {
+ updateCount++;
+ byte[] emptyCF =
indexMaintainer.getEmptyKeyValueFamily().copyBytesIfNecessary();
+ byte[] emptyCQ = indexMaintainer.getEmptyKeyValueQualifier();
Review comment:
Why have copyBytesIfNecessary on the emptyCF but not on emptyCQ? Just curious
----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
For queries about this service, please contact Infrastructure at:
[email protected]
With regards,
Apache Git Services