Learn more about these different git repos.
Other Git URLs
014e9ae
8821f98
@@ -1578,24 +1578,30 @@
# Prepare module name
mod_name = "__%s__%s" % (__name__, profile_name)
- # Check if profile module exists and if so return it
- if mod_name in PROFILE_MODULES:
- return PROFILE_MODULES[mod_name]
-
- # Load current module under a new name
- koji_module_loc = imp.find_module(__name__)
- mod = imp.load_module(mod_name,
- None,
- koji_module_loc[1],
- koji_module_loc[2])
- # Tweak config of the new module
- mod.config = config
- mod.BASEDIR = config.topdir
- mod.pathinfo.topdir = config.topdir
- # Be sure that get_profile_module is only called from main module
- mod.get_profile_module = get_profile_module
+ imp.acquire_lock()
+ try:
+ # Check if profile module exists and if so return it
+ if mod_name in PROFILE_MODULES:
+ return PROFILE_MODULES[mod_name]
+
+ # Load current module under a new name
+ koji_module_loc = imp.find_module(__name__)
+ mod = imp.load_module(mod_name,
+ None,
+ koji_module_loc[1],
+ koji_module_loc[2])
+ # Tweak config of the new module
+ mod.config = config
+ mod.BASEDIR = config.topdir
+ mod.pathinfo.topdir = config.topdir
+ # Be sure that get_profile_module is only called from main module
+ mod.get_profile_module = get_profile_module
+ PROFILE_MODULES[mod_name] = mod
+ finally:
+ imp.release_lock()
return mod
@@ -0,0 +1,41 @@
+ import unittest
+ import koji
+ import sys
+ import threading
+ import traceback
+ class ProfilesTestCase(unittest.TestCase):
+ def test_profile_threading(self):
+ """ Test that profiles thread safe"""
+ # see: https://pagure.io/koji/issue/58 and https://pagure.io/pungi/issue/253
+ # loop a few times to increase chances of hitting race conditions
+ for i in range(20):
+ errors = {}
+ threads = [threading.Thread(target=stress, args=(errors, _)) for _ in xrange(100)]
+ for t in threads:
+ t.start()
+ t.join(30)
+ for n in errors:
+ err = errors[n]
+ if err is not None:
+ print err
+ assert False
+ def stress(errors, n):
+ errors[n] = "Failed to start"
+ koji.get_profile_module('koji')
+ except Exception:
+ # if we don't catch this, nose seems to ignore the test
+ errors[n] = ''.join(traceback.format_exception(*sys.exc_info()))
+ return
+ else:
+ errors[n] = None
fixes issue#58
Awesome. :+1:
Pull-Request has been rebased
Pull-Request has been merged by mikem