diff options
Diffstat (limited to 'bitbake/lib/bb')
-rwxr-xr-x | bitbake/lib/bb/main.py | 9 | ||||
-rw-r--r-- | bitbake/lib/bb/server/process.py | 53 |
2 files changed, 37 insertions, 25 deletions
diff --git a/bitbake/lib/bb/main.py b/bitbake/lib/bb/main.py index 6294b85cfd..1e38d04bcf 100755 --- a/bitbake/lib/bb/main.py +++ b/bitbake/lib/bb/main.py | |||
@@ -422,7 +422,7 @@ def setup_bitbake(configParams, extrafeatures=None): | |||
422 | retries = 8 | 422 | retries = 8 |
423 | while retries: | 423 | while retries: |
424 | try: | 424 | try: |
425 | topdir, lock = lockBitbake() | 425 | topdir, lock, lockfile = lockBitbake() |
426 | sockname = topdir + "/bitbake.sock" | 426 | sockname = topdir + "/bitbake.sock" |
427 | if lock: | 427 | if lock: |
428 | if configParams.status_only or configParams.kill_server: | 428 | if configParams.status_only or configParams.kill_server: |
@@ -439,12 +439,15 @@ def setup_bitbake(configParams, extrafeatures=None): | |||
439 | logger.info("Reconnecting to bitbake server...") | 439 | logger.info("Reconnecting to bitbake server...") |
440 | if not os.path.exists(sockname): | 440 | if not os.path.exists(sockname): |
441 | logger.info("Previous bitbake instance shutting down?, waiting to retry... (%s)" % timestamp()) | 441 | logger.info("Previous bitbake instance shutting down?, waiting to retry... (%s)" % timestamp()) |
442 | procs = bb.server.process.get_lockfile_process_msg(lockfile) | ||
443 | if procs: | ||
444 | logger.info("Processes holding bitbake.lock:\n%s" % procs) | ||
442 | i = 0 | 445 | i = 0 |
443 | lock = None | 446 | lock = None |
444 | # Wait for 5s or until we can get the lock | 447 | # Wait for 5s or until we can get the lock |
445 | while not lock and i < 50: | 448 | while not lock and i < 50: |
446 | time.sleep(0.1) | 449 | time.sleep(0.1) |
447 | _, lock = lockBitbake() | 450 | _, lock, _ = lockBitbake() |
448 | i += 1 | 451 | i += 1 |
449 | if lock: | 452 | if lock: |
450 | bb.utils.unlockfile(lock) | 453 | bb.utils.unlockfile(lock) |
@@ -494,5 +497,5 @@ def lockBitbake(): | |||
494 | bb.error("Unable to find conf/bblayers.conf or conf/bitbake.conf. BBPATH is unset and/or not in a build directory?") | 497 | bb.error("Unable to find conf/bblayers.conf or conf/bitbake.conf. BBPATH is unset and/or not in a build directory?") |
495 | raise BBMainFatal | 498 | raise BBMainFatal |
496 | lockfile = topdir + "/bitbake.lock" | 499 | lockfile = topdir + "/bitbake.lock" |
497 | return topdir, bb.utils.lockfile(lockfile, False, False) | 500 | return topdir, bb.utils.lockfile(lockfile, False, False), lockfile |
498 | 501 | ||
diff --git a/bitbake/lib/bb/server/process.py b/bitbake/lib/bb/server/process.py index afd77ac0a5..f4ab80ba67 100644 --- a/bitbake/lib/bb/server/process.py +++ b/bitbake/lib/bb/server/process.py | |||
@@ -41,6 +41,35 @@ def serverlog(msg): | |||
41 | print(str(os.getpid()) + " " + datetime.datetime.now().strftime('%H:%M:%S.%f') + " " + msg) | 41 | print(str(os.getpid()) + " " + datetime.datetime.now().strftime('%H:%M:%S.%f') + " " + msg) |
42 | sys.stdout.flush() | 42 | sys.stdout.flush() |
43 | 43 | ||
44 | # | ||
45 | # When we have lockfile issues, try and find infomation about which process is | ||
46 | # using the lockfile | ||
47 | # | ||
48 | def get_lockfile_process_msg(lockfile): | ||
49 | # Some systems may not have lsof available | ||
50 | procs = None | ||
51 | try: | ||
52 | procs = subprocess.check_output(["lsof", '-w', lockfile], stderr=subprocess.STDOUT) | ||
53 | except subprocess.CalledProcessError: | ||
54 | # File was deleted? | ||
55 | pass | ||
56 | except OSError as e: | ||
57 | if e.errno != errno.ENOENT: | ||
58 | raise | ||
59 | if procs is None: | ||
60 | # Fall back to fuser if lsof is unavailable | ||
61 | try: | ||
62 | procs = subprocess.check_output(["fuser", '-v', lockfile], stderr=subprocess.STDOUT) | ||
63 | except subprocess.CalledProcessError: | ||
64 | # File was deleted? | ||
65 | pass | ||
66 | except OSError as e: | ||
67 | if e.errno != errno.ENOENT: | ||
68 | raise | ||
69 | if procs: | ||
70 | return procs.decode("utf-8") | ||
71 | return None | ||
72 | |||
44 | class ProcessServer(): | 73 | class ProcessServer(): |
45 | profile_filename = "profile.log" | 74 | profile_filename = "profile.log" |
46 | profile_processed_filename = "profile.log.processed" | 75 | profile_processed_filename = "profile.log.processed" |
@@ -306,30 +335,10 @@ class ProcessServer(): | |||
306 | return | 335 | return |
307 | 336 | ||
308 | if not lock: | 337 | if not lock: |
309 | # Some systems may not have lsof available | 338 | procs = get_lockfile_process_msg(lockfile) |
310 | procs = None | ||
311 | try: | ||
312 | procs = subprocess.check_output(["lsof", '-w', lockfile], stderr=subprocess.STDOUT) | ||
313 | except subprocess.CalledProcessError: | ||
314 | # File was deleted? | ||
315 | continue | ||
316 | except OSError as e: | ||
317 | if e.errno != errno.ENOENT: | ||
318 | raise | ||
319 | if procs is None: | ||
320 | # Fall back to fuser if lsof is unavailable | ||
321 | try: | ||
322 | procs = subprocess.check_output(["fuser", '-v', lockfile], stderr=subprocess.STDOUT) | ||
323 | except subprocess.CalledProcessError: | ||
324 | # File was deleted? | ||
325 | continue | ||
326 | except OSError as e: | ||
327 | if e.errno != errno.ENOENT: | ||
328 | raise | ||
329 | |||
330 | msg = ["Delaying shutdown due to active processes which appear to be holding bitbake.lock"] | 339 | msg = ["Delaying shutdown due to active processes which appear to be holding bitbake.lock"] |
331 | if procs: | 340 | if procs: |
332 | msg.append(":\n%s" % str(procs.decode("utf-8"))) | 341 | msg.append(":\n%s" % procs) |
333 | serverlog("".join(msg)) | 342 | serverlog("".join(msg)) |
334 | 343 | ||
335 | def idle_commands(self, delay, fds=None): | 344 | def idle_commands(self, delay, fds=None): |