diff --git a/docker_registry/lib/index/db.py b/docker_registry/lib/index/db.py index 2de062f20..5975ec239 100644 --- a/docker_registry/lib/index/db.py +++ b/docker_registry/lib/index/db.py @@ -4,6 +4,7 @@ """ from ... import storage +from ... import toolkit from .. import config from . import Index import sqlalchemy @@ -61,6 +62,7 @@ def __init__(self, database=None): self._setup_database() super(SQLAlchemyIndex, self).__init__() + @toolkit.exclusive_lock def _setup_database(self): session = self._session() if self._engine.has_table(table_name=Version.__tablename__): diff --git a/docker_registry/toolkit.py b/docker_registry/toolkit.py index 70584bec8..865531b4c 100644 --- a/docker_registry/toolkit.py +++ b/docker_registry/toolkit.py @@ -4,6 +4,7 @@ import distutils.version import functools import logging +import os import random import re import string @@ -278,6 +279,22 @@ def wrapper(repository, *args, **kwargs): return wrapper +def exclusive_lock(f): + @functools.wraps(f) + def wrapper(*args, **kwargs): + lock_path = os.path.join( + '/var/lock', 'registry.{0}.lock'.format(f.func_name) + ) + if os.path.exists(lock_path): + return + lock_file = open(lock_path, 'w') + lock_file.close() + result = f(*args, **kwargs) + os.remove(lock_path) + return result + return wrapper + + def get_repository(): auth = flask.request.headers.get('authorization', '') if not auth: