You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@datalab.apache.org by lf...@apache.org on 2021/09/03 07:48:04 UTC
[incubator-datalab] 01/01: [DATALAB-1527]: changed lock handling
This is an automated email from the ASF dual-hosted git repository.
lfrolov pushed a commit to branch DATALAB-1527
in repository https://gitbox.apache.org/repos/asf/incubator-datalab.git
commit 0546edcf154a95c7b78b4876dcdefea81a8aeb3d
Author: leonidfrolov <fr...@gmail.com>
AuthorDate: Fri Sep 3 10:47:44 2021 +0300
[DATALAB-1527]: changed lock handling
---
.../src/general/lib/os/debian/common_lib.py | 41 +++++++++++++++-------
1 file changed, 28 insertions(+), 13 deletions(-)
diff --git a/infrastructure-provisioning/src/general/lib/os/debian/common_lib.py b/infrastructure-provisioning/src/general/lib/os/debian/common_lib.py
index da8cc4c..1263904 100644
--- a/infrastructure-provisioning/src/general/lib/os/debian/common_lib.py
+++ b/infrastructure-provisioning/src/general/lib/os/debian/common_lib.py
@@ -32,6 +32,12 @@ import datalab.fab
def handle_dpkg_lock(error, rerun=False):
try:
count = 0
+ if 'E: Could not get lock ' and 'It is held by process ' in err:
+ log = datalab.fab.conn.sudo('cat /tmp/dpkg.log | grep "E: Could not get lock"').stdout
+ lock_path = log.split('\n')[0][22:log.find('.')]
+ pid = log.split('\n')[0][log.find('It is held by process ') + 22:].split(' ')[0]
+ datalab.fab.conn.sudo('kill -9 {}'.format(pid))
+ datalab.fab.conn.sudo('rm -f {}'.format(lock_path))
while 'no_lock' not in error and count < 10:
pid = datalab.fab.conn.sudo('lsof /var/lib/dpkg/lock-frontend | grep dpkg | awk \'{print $2}\'').stdout.replace( '\n', '')
if pid != '':
@@ -53,18 +59,23 @@ def handle_dpkg_lock(error, rerun=False):
'else cat /tmp/tee.tmp >> /tmp/dpkg.log;fi'.format(lock_parser,
error_parser))
error = datalab.fab.conn.sudo('cat /tmp/dpkg.log').stdout
- if 'no_error' not in error:
- raise Exception
else:
error = 'no_lock'
-
count = count + 1
+ if 'no_error' not in error:
+ raise Exception
except:
sys.exit(1)
def handle_apt_lock(error, rerun=False):
try:
count = 0
+ if 'E: Could not get lock ' and 'It is held by process ' in err:
+ log = datalab.fab.conn.sudo('cat /tmp/apt.log | grep "E: Could not get lock"').stdout
+ lock_path = log.split('\n')[0][22:log.find('.')]
+ pid = log.split('\n')[0][log.find('It is held by process ') + 22:].split(' ')[0]
+ datalab.fab.conn.sudo('kill -9 {}'.format(pid))
+ datalab.fab.conn.sudo('rm -f {}'.format(lock_path))
while 'no_lock' not in error and count < 10:
pid = datalab.fab.conn.sudo('lsof /var/lib/apt/lists/lock | grep apt | awk \'{print $2}\'').stdout.replace('\n', '')
if pid != '':
@@ -81,18 +92,23 @@ def handle_apt_lock(error, rerun=False):
'else cat /tmp/tee.tmp >> /tmp/apt.log;fi'.format(lock_parser,
error_parser))
error = datalab.fab.conn.sudo('cat /tmp/apt.log').stdout
- if 'no_error' not in error:
- raise Exception
else:
error = 'no_lock'
-
count = count + 1
+ if 'no_error' not in error:
+ raise Exception
except:
sys.exit(1)
def handle_apt_get_lock(error, rerun=False):
try:
count = 0
+ if 'E: Could not get lock ' and 'It is held by process ' in err:
+ log = datalab.fab.conn.sudo('cat /tmp/apt.log | grep "E: Could not get lock"').stdout
+ lock_path = log.split('\n')[0][22:log.find('.')]
+ pid = log.split('\n')[0][log.find('It is held by process ') + 22:].split(' ')[0]
+ datalab.fab.conn.sudo('kill -9 {}'.format(pid))
+ datalab.fab.conn.sudo('rm -f {}'.format(lock_path))
while 'no_lock' not in error and count < 10:
datalab.fab.conn.sudo('lsof /var/lib/dpkg/lock')
datalab.fab.conn.sudo('lsof /var/lib/apt/lists/lock')
@@ -113,12 +129,11 @@ def handle_apt_get_lock(error, rerun=False):
lock_parser,
error_parser))
error = datalab.fab.conn.sudo('cat /tmp/apt_get.log').stdout
- if 'no_error' not in error:
- raise Exception
else:
error = 'no_lock'
-
count = count + 1
+ if 'no_error' not in error:
+ raise Exception
except:
sys.exit(1)
@@ -149,9 +164,9 @@ def manage_pkg(command, environment, requisites):
'then echo "no_error" >> /tmp/dpkg.log; '
'else cat /tmp/tee.tmp >> /tmp/dpkg.log;fi'.format(lock_parser,
error_parser))
- err = datalab.fab.conn.sudo('cat /tmp/dpkg.log').stdout.replace('\n','')
+ err = datalab.fab.conn.sudo('cat /tmp/dpkg.log').stdout
if 'no_lock' not in err:
- handle_dpkg_lock(err, lock_parser, rerun=True)
+ handle_dpkg_lock(err, rerun=True)
datalab.fab.conn.sudo('apt update 2>&1 | tee /tmp/tee.tmp; '
'if ! grep -w -E "({0})" /tmp/tee.tmp; '
@@ -163,8 +178,8 @@ def manage_pkg(command, environment, requisites):
error_parser))
err = datalab.fab.conn.sudo('cat /tmp/apt.log').stdout
if 'no_lock' not in err:
- handle_dpkg_lock(err, lock_parser)
- handle_apt_lock(err, lock_parser, rerun=True)
+ handle_dpkg_lock(err)
+ handle_apt_lock(err, rerun=True)
datalab.fab.conn.sudo('apt-get {0} {1} 2>&1 | tee /tmp/tee.tmp; '
'if ! grep -w -E "({2})" /tmp/tee.tmp; '
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@datalab.apache.org
For additional commands, e-mail: commits-help@datalab.apache.org