[PATCH 8/9] parser: use Patch.objects.create instead of save()

Daniel Axtens dja at axtens.net
Sun Feb 25 01:26:17 AEDT 2018


Andrew Donnellan <andrew.donnellan at au1.ibm.com> writes:

> On 22/02/18 01:17, Daniel Axtens wrote:
>> Attempts to do parallel parsing with MySQL threw the following errors:
>> 
>> _mysql_exceptions.OperationalError: (1213, 'Deadlock found when trying to get lock; try restarting transaction')
>> 
>> Looking at the code, it was thrown when we created a patch like this:
>> 
>> patch = Patch(...)
>> patch.save()
>> 
>> The SQL statements that were being generated were weird:
>> 
>> UPDATE "patchwork_patch" SET ...
>> INSERT INTO "patchwork_patch" (...) VALUES (...)
>> 
>> As far as I can tell, the update could never work, because it was
>> trying to update a patch that didn't exist yet. My hypothesis is
>> that Django somehow didn't quite 'get' that because of the backend
>> complexity of the Patch model, so it tried to do an update, failed,
>> and then tried an insert.
>
> Backend complexity... subclassing bug or something? Hmm.

This is definitely my suspicion but I have 0 interest in finding out: I
really want to denormalise some data and squish some of the class
hierarchy for performance reasons - so hopefully the relevant code goes
away soon anyway.

>> 
>> Change the code to use Patch.objects.create, which makes the UPDATEs
>> and the weird MySQL errors go away.
>> 
>> Also move it up a bit earlier in the process so that if things go wrong
>> later at least we've committed the patch to the db.
>> 
>> Signed-off-by: Daniel Axtens <dja at axtens.net>
>
> In any case, objects.create() is stylistically nicer imho.
>
> I definitely think we should commit the patch to the database before 
> Series...
>
> Reviewed-by: Andrew Donnellan <andrew.donnellan at au1.ibm.com>

Thanks!

Regards,
Daniel

>> ---
>>   patchwork/parser.py | 29 ++++++++++++++---------------
>>   1 file changed, 14 insertions(+), 15 deletions(-)
>> 
>> diff --git a/patchwork/parser.py b/patchwork/parser.py
>> index 3d40b74375e0..0e53e6b9a3af 100644
>> --- a/patchwork/parser.py
>> +++ b/patchwork/parser.py
>> @@ -984,6 +984,20 @@ def parse_mail(mail, list_id=None):
>>               filenames = find_filenames(diff)
>>               delegate = find_delegate_by_filename(project, filenames)
>> 
>> +        patch = Patch.objects.create(
>> +            msgid=msgid,
>> +            project=project,
>> +            name=name[:255],
>> +            date=date,
>> +            headers=headers,
>> +            submitter=author,
>> +            content=message,
>> +            diff=diff,
>> +            pull_url=pull_url,
>> +            delegate=delegate,
>> +            state=find_state(mail))
>> +        logger.debug('Patch saved')
>> +
>>           # if we don't have a series marker, we will never have an existing
>>           # series to match against.
>>           series = None
>> @@ -1024,21 +1038,6 @@ def parse_mail(mail, list_id=None):
>>                   except SeriesReference.DoesNotExist:
>>                       SeriesReference.objects.create(series=series, msgid=ref)
>> 
>> -        patch = Patch(
>> -            msgid=msgid,
>> -            project=project,
>> -            name=name[:255],
>> -            date=date,
>> -            headers=headers,
>> -            submitter=author,
>> -            content=message,
>> -            diff=diff,
>> -            pull_url=pull_url,
>> -            delegate=delegate,
>> -            state=find_state(mail))
>> -        patch.save()
>> -        logger.debug('Patch saved')
>> -
>>           # add to a series if we have found one, and we have a numbered
>>           # patch. Don't add unnumbered patches (for example diffs sent
>>           # in reply, or just messages with random refs/in-reply-tos)
>> 
>
> -- 
> Andrew Donnellan              OzLabs, ADL Canberra
> andrew.donnellan at au1.ibm.com  IBM Australia Limited


More information about the Patchwork mailing list