hbase-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Andrey Stepachev <oct...@gmail.com>
Subject Re: Question on EnableTableHandler code
Date Mon, 16 Mar 2015 18:48:44 GMT
Thanks Stephen.

on (2): I think that much better to guarantee that table was enabled (i.e.
all internal structures reflect that fact and balancer knows about new
table). But result of that could be checked asyncronically from Admin.
Does it make sense?

On Mon, Mar 16, 2015 at 6:10 PM, Stephen Jiang <syuanjiangdev@gmail.com>
wrote:

> Andrey, I will take care of (1).
>
> And (2) :-) if your guys agree.  Because it is not consistent, if the bulk
> assigned failed, we would fail the enabling table; however, if the bulk
> assign not starts, we would enable table with offline regions - really
> inconsistent - we either all fail in those scenarios or all succeed with
> offline region (best effort approach).
>
> Thanks
> Stephen
>
> On Mon, Mar 16, 2015 at 11:01 AM, Andrey Stepachev <octo47@gmail.com>
> wrote:
>
>> Stephen, would you like to create jira for case (1)?
>>
>> Thank you.
>>
>> On Mon, Mar 16, 2015 at 5:58 PM, Andrey Stepachev <octo47@gmail.com>
>> wrote:
>>
>> > Thanks Stephen.
>> >
>> > Looks like you are right. For (1) case we really don't need there
>> > state cleanup. That is a bug. Should throw TableNotFoundException.
>> >
>> > As for (2) in case of no online region servers available we could
>> > leave table enabled, but no regions would be assigned.
>> >
>> > Actually that rises good question what enable table means,
>> > i.e. do we really need to guarantee that on table enable absolutely
>> > all regions are online, or that could be done in Admin on client side.
>> >
>> > So for now it seems that Enable handler do what is best, and leave
>> > table enabled but unassigned to be later assigned by Balancer.
>> >
>> > On Mon, Mar 16, 2015 at 5:34 PM, Stephen Jiang <syuanjiangdev@gmail.com
>> >
>> > wrote:
>> >
>> >> I want to make sure that the following logic in EnableTableHandler is
>> >> correct:
>> >>
>> >> (1). In EnableTableHandler#prepare - if the table is not existed, it
>> >> marked
>> >> the table as deleted and not throw exception.  The result is the table
>> >> lock
>> >> is released and the caller has no knowledge that the table not exist or
>> >> already deleted, it would continue the next step.
>> >>
>> >> Currently, this would happen during recovery (the caller is
>> >> AssignmentManager#recoverTableInEnablingState()) - however, looking at
>> >> recovery code, it expects TableNotFoundException  Should we always
>> throw
>> >> exception - if the table not exist?  I want to make sure that I don't
>> >> break
>> >> recovery logic by modifying.
>> >>
>> >> public EnableTableHandler prepare() {
>> >>
>> >> ...
>> >>
>> >> // Check if table exists
>> >>
>> >>       if (!MetaTableAccessor.tableExists(this.server.getConnection(),
>> >> tableName)) {
>> >>
>> >>         // retainAssignment is true only during recovery.  In normal
>> case
>> >> it is false
>> >>
>> >>         if (!this.skipTableStateCheck) {
>> >>
>> >>           throw new TableNotFoundException(tableName);
>> >>
>> >>         }
>> >>
>> >>         this.assignmentManager.getTableStateManager().setDeletedTable(
>> >> tableName);
>> >>
>> >>       }
>> >>
>> >> ...
>> >>
>> >> }
>> >> (2). In EnableTableHandler#handleEnableTable() - if the bulk assign
>> plan
>> >> could not be find, it would leave regions to be offline and declare
>> enable
>> >> table succeed - i think this is a bug and we should retry or fail -
>> but I
>> >> want to make sure that there are some merit behind this logic
>> >>
>> >>   private void handleEnableTable() {
>> >>
>> >>     Map<ServerName, List<HRegionInfo>> bulkPlan =
>> >>
>> >>         this.assignmentManager.getBalancer().retainAssignment(
>> >> regionsToAssign, onlineServers);
>> >>
>> >>     if (bulkPlan != null) {
>> >>
>> >>           ...
>> >>
>> >>       } else {
>> >>
>> >>       LOG.info("Balancer was unable to find suitable servers for table
>> " +
>> >> tableName
>> >>
>> >>           + ", leaving unassigned");
>> >>
>> >>       done = true;
>> >>
>> >>     }
>> >>
>> >>     if (done) {
>> >>
>> >>       // Flip the table to enabled.
>> >>
>> >>       this.assignmentManager.getTableStateManager().setTableState(
>> >>
>> >>         this.tableName, TableState.State.ENABLED);
>> >>
>> >>       LOG.info("Table '" + this.tableName
>> >>
>> >>       + "' was successfully enabled. Status: done=" + done);
>> >>
>> >>    }
>> >>
>> >>      ...
>> >>
>> >> }
>> >>
>> >>
>> >> thanks
>> >> Stephen
>> >>
>> >
>> >
>> >
>> > --
>> > Andrey.
>> >
>>
>>
>>
>> --
>> Andrey.
>>
>
>


-- 
Andrey.

Mime
  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message