Hi Amila, Anjana,

DimuthuG did this sometime back and also produced a spreadsheet (should be
on google docs) on the sequences. But something that we probably missed (as
in this case) is the locking granularity. There is a subtle difference when
row-level and table-level locks are acquired in and not-in combination,
which is not a frequent use-case; but some like these might still exist
unnoticed.

Thanks,
Senaka.

On Mon, Feb 6, 2012 at 12:04 PM, Anjana Fernando <anj...@wso2.com> wrote:

> Hi Amila,
>
> On Mon, Feb 6, 2012 at 11:50 AM, Amila Suriarachchi <am...@wso2.com>wrote:
>
>>
>>
>> On Mon, Feb 6, 2012 at 11:35 AM, Anjana Fernando <anj...@wso2.com> wrote:
>>
>>> Hi Amila,
>>>
>>> On Mon, Feb 6, 2012 at 10:30 AM, Amila Suriarachchi <am...@wso2.com>wrote:
>>>
>>>>
>>>>
>>>> On Mon, Feb 6, 2012 at 12:50 AM, Senaka Fernando <sen...@wso2.com>wrote:
>>>>
>>>>> Hi all,
>>>>>
>>>>> We discussed this offline, and the issue here is valid, Anjana can
>>>>> explain further if someone wants to understand it.
>>>>
>>>>
>>>> Can you please do that?
>>>>
>>>> I also thought (as Senaka mentioned) update sequence should be
>>>> consistent across different transaction scenarios. In that case we need to
>>>> study all the sql update patterns of the registry and put them to same lock
>>>> acquiring sequence.
>>>>
>>>
>>> I guess, that's what we just did. Updating scenarios are basically
>>> registry "put" and "delete". The "put" operations actually does "delete"
>>> ones internally (when updating), so we aligned the actual inserts/delete
>>> sequences. So now, the separate "delete" operation also will also run in
>>> the same lock acquiring sequence.
>>>
>>
>> In that case you need to check all the transaction scenarios of the
>> registry and see whether they acquire the locks in same order. Otherwise
>> you will get deadlocks when the incompatible two transactions executed in
>> parallel. It does not matter whether one registry transaction calls or not
>> but finally all the database level transactions should acquire the locks in
>> same order.
>>
>
> Yes, I just assume these are the only locations we are doing the updates,
> or else if there any more related updates to the same tables, we should
> check those. Anyways, the most frequently occurred deadlock (maybe the only
> one), is the one to do with the put/delete, this should be fixed by this,
> and I don't think this change will give way to new deadlock situations,
> best thing to do is test it and see.
>
> Cheers,
> Anjana.
>
>
>>
>> thanks,
>> Amila.
>>
>>
>>>
>>> Cheers,
>>> Anjana.
>>>
>>>
>>>>
>>>> thanks,
>>>> Amila.
>>>>
>>>>
>>>>> But out of the three options, right now, only #3 seems to be possible
>>>>> without breaking consistency. But even this needs to be tested against all
>>>>> DBs, because we are momentarily fooling the DB, by inserting a NULL value
>>>>> as the content id.
>>>>>
>>>>> Anjana will work with someone (perhaps Ajith), who knows the registry
>>>>> kernel and get this fix checked in. We can easily test this with a bulk
>>>>> WSDL upload operation, that produces deadlocks.
>>>>>
>>>>> Thanks,
>>>>> Senaka.
>>>>>
>>>>>
>>>>> On Mon, Feb 6, 2012 at 12:08 AM, Senaka Fernando <sen...@wso2.com>wrote:
>>>>>
>>>>>> Hi again,
>>>>>>
>>>>>> And with regard to #3, if that's a safe option go for it. That's
>>>>>> probably due to somebody not realizing the possibility. Anyway, I'm not 
>>>>>> the
>>>>>> expert when it comes to SQL stuff, may be Sumedha can provide some 
>>>>>> insight?
>>>>>>
>>>>>> Thanks,
>>>>>> Senaka.
>>>>>>
>>>>>>
>>>>>> On Mon, Feb 6, 2012 at 12:06 AM, Senaka Fernando <sen...@wso2.com>wrote:
>>>>>>
>>>>>>> Hi Anjana,
>>>>>>>
>>>>>>> So is this a complete sequence of operations? If so, once a write
>>>>>>> lock is acquired, IIRC it will be held until the transaction completes 
>>>>>>> - am
>>>>>>> I missing something?
>>>>>>>
>>>>>>> Also, there are some INSERT statements above the deletes. What about
>>>>>>> those?
>>>>>>>
>>>>>>> Thanks,
>>>>>>> Senaka.
>>>>>>>
>>>>>>> On Mon, Feb 6, 2012 at 12:00 AM, Anjana Fernando <anj...@wso2.com>wrote:
>>>>>>>
>>>>>>>> Hi,
>>>>>>>>
>>>>>>>> I may have possibly found a solution for the registry deadlocking
>>>>>>>> for concurrent puts/deletes. I was checking the SQL statements 
>>>>>>>> executed for
>>>>>>>> a put, and the list is as follows.
>>>>>>>>
>>>>>>>> SELECT REG_PATH_ID FROM REG_PATH WHERE
>>>>>>>> REG_PATH_VALUE='/_system/config/abc1' AND REG_TENANT_ID=0
>>>>>>>> SELECT REG_VERSION FROM REG_RESOURCE WHERE REG_PATH_ID=4 AND
>>>>>>>> REG_NAME='abc1' AND REG_TENANT_ID=0
>>>>>>>> SELECT REG_PATH_ID FROM REG_PATH WHERE
>>>>>>>> REG_PATH_VALUE='/_system/config/abc1' AND REG_TENANT_ID=0
>>>>>>>> SELECT REG_MEDIA_TYPE, REG_CREATOR, REG_CREATED_TIME,
>>>>>>>> REG_LAST_UPDATOR, REG_LAST_UPDATED_TIME, REG_VERSION, REG_DESCRIPTION,
>>>>>>>> REG_CONTENT_ID FROM REG_RESOURCE WHERE REG_PATH_ID=4 AND REG_NAME = 
>>>>>>>> 'abc1'
>>>>>>>> AND REG_TENANT_ID=0
>>>>>>>> SELECT REG_CONTENT_DATA FROM REG_CONTENT WHERE REG_CONTENT_ID = 105
>>>>>>>> AND REG_TENANT_ID=0
>>>>>>>> SELECT REG_NAME, REG_VALUE FROM REG_PROPERTY P,
>>>>>>>> REG_RESOURCE_PROPERTY RP WHERE P.REG_ID=RP.REG_PROPERTY_ID AND
>>>>>>>> RP.REG_VERSION=2492 AND P.REG_TENANT_ID=0 AND RP.REG_TENANT_ID=0
>>>>>>>> SELECT R.REG_PATH_ID, R.REG_NAME, R.REG_VERSION, R.REG_MEDIA_TYPE,
>>>>>>>> R.REG_CREATOR, R.REG_CREATED_TIME, R.REG_LAST_UPDATOR,
>>>>>>>> R.REG_LAST_UPDATED_TIME, R.REG_DESCRIPTION, R.REG_CONTENT_ID FROM
>>>>>>>> REG_RESOURCE R WHERE R.REG_PATH_ID=4 AND R.REG_NAME='abc1' AND
>>>>>>>> R.REG_TENANT_ID=0
>>>>>>>> SELECT REG_CONTENT_DATA FROM REG_CONTENT_HISTORY WHERE
>>>>>>>> REG_CONTENT_ID = 105 AND REG_TENANT_ID=0
>>>>>>>> SELECT REG_CONTENT_DATA FROM REG_CONTENT WHERE REG_CONTENT_ID = 105
>>>>>>>> AND REG_TENANT_ID=0
>>>>>>>> INSERT INTO REG_CONTENT_HISTORY (REG_CONTENT_ID, REG_CONTENT_DATA,
>>>>>>>> REG_TENANT_ID) VALUES (105, '<Binary InputStream of length 9>', 0)
>>>>>>>> SELECT REG_PATH_ID FROM REG_RESOURCE_HISTORY WHERE REG_VERSION=2492
>>>>>>>> AND REG_TENANT_ID=0
>>>>>>>> INSERT INTO REG_RESOURCE_HISTORY (REG_PATH_ID, REG_NAME,
>>>>>>>> REG_VERSION, REG_MEDIA_TYPE, REG_CREATOR, REG_CREATED_TIME,
>>>>>>>> REG_LAST_UPDATOR, REG_LAST_UPDATED_TIME, REG_DESCRIPTION, 
>>>>>>>> REG_CONTENT_ID,
>>>>>>>> REG_TENANT_ID) VALUES (4, 'abc1', 2492, 'text/plain', 'admin', 
>>>>>>>> '02/05/2012
>>>>>>>> 22:05:18.685', 'admin', '02/05/2012 22:05:55.959', 'XXXXXXXX', 105, 0)
>>>>>>>> DELETE FROM REG_RESOURCE WHERE REG_PATH_ID=4 AND REG_NAME='abc1'
>>>>>>>> AND REG_TENANT_ID=0
>>>>>>>> DELETE FROM REG_CONTENT WHERE REG_CONTENT_ID = 105 AND
>>>>>>>> REG_TENANT_ID=0
>>>>>>>> INSERT INTO REG_SNAPSHOT (REG_PATH_ID, REG_RESOURCE_NAME,
>>>>>>>> REG_RESOURCE_VIDS, REG_TENANT_ID) VALUES (4, 'abc1', '<Binary 
>>>>>>>> InputStream
>>>>>>>> of length 8>', 0)
>>>>>>>> SELECT REG_TARGETPATH, REG_ASSOCIATION_TYPE FROM REG_ASSOCIATION
>>>>>>>> WHERE REG_SOURCEPATH='/_system/config/abc1' AND REG_TENANT_ID=0
>>>>>>>> INSERT INTO REG_CONTENT (REG_CONTENT_DATA, REG_TENANT_ID) VALUES
>>>>>>>> ('<Binary InputStream of length 9>', 0)
>>>>>>>> INSERT INTO REG_RESOURCE (REG_PATH_ID, REG_NAME, REG_MEDIA_TYPE,
>>>>>>>> REG_CREATOR, REG_CREATED_TIME, REG_LAST_UPDATOR, REG_LAST_UPDATED_TIME,
>>>>>>>> REG_DESCRIPTION, REG_CONTENT_ID, REG_TENANT_ID) VALUES (4, 'abc1',
>>>>>>>> 'text/plain', 'admin', '02/05/2012 22:05:18.685', 'admin', '02/05/2012
>>>>>>>> 22:12:11.357', 'XXXXXXXX', 106, 0)
>>>>>>>>
>>>>>>>> Notice the red colored lines, it is an execution of a classical
>>>>>>>> deadlocking situation. Where the locked tables (REG_CONTENT, 
>>>>>>>> REG_RESOURCE)
>>>>>>>> are not in the same order in the two sequences. So concurrent threads 
>>>>>>>> can
>>>>>>>> deadlock. The rule of thumb in avoiding deadlocks is, always do the 
>>>>>>>> updates
>>>>>>>> in the same table order, and you will not get a deadlock. Even though 
>>>>>>>> the
>>>>>>>> rows are not the same that are updated in the INSERTS, those inserts 
>>>>>>>> have
>>>>>>>> an auto_increment id, which will do a table wide lock, and will affect 
>>>>>>>> the
>>>>>>>> above delete statements.
>>>>>>>>
>>>>>>>> So in the current way, we just reverse the DELETE statements,
>>>>>>>> because there is a foreign key constraint on it, it has to be deleted 
>>>>>>>> in
>>>>>>>> that order. So we can do one of the following,
>>>>>>>>
>>>>>>>> 1. Remove the foreign key constraint from REG_RESOURCE for
>>>>>>>> REG_CONTENT_ID.
>>>>>>>> 2. Put a cascading delete when defining the REG_RESOURCE, the two
>>>>>>>> deletes then should happen atomically (hopefully).
>>>>>>>> 3. Swap the INSERTs and in the first INSERT to insert the
>>>>>>>> REG_RESOURCE, leave REG_CONTENT_ID empty, then insert the REG_CONTENT, 
>>>>>>>> then
>>>>>>>> do an UPDATE on the earlier inserted REG_RESOURCE to set the 
>>>>>>>> REG_CONTENT_ID.
>>>>>>>>
>>>>>>>> From the above, I guess 3'rd option would be the easiest to
>>>>>>>> implement with less changes.
>>>>>>>>
>>>>>>>> Cheers,
>>>>>>>> Anjana.
>>>>>>>> --
>>>>>>>> *Anjana Fernando*
>>>>>>>> Senior Software Engineer
>>>>>>>> WSO2 Inc. | http://wso2.com
>>>>>>>> lean . enterprise . middleware
>>>>>>>>
>>>>>>>> _______________________________________________
>>>>>>>> Carbon-dev mailing list
>>>>>>>> Carbon-dev@wso2.org
>>>>>>>> http://mail.wso2.org/cgi-bin/mailman/listinfo/carbon-dev
>>>>>>>>
>>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> --
>>>>>>> *Senaka Fernando*
>>>>>>> Product Manager - WSO2 Governance Registry;
>>>>>>> Associate Technical Lead; WSO2 Inc.; http://wso2.com*
>>>>>>> Member; Apache Software Foundation; http://apache.org
>>>>>>>
>>>>>>> E-mail: senaka AT wso2.com
>>>>>>> **P: +1 408 754 7388; ext: 51736*; *M: +94 77 322 1818
>>>>>>> Linked-In: http://linkedin.com/in/senakafernando
>>>>>>>
>>>>>>> *Lean . Enterprise . Middleware
>>>>>>>
>>>>>>>
>>>>>>
>>>>>>
>>>>>> --
>>>>>> *Senaka Fernando*
>>>>>> Product Manager - WSO2 Governance Registry;
>>>>>> Associate Technical Lead; WSO2 Inc.; http://wso2.com*
>>>>>> Member; Apache Software Foundation; http://apache.org
>>>>>>
>>>>>> E-mail: senaka AT wso2.com
>>>>>> **P: +1 408 754 7388; ext: 51736*; *M: +94 77 322 1818
>>>>>> Linked-In: http://linkedin.com/in/senakafernando
>>>>>>
>>>>>> *Lean . Enterprise . Middleware
>>>>>>
>>>>>>
>>>>>
>>>>>
>>>>> --
>>>>> *Senaka Fernando*
>>>>> Product Manager - WSO2 Governance Registry;
>>>>> Associate Technical Lead; WSO2 Inc.; http://wso2.com*
>>>>> Member; Apache Software Foundation; http://apache.org
>>>>>
>>>>> E-mail: senaka AT wso2.com
>>>>> **P: +1 408 754 7388; ext: 51736*; *M: +94 77 322 1818
>>>>> Linked-In: http://linkedin.com/in/senakafernando
>>>>>
>>>>> *Lean . Enterprise . Middleware
>>>>>
>>>>>
>>>>> _______________________________________________
>>>>> Carbon-dev mailing list
>>>>> Carbon-dev@wso2.org
>>>>> http://mail.wso2.org/cgi-bin/mailman/listinfo/carbon-dev
>>>>>
>>>>>
>>>>
>>>>
>>>> --
>>>> *Amila Suriarachchi*
>>>>
>>>> Software Architect
>>>>
>>>> WSO2 Inc. ; http://wso2.com
>>>> lean . enterprise . middleware
>>>>
>>>> phone : +94 71 3082805
>>>>
>>>>
>>>> _______________________________________________
>>>> Carbon-dev mailing list
>>>> Carbon-dev@wso2.org
>>>> http://mail.wso2.org/cgi-bin/mailman/listinfo/carbon-dev
>>>>
>>>>
>>>
>>>
>>> --
>>> *Anjana Fernando*
>>> Senior Software Engineer
>>> WSO2 Inc. | http://wso2.com
>>> lean . enterprise . middleware
>>>
>>> _______________________________________________
>>> Carbon-dev mailing list
>>> Carbon-dev@wso2.org
>>> http://mail.wso2.org/cgi-bin/mailman/listinfo/carbon-dev
>>>
>>>
>>
>>
>> --
>> *Amila Suriarachchi*
>>
>> Software Architect
>> WSO2 Inc. ; http://wso2.com
>> lean . enterprise . middleware
>>
>> phone : +94 71 3082805
>>
>>
>> _______________________________________________
>> Carbon-dev mailing list
>> Carbon-dev@wso2.org
>> http://mail.wso2.org/cgi-bin/mailman/listinfo/carbon-dev
>>
>>
>
>
> --
> *Anjana Fernando*
> Senior Software Engineer
> WSO2 Inc. | http://wso2.com
> lean . enterprise . middleware
>
> _______________________________________________
> Carbon-dev mailing list
> Carbon-dev@wso2.org
> http://mail.wso2.org/cgi-bin/mailman/listinfo/carbon-dev
>
>


-- 
*Senaka Fernando*
Product Manager - WSO2 Governance Registry;
Associate Technical Lead; WSO2 Inc.; http://wso2.com*
Member; Apache Software Foundation; http://apache.org

E-mail: senaka AT wso2.com
**P: +1 408 754 7388; ext: 51736*; *M: +94 77 322 1818
Linked-In: http://linkedin.com/in/senakafernando

*Lean . Enterprise . Middleware
_______________________________________________
Carbon-dev mailing list
Carbon-dev@wso2.org
http://mail.wso2.org/cgi-bin/mailman/listinfo/carbon-dev

Reply via email to