Return-Path: X-Original-To: archive-asf-public-internal@cust-asf2.ponee.io Delivered-To: archive-asf-public-internal@cust-asf2.ponee.io Received: from cust-asf.ponee.io (cust-asf.ponee.io [163.172.22.183]) by cust-asf2.ponee.io (Postfix) with ESMTP id F4133200BFF for ; Tue, 17 Jan 2017 11:03:35 +0100 (CET) Received: by cust-asf.ponee.io (Postfix) id F2BED160B46; Tue, 17 Jan 2017 10:03:35 +0000 (UTC) Delivered-To: archive-asf-public@cust-asf.ponee.io Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by cust-asf.ponee.io (Postfix) with SMTP id 48066160B43 for ; Tue, 17 Jan 2017 11:03:35 +0100 (CET) Received: (qmail 14277 invoked by uid 500); 17 Jan 2017 10:03:34 -0000 Mailing-List: contact issues-help@hbase.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Delivered-To: mailing list issues@hbase.apache.org Received: (qmail 14266 invoked by uid 99); 17 Jan 2017 10:03:34 -0000 Received: from pnap-us-west-generic-nat.apache.org (HELO spamd2-us-west.apache.org) (209.188.14.142) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 17 Jan 2017 10:03:34 +0000 Received: from localhost (localhost [127.0.0.1]) by spamd2-us-west.apache.org (ASF Mail Server at spamd2-us-west.apache.org) with ESMTP id 0B7041A07FF for ; Tue, 17 Jan 2017 10:03:34 +0000 (UTC) X-Virus-Scanned: Debian amavisd-new at spamd2-us-west.apache.org X-Spam-Flag: NO X-Spam-Score: -1.999 X-Spam-Level: X-Spam-Status: No, score=-1.999 tagged_above=-999 required=6.31 tests=[KAM_LAZY_DOMAIN_SECURITY=1, RP_MATCHES_RCVD=-2.999] autolearn=disabled Received: from mx1-lw-us.apache.org ([10.40.0.8]) by localhost (spamd2-us-west.apache.org [10.40.0.9]) (amavisd-new, port 10024) with ESMTP id lLUFhtiLWXTx for ; Tue, 17 Jan 2017 10:03:33 +0000 (UTC) Received: from mailrelay1-us-west.apache.org (mailrelay1-us-west.apache.org [209.188.14.139]) by mx1-lw-us.apache.org (ASF Mail Server at mx1-lw-us.apache.org) with ESMTP id 9AFFA5FCA2 for ; Tue, 17 Jan 2017 10:03:32 +0000 (UTC) Received: from jira-lw-us.apache.org (unknown [207.244.88.139]) by mailrelay1-us-west.apache.org (ASF Mail Server at mailrelay1-us-west.apache.org) with ESMTP id DF3C5E8688 for ; Tue, 17 Jan 2017 10:03:28 +0000 (UTC) Received: from jira-lw-us.apache.org (localhost [127.0.0.1]) by jira-lw-us.apache.org (ASF Mail Server at jira-lw-us.apache.org) with ESMTP id 966872528F for ; Tue, 17 Jan 2017 10:03:26 +0000 (UTC) Date: Tue, 17 Jan 2017 10:03:26 +0000 (UTC) From: "Yu Li (JIRA)" To: issues@hbase.apache.org Message-ID: In-Reply-To: References: Subject: [jira] [Commented] (HBASE-17361) Make HTable thread safe MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-JIRA-FingerPrint: 30527f35849b9dde25b450d4833f0394 archived-at: Tue, 17 Jan 2017 10:03:36 -0000 [ https://issues.apache.org/jira/browse/HBASE-17361?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15825762#comment-15825762 ] Yu Li commented on HBASE-17361: ------------------------------- Thanks for the reminder [~Apache9] For HTable, I think we still have some interface compatible issue, such as: 1. The {{setWriteBufferSize}} interface which exists from the very beginning 2. The {{setOperationTimeout}} interface has been existing for more than 6 years (since HBASE-2937) 3. The {{setRpcTimeout}} interface was introduced by HBASE-15645 which went into all 1.0+ branches (1.0.4, 1.1.5, 1.2.2, 1.3.0, 1.4.0) 4. The {{setRead/WriteRpcTimeout}} interfaces were introduced by HBASE-15866 which also went into branch-1 (1.4.0) And to make HTable thread safe, we need to move all the above methods into a similar table builder like {{AsyncTableBuilder}}, right? I guess the change should be only for 2.0 and need to add incompatible flag in release note? Please let me know your thoughts, and I'll prepare the patch as soon as we get a consensus. Thanks. > Make HTable thread safe > ----------------------- > > Key: HBASE-17361 > URL: https://issues.apache.org/jira/browse/HBASE-17361 > Project: HBase > Issue Type: Improvement > Reporter: Yu Li > Assignee: Yu Li > Priority: Critical > Attachments: HBASE-17361.patch, HBASE-17361.patch > > > Currently HTable is marked as NOT thread safe, and this JIRA target at improving this to take better usage of the thread-safe BufferedMutator. > Some findings/work done: > If we try to do put to the same HTable instance in parallel, there'll be problem, since 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} > After fixing this, we will find quite some contention on {{BufferedMutatorImpl#flush}}, so more efforts required to make HTable thread safe but with good performance meanwhile. -- This message was sent by Atlassian JIRA (v6.3.4#6332)