[ 
https://issues.apache.org/jira/browse/HBASE-10595?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13917343#comment-13917343
 ] 

Feng Honghua commented on HBASE-10595:
--------------------------------------

Thanks [~v.himanshu] and [~enis] for review and comments!
bq.This is a call to NN, and this patch would invoke it for every get request.
Actually before this patch every get request still need a call to NN, The call 
to NN is to determine if the request can be satisfied by the cache 
(getTableInfoModtime will ask NN for the last modified time of the table 
descriptor file...), so you can view the check of existence of table dir is a 
kind of shortcut.
{code}
    if (cachedtdm != null) {
      // Check mod time has not changed (this is trip to NN).
      if (getTableInfoModtime(tablename) <= cachedtdm.getModtime()) {
        cachehits++;
        return cachedtdm.getTableDescriptor();
      }
    }
{code}

bq.If a user deletes a table dir, wouldn't there be other (and more severe) 
consistencies such as meta being hosed, etc. What is the use case where a user 
is deleting the table dir behind the curtain ?
User deleting a table dir should not be an expected / normal scenario, should 
be deemed as a special case to result in the inconsistency of this patch. HBCK 
should be used to remove the items of this table in meta table for overall 
consistency. This is an issue out of scope of this patch.
This patch in more sensce is to fix the bug that listTables() and 
getTableDescriptor() use different criterion when table dir isn't existent:
# listTables() : deems a table is nonexistent and doesn't return according item 
if the table dir isn't existent, without checking if there is a corresponding 
item in table descriptor cache
# getTableDescriptor() : check the last modified time of the table descriptor 
file under table dir, if the file isn't existent or it's last modified time 
isn't newer than the one of table descriptor cache, deems as a cache hit and 
just return the one from cache

bq.I meant NameNode, not HMaster.
Thanks you two clarifying on this, I now realize you meant the access to NN to 
checking existence of the table dir :-)

bq.That is an inconsistency. But completely making the cache useless is not the 
way to solve it I think.
Glad you agree it's an inconsistency:-)
Why I think completely making the cache useless is acceptable:
# In essence all 'cache' item should be coherent to it backing store (think 
about all other kinds of cache:-)), the difference among various cache 
strategies(such as no-write / write-through / write-back...)  are when and how 
to keep cache to be coherent with its backing store, but not whether it should 
be coherent to its backing store, and whenever it isn't coherent with backing 
store, it's deemed as 'invalid' and should not be used to serve request. In 
this scenario, the table descriptor file is the backing store of the table 
descriptor cache.
# listTables() currently already use the semantic of above 'whenever cache 
isn't coherent with backing store, it's deemed as 'invalid' and should not be 
used to serve request' : it doesn't use cache if the table dir doesn't exist.
# Whether an active master failover-switch happens is transparent to the 
client, what client cares about is its requests are served consistently. But if 
we still use cache for getTableDescriptor() even its backing store(table dir 
and table descriptor file) changes(being removed is a special kind of change, 
right?), inconsistency can happen for two consecutive getTableDescriptor() 
calls : the previous active master uses its cache for the first 
getTableDescriptor, then it fails, another master takes the active master role, 
it finds no table dir(hence no table descriptor file), so it returns null for 
the second getTableDescriptor...

bq. That is the job of HBCK. There is no guarantees expected from the master if 
the user deletes dirs under it.
Partially agree:-). But it sounds much better if we could keep consistency from 
client perspective even under such corruption as table dir is removed from 
outside, right?

Lastly, what about we don't check the existence of the table dir, and just 
return null if the table descriptor file doesn't exist(it's now treated a 
special case of "modified time not newer than cache", IMHO it's incorrect)? 
This way we still align with the cache semantic "invalidate cache if it's not 
coherent with its backing store" but can save an access to NN if the table dir 
does exist.

> HBaseAdmin.getTableDescriptor can wrongly get the previous table's 
> TableDescriptor even after the table dir in hdfs is removed
> ------------------------------------------------------------------------------------------------------------------------------
>
>                 Key: HBASE-10595
>                 URL: https://issues.apache.org/jira/browse/HBASE-10595
>             Project: HBase
>          Issue Type: Sub-task
>          Components: master, util
>            Reporter: Feng Honghua
>            Assignee: Feng Honghua
>         Attachments: HBASE-10595-trunk_v1.patch, HBASE-10595-trunk_v2.patch, 
> HBASE-10595-trunk_v3.patch, HBASE-10595-trunk_v4.patch
>
>
> When a table dir (in hdfs) is removed(by outside), HMaster will still return 
> the cached TableDescriptor to client for getTableDescriptor request.
> On the contrary, HBaseAdmin.listTables() is handled correctly in current 
> implementation, for a table whose table dir in hdfs is removed by outside, 
> getTableDescriptor can still retrieve back a valid (old) table descriptor, 
> while listTables says it doesn't exist, this is inconsistent
> The reason for this bug is because HMaster (via FSTableDescriptors) doesn't 
> check if the table dir exists for getTableDescriptor() request, (while it 
> lists all existing table dirs(not firstly respects cache) and returns 
> accordingly for listTables() request)
> When a table is deleted via deleteTable, the cache will be cleared after the 
> table dir and tableInfo file is removed, listTables/getTableDescriptor 
> inconsistency should be transient(though still exists, when table dir is 
> removed while cache is not cleared) and harder to expose



--
This message was sent by Atlassian JIRA
(v6.1.5#6160)

Reply via email to