Skip to content

HBASE-23693 Split failure may cause region hole and data loss when use zk assign - #1071

Merged
wchevreuil merged 1 commit into
apache:branch-1from
thangTang:HBASE-23693
Feb 10, 2020
Merged

HBASE-23693 Split failure may cause region hole and data loss when use zk assign#1071
wchevreuil merged 1 commit into
apache:branch-1from
thangTang:HBASE-23693

Conversation

@thangTang

Copy link
Copy Markdown
Contributor

@Apache-HBase

Copy link
Copy Markdown

💔 -1 overall

VoteSubsystemRuntimeComment
+0 🆗reexec1m 28sDocker mode activated.
_ Prechecks _
+1 💚dupname0m 0sNo case conflicting files found.
+1 💚hbaseanti0m 0sPatch does not have any anti-patterns.
+1 💚@author0m 0sThe patch does not contain any @author tags.
-0 ⚠️test4tests0m 0sThe patch doesn't appear to include any new or modified tests. Please justify why no new tests are needed for this patch. Also please list what manual steps were performed to verify this patch.
_ branch-1 Compile Tests _
+0 🆗mvndep1m 22sMaven dependency ordering for branch
+1 💚mvninstall7m 41sbranch-1 passed
+1 💚compile1m 7sbranch-1 passed with JDK v1.8.0_242
+1 💚compile1m 11sbranch-1 passed with JDK v1.7.0_252
+1 💚checkstyle2m 27sbranch-1 passed
+1 💚shadedjars3m 15sbranch has no errors when building our shaded downstream artifacts.
+1 💚javadoc0m 55sbranch-1 passed with JDK v1.8.0_242
+1 💚javadoc1m 9sbranch-1 passed with JDK v1.7.0_252
+0 🆗spotbugs2m 54sUsed deprecated FindBugs config; considering switching to SpotBugs.
+1 💚findbugs4m 24sbranch-1 passed
_ Patch Compile Tests _
+0 🆗mvndep0m 15sMaven dependency ordering for patch
+1 💚mvninstall2m 6sthe patch passed
+1 💚compile1m 1sthe patch passed with JDK v1.8.0_242
+1 💚javac1m 1sthe patch passed
+1 💚compile1m 11sthe patch passed with JDK v1.7.0_252
+1 💚javac1m 11sthe patch passed
-1 ❌checkstyle1m 43shbase-server: The patch generated 1 new + 18 unchanged - 0 fixed = 19 total (was 18)
+1 💚whitespace0m 0sThe patch has no whitespace issues.
+1 💚shadedjars3m 6spatch has no errors when building our shaded downstream artifacts.
+1 💚hadoopcheck5m 21sPatch does not cause any errors with Hadoop 2.8.5 2.9.2.
+1 💚javadoc0m 51sthe patch passed with JDK v1.8.0_242
+1 💚javadoc1m 10sthe patch passed with JDK v1.7.0_252
-1 ❌findbugs1m 40shbase-client generated 2 new + 0 unchanged - 0 fixed = 2 total (was 0)
_ Other Tests _
+1 💚unit2m 38shbase-client in the patch passed.
-1 ❌unit151m 52shbase-server in the patch failed.
+1 💚asflicense0m 46sThe patch does not generate ASF License warnings.
206m 37s
ReasonTests
FindBugsmodule:hbase-client
Dead store to t in org.apache.hadoop.hbase.MetaTableAccessor.getDaughterRegionsFromParent(Connection, HRegionInfo) At MetaTableAccessor.java:org.apache.hadoop.hbase.MetaTableAccessor.getDaughterRegionsFromParent(Connection, HRegionInfo) At MetaTableAccessor.java:[line 852]
Dead store to t in org.apache.hadoop.hbase.MetaTableAccessor.getHRegionInfo(Connection, byte[]) At MetaTableAccessor.java:org.apache.hadoop.hbase.MetaTableAccessor.getHRegionInfo(Connection, byte[]) At MetaTableAccessor.java:[line 845]
Failed junit testshadoop.hbase.replication.TestReplicationKillSlaveRS
hadoop.hbase.master.TestMasterOperationsForRegionReplicas
SubsystemReport/Notes
DockerClient=19.03.5 Server=19.03.5 base: https://builds.apache.org/job/HBase-PreCommit-GitHub-PR/job/PR-1071/1/artifact/out/Dockerfile
GITHUB PR#1071
Optional Testsdupname asflicense javac javadoc unit spotbugs findbugs shadedjars hadoopcheck hbaseanti checkstyle compile
unameLinux baa1866f84de 4.15.0-74-generic #84-Ubuntu SMP Thu Dec 19 08:06:28 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
Build toolmaven
Personality/home/jenkins/jenkins-slave/workspace/Base-PreCommit-GitHub-PR_PR-1071/out/precommit/personality/provided.sh
git revisionbranch-1 / 64b9d2f
Default Java1.7.0_252
Multi-JDK versions/usr/lib/jvm/zulu-8-amd64:1.8.0_242 /usr/lib/jvm/zulu-7-amd64:1.7.0_252
checkstylehttps://builds.apache.org/job/HBase-PreCommit-GitHub-PR/job/PR-1071/1/artifact/out/diff-checkstyle-hbase-server.txt
findbugshttps://builds.apache.org/job/HBase-PreCommit-GitHub-PR/job/PR-1071/1/artifact/out/new-findbugs-hbase-client.html
unithttps://builds.apache.org/job/HBase-PreCommit-GitHub-PR/job/PR-1071/1/artifact/out/patch-unit-hbase-server.txt
Test Resultshttps://builds.apache.org/job/HBase-PreCommit-GitHub-PR/job/PR-1071/1/testReport/
Max. process+thread count3950 (vs. ulimit of 10000)
modulesC: hbase-client hbase-server U: .
Console outputhttps://builds.apache.org/job/HBase-PreCommit-GitHub-PR/job/PR-1071/1/console
versionsgit=1.9.1 maven=3.0.5 findbugs=3.0.1
Powered byApache Yetus 0.11.1 https://yetus.apache.org

This message was automatically generated.

@Apache-HBase

Copy link
Copy Markdown

💔 -1 overall

VoteSubsystemRuntimeComment
+0 🆗reexec1m 28sDocker mode activated.
_ Prechecks _
+1 💚dupname0m 0sNo case conflicting files found.
+1 💚hbaseanti0m 0sPatch does not have any anti-patterns.
+1 💚@author0m 0sThe patch does not contain any @author tags.
-0 ⚠️test4tests0m 0sThe patch doesn't appear to include any new or modified tests. Please justify why no new tests are needed for this patch. Also please list what manual steps were performed to verify this patch.
_ branch-1 Compile Tests _
+0 🆗mvndep1m 21sMaven dependency ordering for branch
+1 💚mvninstall7m 33sbranch-1 passed
+1 💚compile1m 1sbranch-1 passed with JDK v1.8.0_242
+1 💚compile1m 12sbranch-1 passed with JDK v1.7.0_252
+1 💚checkstyle2m 24sbranch-1 passed
+1 💚shadedjars3m 14sbranch has no errors when building our shaded downstream artifacts.
+1 💚javadoc0m 58sbranch-1 passed with JDK v1.8.0_242
+1 💚javadoc1m 8sbranch-1 passed with JDK v1.7.0_252
+0 🆗spotbugs2m 57sUsed deprecated FindBugs config; considering switching to SpotBugs.
+1 💚findbugs4m 29sbranch-1 passed
_ Patch Compile Tests _
+0 🆗mvndep0m 15sMaven dependency ordering for patch
+1 💚mvninstall2m 10sthe patch passed
+1 💚compile1m 0sthe patch passed with JDK v1.8.0_242
+1 💚javac1m 0sthe patch passed
+1 💚compile1m 11sthe patch passed with JDK v1.7.0_252
+1 💚javac1m 11sthe patch passed
-1 ❌checkstyle0m 38shbase-client: The patch generated 1 new + 79 unchanged - 0 fixed = 80 total (was 79)
+1 💚whitespace0m 0sThe patch has no whitespace issues.
+1 💚shadedjars3m 9spatch has no errors when building our shaded downstream artifacts.
+1 💚hadoopcheck5m 16sPatch does not cause any errors with Hadoop 2.8.5 2.9.2.
+1 💚javadoc0m 51sthe patch passed with JDK v1.8.0_242
+1 💚javadoc1m 8sthe patch passed with JDK v1.7.0_252
+1 💚findbugs4m 43sthe patch passed
_ Other Tests _
+1 💚unit2m 37shbase-client in the patch passed.
+1 💚unit152m 18shbase-server in the patch passed.
+1 💚asflicense0m 45sThe patch does not generate ASF License warnings.
206m 25s
SubsystemReport/Notes
DockerClient=19.03.5 Server=19.03.5 base: https://builds.apache.org/job/HBase-PreCommit-GitHub-PR/job/PR-1071/2/artifact/out/Dockerfile
GITHUB PR#1071
Optional Testsdupname asflicense javac javadoc unit spotbugs findbugs shadedjars hadoopcheck hbaseanti checkstyle compile
unameLinux 514f8208f1d5 4.15.0-74-generic #84-Ubuntu SMP Thu Dec 19 08:06:28 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
Build toolmaven
Personality/home/jenkins/jenkins-slave/workspace/Base-PreCommit-GitHub-PR_PR-1071/out/precommit/personality/provided.sh
git revisionbranch-1 / 99a59cf
Default Java1.7.0_252
Multi-JDK versions/usr/lib/jvm/zulu-8-amd64:1.8.0_242 /usr/lib/jvm/zulu-7-amd64:1.7.0_252
checkstylehttps://builds.apache.org/job/HBase-PreCommit-GitHub-PR/job/PR-1071/2/artifact/out/diff-checkstyle-hbase-client.txt
Test Resultshttps://builds.apache.org/job/HBase-PreCommit-GitHub-PR/job/PR-1071/2/testReport/
Max. process+thread count3931 (vs. ulimit of 10000)
modulesC: hbase-client hbase-server U: .
Console outputhttps://builds.apache.org/job/HBase-PreCommit-GitHub-PR/job/PR-1071/2/console
versionsgit=1.9.1 maven=3.0.5 findbugs=3.0.1
Powered byApache Yetus 0.11.1 https://yetus.apache.org

This message was automatically generated.

@wchevreuilwchevreuil left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This seems to solve the main issue, which is the parent and its interim daughters been wiped off. However, I'm wondering if the problem happens because we are setting parent state offline and split=true too soon in the split operation. What would you think, @thangTang ?

Also, is it possible to provide a UT to reproduce? Might be too complex, though, since it involves some sort of race condition.

Comment on lines +767 to +780
PairOfSameType<HRegionInfo> daughterRegions =
MetaTableAccessor.getDaughterRegionsFromParent(this.server.getConnection(), region);
if (daughterRegions != null) {
if (daughterRegions.getFirst() != null) {
daughter2Parent.put(daughterRegions.getFirst().getEncodedName(), region);
}
if (daughterRegions.getSecond() != null) {
daughter2Parent.put(daughterRegions.getSecond().getEncodedName(), region);
}
}
} catch (KeeperException ke) {
server.abort("Unexpected ZK exception deleting node " + region, ke);
} catch (IOException e) {
LOG.warn("get daughter from meta exception " + region, e);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is it really entering this block? My understanding is that parent region would be in OFFLINE state and SPLIT=true after createDaughters call completed inside SplitTransactionImpl.execute.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, but at this time(after createDaughters call completed inside SplitTransactionImpl.execute) the split transaction is still not entirely complete.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, but at this time(after createDaughters call completed inside SplitTransactionImpl.execute) the split transaction is still not entirely complete.

And that's why seems wrong to have SPLIT=true already at that point.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If we update the meta information later, we can only put it after the completion of execute openDaughters. It is not very clear to me what impact this might have now. I may need more detailed and comprehensive thinking. My idea is to merge this patch first, at least it can solve most of the problems. Do you think it is okay? @wchevreuil

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If we update the meta information later, we can only put it after the completion of execute openDaughters.

Yeah, that's what I think.

It is not very clear to me what impact this might have now. I may need more detailed and comprehensive thinking. My idea is to merge this patch first, at least it can solve most of the problems. Do you think it is okay?

If you think it's too much work try fixing the state/split flag updates on this PR, then yeah, we can merge this one for now, then work on the other solution in a different jira/RP.

@thangTangthangTangJan 22, 2020

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If you think it's too much work try fixing the state/split flag updates on this PR, then yeah, we can merge this one for now, then work on the other solution in a different jira/RP.

Yeah, I hope to merge this patch first, and other work can be completed in new JIRA. At least it can solve the problem of data loss. In extreme scenarios, the region hole can be temporarily repaired by HBCK.

HRegionInfo parent = daughter2Parent.get(hri.getEncodedName());
HRegionInfo info = getHRIFromMeta(parent);
if (info != null && info.isSplit() && info.isOffline()) {
regionsToClean.add(Pair.newPair(state.getRegion(), info));

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Oh, so parent is OFFLINE and SPLIT=true in meta only, but not in assignedRegions? Sounds wrong that we marked parent as OFFLINE and SPLIT even when splitting was still not entirely complete.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If the RS machine crash when the SplitTransactionImpl step after PONR, master will handle the split rollback. Under normal conditions, it cleanup daughter region and try to assign parent region. If assign failed, parent region RIT so CatalogJanitor blocked; but at this time the master switch, new master will delete parent region because of OFFLINE and SPLIT=true.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This daughter2Parent added stingency makes sense to me. Nice.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If the RS machine crash when the SplitTransactionImpl step after PONR, master will handle the split rollback.

Yeah, but it seems to work only because Master has different info for the region than what is actual in meta. What if Active Master also crashes before it triggers SCP and daughters get cleaned up? The other master will load regions state as seen in meta, then it can run into same problem again.

@thangTangthangTangJan 21, 2020

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If the RS machine crash when the SplitTransactionImpl step after PONR, master will handle the split rollback.

Yeah, but it seems to work only because Master has different info for the region than what is actual in meta. What if Active Master also crashes before it triggers SCP and daughters get cleaned up? The other master will load regions state as seen in meta, then it can run into same problem again.

daughter cleanup is excuted in SCP, and in this patch it will do three things together:

  1. delete daughter region in meta
  2. update parent region in meta
  3. delete daughter region dir in HDFS
 if (regionPair != null) {
MetaTableAccessor.deleteRegion(this.server.getConnection(), hri); MetaTableAccessor.deleteRegion(this.server.getConnection(), hri);
} }
if (parentInfo != null) {
List<Mutation> mutations = new ArrayList<Mutation>();
HRegionInfo copyOfParent = new HRegionInfo(parentInfo);
copyOfParent.setOffline(false);
copyOfParent.setSplit(false);
Put putParent = MetaTableAccessor.makePutFromRegionInfo(copyOfParent);
mutations.add(putParent);
MetaTableAccessor.mutateMetaTable(this.server.getConnection(), mutations);
}
LOG.debug("Cleaning up HDFS since no meta entry exists, hri: " + hri); LOG.debug("Cleaning up HDFS since no meta entry exists, hri: " + hri);
FSUtils.deleteRegionDir(server.getConfiguration(), hri); FSUtils.deleteRegionDir(server.getConfiguration(), hri);

So if Active Master also crashes before it triggers SCP, the daughter won`t be deleted.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

So if Active Master also crashes before it triggers SCP, the daughter won`t be deleted.

Yes, that's my point. We would now have a new active master that sees parent split as complete, although split was midway through. It will potentially remove the parent, and fail to online the daughters.

I wonder if working on correcting the regions state and split flag updates would sort split failures at different scenarios. It also does not seem consistent the way we do these updates in meta only and don't reflect it on the "in-memory" region info master has.

@Apache-HBase

Copy link
Copy Markdown

💔 -1 overall

VoteSubsystemRuntimeComment
+0 🆗reexec22m 10sDocker mode activated.
_ Prechecks _
+1 💚dupname0m 0sNo case conflicting files found.
+1 💚hbaseanti0m 0sPatch does not have any anti-patterns.
+1 💚@author0m 0sThe patch does not contain any @author tags.
-0 ⚠️test4tests0m 0sThe patch doesn't appear to include any new or modified tests. Please justify why no new tests are needed for this patch. Also please list what manual steps were performed to verify this patch.
_ branch-1 Compile Tests _
+0 🆗mvndep1m 25sMaven dependency ordering for branch
+1 💚mvninstall7m 34sbranch-1 passed
+1 💚compile1m 1sbranch-1 passed with JDK v1.8.0_242
+1 💚compile1m 11sbranch-1 passed with JDK v1.7.0_252
+1 💚checkstyle2m 5sbranch-1 passed
+1 💚shadedjars2m 59sbranch has no errors when building our shaded downstream artifacts.
+1 💚javadoc0m 56sbranch-1 passed with JDK v1.8.0_242
+1 💚javadoc1m 8sbranch-1 passed with JDK v1.7.0_252
+0 🆗spotbugs2m 40sUsed deprecated FindBugs config; considering switching to SpotBugs.
+1 💚findbugs4m 4sbranch-1 passed
_ Patch Compile Tests _
+0 🆗mvndep0m 17sMaven dependency ordering for patch
+1 💚mvninstall1m 58sthe patch passed
+1 💚compile1m 0sthe patch passed with JDK v1.8.0_242
+1 💚javac1m 0sthe patch passed
+1 💚compile1m 8sthe patch passed with JDK v1.7.0_252
+1 💚javac1m 8sthe patch passed
+1 💚checkstyle2m 2sthe patch passed
+1 💚whitespace0m 0sThe patch has no whitespace issues.
+1 💚shadedjars2m 49spatch has no errors when building our shaded downstream artifacts.
+1 💚hadoopcheck4m 51sPatch does not cause any errors with Hadoop 2.8.5 2.9.2.
+1 💚javadoc0m 52sthe patch passed with JDK v1.8.0_242
+1 💚javadoc1m 8sthe patch passed with JDK v1.7.0_252
+1 💚findbugs4m 23sthe patch passed
_ Other Tests _
+1 💚unit2m 42shbase-client in the patch passed.
-1 ❌unit148m 43shbase-server in the patch failed.
+1 💚asflicense0m 57sThe patch does not generate ASF License warnings.
221m 19s
ReasonTests
Failed junit testshadoop.hbase.client.TestRestoreSnapshotFromClient
SubsystemReport/Notes
DockerClient=19.03.5 Server=19.03.5 base: https://builds.apache.org/job/HBase-PreCommit-GitHub-PR/job/PR-1071/3/artifact/out/Dockerfile
GITHUB PR#1071
Optional Testsdupname asflicense javac javadoc unit spotbugs findbugs shadedjars hadoopcheck hbaseanti checkstyle compile
unameLinux d918b4e4f0ab 4.15.0-60-generic #67-Ubuntu SMP Thu Aug 22 16:55:30 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
Build toolmaven
Personality/home/jenkins/jenkins-slave/workspace/Base-PreCommit-GitHub-PR_PR-1071/out/precommit/personality/provided.sh
git revisionbranch-1 / 99a59cf
Default Java1.7.0_252
Multi-JDK versions/usr/lib/jvm/zulu-8-amd64:1.8.0_242 /usr/lib/jvm/zulu-7-amd64:1.7.0_252
unithttps://builds.apache.org/job/HBase-PreCommit-GitHub-PR/job/PR-1071/3/artifact/out/patch-unit-hbase-server.txt
Test Resultshttps://builds.apache.org/job/HBase-PreCommit-GitHub-PR/job/PR-1071/3/testReport/
Max. process+thread count4229 (vs. ulimit of 10000)
modulesC: hbase-client hbase-server U: .
Console outputhttps://builds.apache.org/job/HBase-PreCommit-GitHub-PR/job/PR-1071/3/console
versionsgit=1.9.1 maven=3.0.5 findbugs=3.0.1
Powered byApache Yetus 0.11.1 https://yetus.apache.org

This message was automatically generated.

@thangTang

Copy link
Copy Markdown
ContributorAuthor

This seems to solve the main issue, which is the parent and its interim daughters been wiped off. However, I'm wondering if the problem happens because we are setting parent state offline and split=true too soon in the split operation. What would you think, @thangTang ?

Also, is it possible to provide a UT to reproduce? Might be too complex, though, since it involves some sort of race condition.

I think the direct reason for this problem is that the information in the meta table has not been updated after the daughter region is cleaned up. At this time, the sub daughter no longer exists and the master will also try to reassign the parent region, so updating the information in the meta table should not have a negative impact. As for whether to adjust the timing of setting the parent region state in the meta table, we may need to sort out the split process as a whole. After all, when ZK assign is used, split transaction is complex.

I've considered the problem of unit testing, and it's difficult to mock this case --- I met this problem in an extreme scenario --- RS crash when split step after PONR but not entirely complete, no other RS is available, and the master switch occurs.

// ConcurrentModificationException and deadlock in case of meta anassigned,
// but RegionState a blocked.
Set<HRegionInfo> regionsToOffline = new HashSet<HRegionInfo>();
Map<String, HRegionInfo> daughter2Parent = new HashMap<>();

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggest this needs more comment on why we need this accounting in daughter2Parent.

HRegionInfo parent = daughter2Parent.get(hri.getEncodedName());
HRegionInfo info = getHRIFromMeta(parent);
if (info != null && info.isSplit() && info.isOffline()) {
regionsToClean.add(Pair.newPair(state.getRegion(), info));

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This daughter2Parent added stingency makes sense to me. Nice.

@saintstack

Copy link
Copy Markdown
Contributor

Just to be explicit, this issue needs @wchevreuil approval too before can be merged (I like his comments)

@wchevreuilwchevreuil left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Let's move on with this and think on correcting the state/split flag updates on a separate jira, then.

@thangTang

Copy link
Copy Markdown
ContributorAuthor

@saintstack hi, can you help me to merge this patch? @wchevreuil has approved. After that we will

think on correcting the state/split flag updates on a separate jira

@wchevreuil
wchevreuil merged commit f99e899 into apache:branch-1Feb 10, 2020
wchevreuil added a commit that referenced this pull request Feb 10, 2020
wchevreuil pushed a commit that referenced this pull request Feb 10, 2020
…e zk assign (#1071)
Signed-off-by: stack <stack@apache.org>
Signed-off-by: Wellington Chevreuil <wchevreuil@apache.org>
@wchevreuil

Copy link
Copy Markdown
Contributor

Thanks for the contribution, @thangTang . I had merged this PR into branch-1.

@thangTang

Copy link
Copy Markdown
ContributorAuthor

Thanks for the contribution, @thangTang . I had merged this PR into branch-1.

This is my first patch. I'm very happy to have a good start. Thank you and @wchevreuil very much :)

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@thangTang@Apache-HBase@saintstack@wchevreuil