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

Jianwei Cui commented on HBASE-15433:
-------------------------------------

The table must be disabled during restoreSnapshot, so that the 
{{tableRegionCount}} won't change. Assume there won't be concurrent 
restoreSnapshot requests for the same table, the 
{{checkAndUpdateNamespaceRegionQuota}} after {{restoreSnapshot}} will be 
executed only when {{tableRegionCount > snapshotRegionCount}} satisfied, this 
means we have preserved enough region count for the 
{{checkAndUpdateNamespaceRegionQuota}} from the namespace quota. Therefore, 
other thread operations won't make the {{checkAndUpdateNamespaceRegionQuota}} 
fail if they operating on different tables? However, if there are concurrent 
restoreSnapshot requests for the same table, it will cause problem, and we may 
need lock to make sure the quota information is updated correctly, or we can 
move the quota check and update logic in the {{RestoreSnapshotHandler}} after 
table lock is held?

> SnapshotManager#restoreSnapshot not update table and region count quota 
> correctly when encountering exception
> -------------------------------------------------------------------------------------------------------------
>
>                 Key: HBASE-15433
>                 URL: https://issues.apache.org/jira/browse/HBASE-15433
>             Project: HBase
>          Issue Type: Bug
>          Components: snapshots
>    Affects Versions: 2.0.0
>            Reporter: Jianwei Cui
>         Attachments: HBASE-15433-trunk-v1.patch, HBASE-15433-trunk-v2.patch, 
> HBASE-15433-trunk.patch
>
>
> In SnapshotManager#restoreSnapshot, the table and region quota will be 
> checked and updated as:
> {code}
>       try {
>         // Table already exist. Check and update the region quota for this 
> table namespace
>         checkAndUpdateNamespaceRegionQuota(manifest, tableName);
>         restoreSnapshot(snapshot, snapshotTableDesc);
>       } catch (IOException e) {
>         
> this.master.getMasterQuotaManager().removeTableFromNamespaceQuota(tableName);
>         LOG.error("Exception occurred while restoring the snapshot " + 
> snapshot.getName()
>             + " as table " + tableName.getNameAsString(), e);
>         throw e;
>       }
> {code}
> The 'checkAndUpdateNamespaceRegionQuota' will fail if regions in the snapshot 
> make the region count quota exceeded, then, the table will be removed in the 
> 'catch' block. This will make the current table count and region count 
> decrease, following table creation or region split will succeed even if the 
> actual quota is exceeded.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to