You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@hbase.apache.org by "Yu Li (JIRA)" <ji...@apache.org> on 2016/12/22 16:41:58 UTC
[jira] [Created] (HBASE-17361) HTable#getBufferedMutator is not
thread safe and could get data loss
Yu Li created HBASE-17361:
-----------------------------
Summary: HTable#getBufferedMutator is not thread safe and could get data loss
Key: HBASE-17361
URL: https://issues.apache.org/jira/browse/HBASE-17361
Project: HBase
Issue Type: Bug
Reporter: Yu Li
Assignee: Yu Li
Priority: Critical
Now we have {{HTable#getBufferedMutator}} like
{code}
BufferedMutator getBufferedMutator() throws IOException {
if (mutator == null) {
this.mutator = (BufferedMutatorImpl) connection.getBufferedMutator(
new BufferedMutatorParams(tableName)
.pool(pool)
.writeBufferSize(connConfiguration.getWriteBufferSize())
.maxKeyValueSize(connConfiguration.getMaxKeyValueSize())
);
}
mutator.setRpcTimeout(writeRpcTimeout);
mutator.setOperationTimeout(operationTimeout);
return mutator;
}
{code}
And {{HTable#flushCommits}}:
{code}
void flushCommits() throws IOException {
if (mutator == null) {
// nothing to flush if there's no mutator; don't bother creating one.
return;
}
getBufferedMutator().flush();
}
{code}
For {{HTable#put}}
{code}
public void put(final Put put) throws IOException {
getBufferedMutator().mutate(put);
flushCommits();
}
{code}
If we launch multiple threads to put in parallel, below sequence might happen because {{HTable#getBufferedMutator}} is not thread safe:
{noformat}
1. ThreadA runs to getBufferedMutator and finds mutator==null
2. ThreadB runs to getBufferedMutator and finds mutator==null
3. ThreadA initialize mutator to instanceA, then calls mutator#mutate,
adding one put (putA) into {{writeAsyncBuffer}}
4. ThreadB initialize mutator to instanceB
5. ThreadA runs to flushCommits, now mutator is instanceB, it calls
instanceB's flush method, putA is lost
{noformat}
Will add a UT to cover this case, and fix it in this JIRA.
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)