Apache9 commented on code in PR #4392:
URL: https://github.com/apache/hbase/pull/4392#discussion_r870295934
##########
hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java:
##########
@@ -3372,8 +3372,8 @@ public abstract void prepareMiniBatchOperations(
* Write mini-batch operations to MemStore
*/
public abstract WriteEntry writeMiniBatchOperationsToMemStore(
- final MiniBatchOperationInProgress<Mutation> miniBatchOp, final
WriteEntry writeEntry)
- throws IOException;
+ final MiniBatchOperationInProgress<Mutation> miniBatchOp, final
WriteEntry writeEntry,
+ long now) throws IOException;
Review Comment:
Why this change?
##########
hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java:
##########
@@ -3606,24 +3610,25 @@ protected MiniBatchOperationInProgress<Mutation>
createMiniBatch(final int lastI
@Override
public boolean visit(int index) throws IOException {
Mutation m = getMutation(index);
+ // the batch may contain multiple nonce keys (replay case). If so,
write WALEdit for each.
+ // Given how nonce keys are originally written, these should be
contiguous.
+ // They don't have to be, it will still work, just write more
WALEdits than needed.
+ long nonceGroup = getNonceGroup(index);
+ long nonce = getNonce(index);
// we use durability of the original mutation for the mutation
passed by CP.
if (region.getEffectiveDurability(m.getDurability()) ==
Durability.SKIP_WAL) {
region.recordMutationWithoutWal(m.getFamilyCellMap());
+ miniBatchOp.addSkipWALMutation(new NonceKey(nonceGroup, nonce),
familyCellMaps[index]);
Review Comment:
Ah, OK, the trick is here. Do we need to check whether region replication is
on?
##########
hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java:
##########
@@ -7947,6 +8000,58 @@ private WriteEntry doWALAppend(WALEdit walEdit,
Durability durability, List<UUID
}
throw ioe;
}
+ }
+
+ /**
+ * Attach {@link RegionReplicationSink#add} to the mvcc writeEntry for
replicating to region
+ * replica.
+ */
+ private void attachReplicateRegionReplicaInWALAppend(BatchOperation<?>
batchOp,
+ MiniBatchOperationInProgress<Mutation> miniBatchOp,
+ NonceKey nonceKey, WALKeyImpl walKey, WALEdit walEdit, WriteEntry
writeEntry)
+ throws IOException {
+ if (!regionReplicationSink.isPresent()) {
+ return;
+ }
+ final WALEdit walEditToUse =
+ getWALEditForReplicateRegionReplica(batchOp, miniBatchOp, nonceKey,
walEdit);
+ final ServerCall<?> rpcCall =
RpcServer.getCurrentServerCallWithCellScanner().orElse(null);
+ regionReplicationSink.ifPresent(sink ->
writeEntry.attachCompletionAction(() -> {
+ sink.add(walKey, walEditToUse, rpcCall);
+ }));
+ }
+
+ /**
+ * Here is for HBASE-26993 case 1,partial {@link Mutation}s are {@link
Durability#SKIP_WAL}.In
+ * order to make the new framework for region replication could work for
SKIP_WAL, we must add the
+ * {@link Mutation} which {@link Mutation#getDurability} is {@link
Durability#SKIP_WAL} to the
+ * {@link WALEdit} used for replicating to region replica.
+ */
+ private WALEdit getWALEditForReplicateRegionReplica(BatchOperation<?>
batchOp,
+ MiniBatchOperationInProgress<Mutation> miniBatchOp,
+ NonceKey nonceKey, WALEdit walEdit) throws IOException {
+ /**
+ * Here there is no need to consider there are SKIP_WAL {@link Mutation}s
which are not covered
Review Comment:
If nonceKey is always the same, why we need to pass in the nonceKey when
getting the columnFamilyToCellsList?
##########
hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java:
##########
@@ -7947,6 +8000,58 @@ private WriteEntry doWALAppend(WALEdit walEdit,
Durability durability, List<UUID
}
throw ioe;
}
+ }
+
+ /**
+ * Attach {@link RegionReplicationSink#add} to the mvcc writeEntry for
replicating to region
+ * replica.
+ */
+ private void attachReplicateRegionReplicaInWALAppend(BatchOperation<?>
batchOp,
+ MiniBatchOperationInProgress<Mutation> miniBatchOp,
+ NonceKey nonceKey, WALKeyImpl walKey, WALEdit walEdit, WriteEntry
writeEntry)
+ throws IOException {
+ if (!regionReplicationSink.isPresent()) {
+ return;
+ }
+ final WALEdit walEditToUse =
+ getWALEditForReplicateRegionReplica(batchOp, miniBatchOp, nonceKey,
walEdit);
+ final ServerCall<?> rpcCall =
RpcServer.getCurrentServerCallWithCellScanner().orElse(null);
+ regionReplicationSink.ifPresent(sink ->
writeEntry.attachCompletionAction(() -> {
+ sink.add(walKey, walEditToUse, rpcCall);
+ }));
+ }
+
+ /**
+ * Here is for HBASE-26993 case 1,partial {@link Mutation}s are {@link
Durability#SKIP_WAL}.In
+ * order to make the new framework for region replication could work for
SKIP_WAL, we must add the
+ * {@link Mutation} which {@link Mutation#getDurability} is {@link
Durability#SKIP_WAL} to the
+ * {@link WALEdit} used for replicating to region replica.
+ */
+ private WALEdit getWALEditForReplicateRegionReplica(BatchOperation<?>
batchOp,
+ MiniBatchOperationInProgress<Mutation> miniBatchOp,
+ NonceKey nonceKey, WALEdit walEdit) throws IOException {
+ /**
+ * Here there is no need to consider there are SKIP_WAL {@link Mutation}s
which are not covered
+ * by {@link HRegion#doWALAppend} because for primary region,only {@link
MutationBatchOperation}
+ * is used and {@link NonceKey} is all the same for {@link Mutation}s in
+ * {@link MutationBatchOperation}.
+ */
+ List<Map<byte[], List<Cell>>> columnFamilyToCellsList =
miniBatchOp.getSkipMutations(nonceKey);
+ if(columnFamilyToCellsList == null || columnFamilyToCellsList.isEmpty()) {
+ return walEdit;
+ }
+
+ /**
+ * Create a new WALEdit for replicating to region replica,and add the
{@link Mutation} which
+ * {@link Mutation#getDurability} is {@link Durability#SKIP_WAL}
+ */
+ WALEdit newWALEdit = new WALEdit(walEdit);
+ for (Map<byte[], List<Cell>> columnFamilyToCells :
columnFamilyToCellsList) {
Review Comment:
So does the order matter here? I mean we already have some rows and cells in
the WALEdit, and then we add the missed ones to it, then how can we preserve
the order?
##########
hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java:
##########
@@ -4142,15 +4147,58 @@ private static long getLongValue(final Cell cell)
throws DoNotRetryIOException {
@Override
public WriteEntry writeMiniBatchOperationsToMemStore(
- final MiniBatchOperationInProgress<Mutation> miniBatchOp, @Nullable
WriteEntry writeEntry)
- throws IOException {
+ final MiniBatchOperationInProgress<Mutation> miniBatchOp, @Nullable
WriteEntry writeEntry,
+ long now) throws IOException {
+ boolean newWriteEntry = false;
if (writeEntry == null) {
writeEntry = region.mvcc.begin();
+ newWriteEntry = true;
}
super.writeMiniBatchOperationsToMemStore(miniBatchOp,
writeEntry.getWriteNumber());
+ if (newWriteEntry) {
Review Comment:
Mind explain a bit why we only need to do this when newWriteEntry is true?
##########
hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MiniBatchOperationInProgress.java:
##########
@@ -182,4 +195,25 @@ public int getNumOfAppends() {
public void incrementNumOfAppends() {
this.numOfAppends += 1;
}
+
+ public void addSkipWALMutation(NonceKey nonceKey, Map<byte[], List<Cell>>
columnFamilyToCells) {
+ if (columnFamilyToCells == null) {
+ return;
+ }
+ if (this.nonceKeyToSkipWALMutations == null) {
+ this.nonceKeyToSkipWALMutations = new HashMap<>();
+ }
+ List<Map<byte[], List<Cell>>> skipWALMuations =
+ this.nonceKeyToSkipWALMutations.computeIfAbsent(nonceKey, (key) -> new
ArrayList<>());
Review Comment:
Unnecessary '()' around the 'key'
--
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.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]