[PATCH 8/9] parser: use Patch.objects.create instead of save()
Andrew Donnellan
andrew.donnellan at au1.ibm.com
Thu Feb 22 15:50:02 AEDT 2018
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.
>
> 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>
> ---
> 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