Skip to content

Commit

Permalink
Stop using blake2s to calulate lock identifiers
Browse files Browse the repository at this point in the history
Instead perform a simple xor on the first and second half of the task
uuid.

backports #9249

fixes #9288

(cherry picked from commit 1d77e5c)
  • Loading branch information
mdellweg committed Aug 25, 2021
1 parent 371c5ec commit b995a66
Show file tree
Hide file tree
Showing 3 changed files with 5 additions and 11 deletions.
2 changes: 2 additions & 0 deletions CHANGES/9288.bugfix
@@ -0,0 +1,2 @@
Stop using insecure hash function blake2s for calculating 64 bit lock identifier from uuid.
(backported from #9249)
8 changes: 3 additions & 5 deletions pulpcore/app/models/task.py
Expand Up @@ -7,7 +7,6 @@
from contextlib import suppress
from datetime import timedelta
from gettext import gettext as _
from hashlib import blake2s

from django.contrib.postgres.fields import JSONField, ArrayField
from django.db import connection, models
Expand Down Expand Up @@ -209,9 +208,8 @@ def save_heartbeat(self):
self.save(update_fields=["last_heartbeat"])


def _hash_to_u64(value):
_digest = blake2s(value.encode(), digest_size=8).digest()
return int.from_bytes(_digest, byteorder="big", signed=True)
def _uuid_to_advisory_lock(value):
return ((value >> 64) ^ value) & 0x7FFFFFFFFFFFFFFF


class TaskManager(models.Manager):
Expand Down Expand Up @@ -286,7 +284,7 @@ def __str__(self):
return "Task: {name} [{state}]".format(name=self.name, state=self.state)

def __enter__(self):
self.lock = _hash_to_u64(str(self.pk))
self.lock = _uuid_to_advisory_lock(self.pk.int)
with connection.cursor() as cursor:
cursor.execute("SELECT pg_try_advisory_lock(%s);", [self.lock])
acquired = cursor.fetchone()[0]
Expand Down
6 changes: 0 additions & 6 deletions pulpcore/tasking/util.py
@@ -1,6 +1,5 @@
import logging
import time
from hashlib import blake2s
from gettext import gettext as _

from django.conf import settings
Expand Down Expand Up @@ -140,8 +139,3 @@ def get_current_worker():
return worker

return None


def _hash_to_u64(value):
_digest = blake2s(value.encode(), digest_size=8).digest()
return int.from_bytes(_digest, byteorder="big", signed=True)

0 comments on commit b995a66

Please sign in to comment.