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

Chinmay Kulkarni commented on PHOENIX-5404:
-------------------------------------------

We will now break down a CREATE TABLE/VIEW into 4 client-side RPCs:
 # RPC to SYSTEM.CHILD_LINK region if it's a CREATE VIEW to add links from the 
view's parent to itself
 # RPC to SYSTEM.CATALOG to write header rows, column metadata, etc. (main 
stuff inside MetaDataEndpointImpl#createTable)
 # RPC to SYSTEM.CHILD_LINK to issue a scan to get the child views of the 
current table/view from that table/view's past life
 # RPC to SYSTEM.CATALOG to issue DROP VIEW CASCADE commands for each of the 
child views

1 and 2 already exist. This Jira introduces 3 and 4 instead of the 
server-server RPCs. Note that it's hard to piggy-back changes for a single 
table in 1 RPC since the order of the above RPCs matters i.e. we can't do 3. 
until 2. concludes that the table/view doesn't already exist (otherwise we 
might drop legitimate child views and not views from a previous life of that 
table/view). We also obviously can't do 4. until we get the list of child views 
as an output from 3.

If dropping the child views fails, currently since the call is server-server, 
it would prevent writing even the header rows, etc. in SYSTEM.CATALOG and 
return an error to the client (which is good).

BUT by moving this to the client, since 3 and 4 have to be triggered after 2, 
if either 3 or 4 fails, header rows for that table/view would've already been 
written to SYSTEM.CATALOG (I don't think we can easily rollback). At this 
point, throwing an error to the client (to maintain current behavior in the 
case dropChildViews fails) doesn't make much sense since the damage is already 
done. A subsequent CREATE TABLE/VIEW would fail since we would conclude that 
that table already exists.

I propose we make RPCs 3 and 4 a best-effort and log in case of failure, but 
return the code of RPC 2 to the client. The best approach is obviously if we 
refactored all of our metadata changes such that we could reduce the number of 
RPCs and have potentially transaction semantics, but that is a much larger 
change :)

Does this solution seem ok [~larsh] [~kozdemir] [~gjacoby] [~tdsilva]?

> Move check to client side to see if there are any child views that need to be 
> dropped while receating a table/view
> ------------------------------------------------------------------------------------------------------------------
>
>                 Key: PHOENIX-5404
>                 URL: https://issues.apache.org/jira/browse/PHOENIX-5404
>             Project: Phoenix
>          Issue Type: Sub-task
>    Affects Versions: 5.0.0, 4.15.0
>            Reporter: Thomas D'Silva
>            Assignee: Chinmay Kulkarni
>            Priority: Major
>             Fix For: 5.1.0, 4.16.0
>
>
> Remove  {{ViewUtil.dropChildViews(env, tenantIdBytes, schemaName, 
> tableName);}} call in MetdataEndpointImpl.createTable
> While creating a table or view we need to ensure that are not any child views 
> that haven't been clean up by the DropChildView task yet. Move this check to 
> the client (issue a scan against SYSTEM.CHILD_LINK to see if a single linking 
> row exists).



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to