summaryrefslogtreecommitdiff
path: root/patchwork/parser.py
diff options
context:
space:
mode:
authorDaniel Axtens <dja@axtens.net>2018-02-18 12:57:03 +1100
committerDaniel Axtens <daniel.axtens@canonical.com>2018-03-07 01:24:18 +1100
commit26e9c2a61c5d2dbd13d9e53f8547119b169e0780 (patch)
tree599137a7f3adf8c7b1323e8038a8593c0ad8c90f /patchwork/parser.py
parentfa535a8e2209e13abf2ef3d42514681e2abb3777 (diff)
downloadpatchwork-26e9c2a61c5d2dbd13d9e53f8547119b169e0780.tar
patchwork-26e9c2a61c5d2dbd13d9e53f8547119b169e0780.tar.gz
parser: use Patch.objects.create instead of save()
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. 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. Reviewed-by: Andrew Donnellan <andrew.donnellan@au1.ibm.com> Reviewed-by: Stephen Finucane <stephen@that.guru> Signed-off-by: Daniel Axtens <dja@axtens.net>
Diffstat (limited to 'patchwork/parser.py')
-rw-r--r--patchwork/parser.py29
1 files changed, 14 insertions, 15 deletions
diff --git a/patchwork/parser.py b/patchwork/parser.py
index 6c71603..84400f7 100644
--- a/patchwork/parser.py
+++ b/patchwork/parser.py
@@ -994,6 +994,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
@@ -1034,21 +1048,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)