You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@hbase.apache.org by "Gregory Chanan (JIRA)" <ji...@apache.org> on 2012/08/14 02:07:38 UTC

[jira] [Updated] (HBASE-6576) HBaseAdmin.createTable should return enabled tables if successful

     [ https://issues.apache.org/jira/browse/HBASE-6576?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Gregory Chanan updated HBASE-6576:
----------------------------------

    Attachment: HBASE-6576-trunk.patch
                HBASE-6576-94.patch
                HBASE-6576-92.patch

Here are patches for 92, 94 and trunk.

To test, before applying the patch, I added a sleep to CreateTableHandler.java, right before the table is enabled, and the test failed in the disableTable call in all the versions, indicating the problem exists in 92, 94 and trunk.

I then tested with the patch applied.  Without the sleep, the tests always passed.  With the sleep, the test can fail in the createTable call if the number of client retires isn't bumped.  This is expected.
                
> HBaseAdmin.createTable should return enabled tables if successful
> -----------------------------------------------------------------
>
>                 Key: HBASE-6576
>                 URL: https://issues.apache.org/jira/browse/HBASE-6576
>             Project: HBase
>          Issue Type: Bug
>          Components: client, test
>            Reporter: Gregory Chanan
>            Assignee: Gregory Chanan
>             Fix For: 0.92.2, 0.96.0, 0.94.2
>
>         Attachments: HBASE-6576-92.patch, HBASE-6576-94.patch, HBASE-6576-trunk.patch
>
>
> The function:
> {code}
> public void createTable(final HTableDescriptor desc, byte [][] splitKeys)
> {code}
> in HBaseAdmin is synchronous and returns once all the regions of the table are online, but does not wait for the table to be enabled, which is the last step of table creation (see CreateTableHandler).
> This is confusing and leads to racy code because users do not realize that this is the case.  For example, I saw the following test failure in 0.92 when I ran:
> mvn test -Dtest=org.apache.hadoop.hbase.client.TestAdmin#testEnableDisableAddColumnDeleteColumn 
> {code}
> Error Message
> org.apache.hadoop.hbase.TableNotEnabledException: testMasterAdmin at org.apache.hadoop.hbase.master.handler.DisableTableHandler.<init>(DisableTableHandler.java:75) at org.apache.hadoop.hbase.master.HMaster.disableTable(HMaster.java:1154) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at org.apache.hadoop.hbase.ipc.WritableRpcEngine$Server.call(WritableRpcEngine.java:364) at org.apache.hadoop.hbase.ipc.HBaseServer$Handler.run(HBaseServer.java:1336)
> Stacktrace
> org.apache.hadoop.hbase.TableNotEnabledException: org.apache.hadoop.hbase.TableNotEnabledException: testMasterAdmin
> at org.apache.hadoop.hbase.master.handler.DisableTableHandler.<init>(DisableTableHandler.java:75)
> at org.apache.hadoop.hbase.master.HMaster.disableTable(HMaster.java:1154)
> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
> at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
> at java.lang.reflect.Method.invoke(Method.java:597)
> at org.apache.hadoop.hbase.ipc.WritableRpcEngine$Server.call(WritableRpcEngine.java:364)
> at org.apache.hadoop.hbase.ipc.HBaseServer$Handler.run(HBaseServer.java:1336)
> {code}
> The issue is that code will create and table and immediately disable it in order to do some testing, for example, to test an operation that only works when the table is disabled.  If the table has not been enabled yet, they will get back a TableNotEnabledException.
> The specific test above was fixed in HBASE-5206, but other examples exist in the code, for example the following:
> {code}
> hbase org.apache.hadoop.hbase.mapreduce.TestHFileOutputFormat newtable asdf14
> {code}
> The code in question is:
> {code}
> byte[] tname = args[1].getBytes();
> HTable table = util.createTable(tname, FAMILIES);
> HBaseAdmin admin = new HBaseAdmin(conf);
> admin.disableTable(tname);
> {code}
> It would be better if createTable just waited until the table was enabled, or threw a TableNotEnabledException if it exhausted the configured number of retries.

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira