We have an update.py running perodically in background, but we also need run it manually, for example, run it to update actual_branch, the manually run usually failed because can't get lockfile, we have to run it again and again. A timeout option helps a lot in such a case. Now the following command can make sure we can run the command successfully: $ update.py -b master -a actual_branch -t 2000
Signed-off-by: Robert Yang <liezhi.y...@windriver.com> --- layerindex/update.py | 5 ++++- layerindex/utils.py | 14 +++++++++++--- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/layerindex/update.py b/layerindex/update.py index 07240ab..e4ca7b6 100755 --- a/layerindex/update.py +++ b/layerindex/update.py @@ -156,6 +156,9 @@ def main(): parser.add_option("-l", "--layer", help = "Specify layers to update (use commas to separate multiple). Default is all published layers.", action="store", dest="layers") + parser.add_option("-t", "--timeout", + help = "Specify timeout in seconds to get layerindex.lock. Default is 30 seconds.", + type="int", action="store", dest="timeout", default=30) parser.add_option("-r", "--reload", help = "Reload recipe data instead of updating since last update", action="store_true", dest="reload") @@ -265,7 +268,7 @@ def main(): update.save() try: lockfn = os.path.join(fetchdir, "layerindex.lock") - lockfile = utils.lock_file(lockfn) + lockfile = utils.lock_file(lockfn, options.timeout, logger) if not lockfile: logger.error("Layer index lock timeout expired") sys.exit(1) diff --git a/layerindex/utils.py b/layerindex/utils.py index 08a4001..ebcfcaf 100644 --- a/layerindex/utils.py +++ b/layerindex/utils.py @@ -309,8 +309,10 @@ class ListHandler(logging.Handler): return log -def lock_file(fn): - starttime = time.time() +def lock_file(fn, timeout=30, logger=None): + start = time.time() + last = start + counter = 1 while True: lock = open(fn, 'w') try: @@ -318,8 +320,14 @@ def lock_file(fn): return lock except IOError: lock.close() - if time.time() - starttime > 30: + current = time.time() + if current - start > timeout: return None + # Print a message in every 5 seconds + if logger and (current - last > 5): + last = current + logger.info('Trying to get lock on %s (tried %s seconds) ...' % (fn, (5 * counter))) + counter += 1 def unlock_file(lock): fcntl.flock(lock, fcntl.LOCK_UN) -- 2.7.4 -- _______________________________________________ yocto mailing list yocto@yoctoproject.org https://lists.yoctoproject.org/listinfo/yocto