[ https://issues.apache.org/jira/browse/HBASE-6576?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13435965#comment-13435965 ]
Zhihong Ted Yu commented on HBASE-6576: --------------------------------------- Integrated to 0.92 and 0.94 as well. Thanks for the reminder, Lars. > HBaseAdmin.createTable should wait until the table is enabled > ------------------------------------------------------------- > > 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