This is an automated email from the ASF dual-hosted git repository. lfrolov pushed a commit to branch DATALAB-2396 in repository https://gitbox.apache.org/repos/asf/incubator-datalab.git
commit ef85349c4e29c1db9e46e409290a043c6dac5913 Author: leonidfrolov <[email protected]> AuthorDate: Thu Aug 19 15:50:02 2021 +0300 [DATALAB-1527]: remade dpkg/apt lock handling --- .../src/general/lib/os/debian/common_lib.py | 120 ++++++++++++++------- 1 file changed, 81 insertions(+), 39 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 29b504b..28c3bb5 100644 --- a/infrastructure-provisioning/src/general/lib/os/debian/common_lib.py +++ b/infrastructure-provisioning/src/general/lib/os/debian/common_lib.py @@ -29,6 +29,72 @@ import os import time import subprocess import datalab.fab +def handle_dpkg_lock(error, parser, rerun=False): + try: + count = 0 + 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 != '': + datalab.fab.conn.sudo('kill -9 {}'.format(pid)) + datalab.fab.conn.sudo('rm -f /var/lib/dpkg/lock-frontend') + + pid = datalab.fab.conn.sudo('lsof /var/lib/dpkg/lock | grep dpkg | awk \'{print $2}\'').stdout.replace('\n', '') + if pid != '': + datalab.fab.conn.sudo('kill -9 {}'.format(pid)) + datalab.fab.conn.sudo('rm -f /var/lib/dpkg/lock') + + if rerun: + datalab.fab.conn.sudo('dpkg --configure -a 2>&1 | tee /tmp/tee.tmp; if ! grep -w -E "({0})" /tmp/tee.tmp > ' + '/tmp/dpkg.log; then echo "no_lock" > /tmp/dpkg.log;fi'.format(parser)) + error = datalab.fab.conn.sudo('cat /tmp/dpkg.log').stdout + else: + error = 'no_lock' + + count = count + 1 + except: + sys.exit(1) + +def handle_apt_lock(error, parser, rerun=False): + try: + count = 0 + 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 != '': + datalab.fab.conn.sudo('kill -9 {}'.format(pid)) + datalab.fab.conn.sudo('rm -f /var/lib/apt/lists/lock') + + if rerun: + datalab.fab.conn.sudo('apt update 2>&1 | tee /tmp/tee.tmp; if ! grep -w -E "({0})" /tmp/tee.tmp > ' + '/tmp/apt.log; then echo "no_lock" > /tmp/apt.log;fi'.format(parser)) + error = datalab.fab.conn.sudo('cat /tmp/apt.log').stdout + else: + error = 'no_lock' + + count = count + 1 + except: + sys.exit(1) + +def handle_apt_get_lock(error, command, requisites, parser, rerun=False): + try: + count = 0 + 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') + datalab.fab.conn.sudo('lsof /var/cache/apt/archives/lock') + datalab.fab.conn.sudo('rm -f /var/lib/apt/lists/lock') + datalab.fab.conn.sudo('rm -f /var/cache/apt/archives/lock') + datalab.fab.conn.sudo('rm -f /var/lib/dpkg/lock') + + if rerun: + datalab.fab.conn.sudo('apt-get {0} {1} 2>&1 | tee /tmp/tee.tmp; if ! grep -w -E "({2})" /tmp/tee.tmp > ' + '/tmp/apt.log; then echo "no_lock" > /tmp/apt.log;fi'.format(command, requisites, parser)) + error = datalab.fab.conn.sudo('cat /tmp/apt.log').stdout + else: + error = 'no_lock' + + count = count + 1 + except: + sys.exit(1) def manage_pkg(command, environment, requisites): try: @@ -49,52 +115,28 @@ def manage_pkg(command, environment, requisites): error_parser = "frontend is locked|locked|not get lock|unavailable" datalab.fab.conn.sudo('dpkg --configure -a 2>&1 | tee /tmp/tee.tmp; if ! grep -w -E "({0})" /tmp/tee.tmp > ' - '/tmp/dpkg.log; then echo "no_error" > /tmp/dpkg.log;fi'.format(error_parser)) + '/tmp/dpkg.log; then echo "no_lock" > /tmp/dpkg.log;fi'.format(error_parser)) err = datalab.fab.conn.sudo('cat /tmp/dpkg.log').stdout.replace('\n','') - count = 0 - while 'no_error' not in err and count < 10: - pid = datalab.fab.conn.sudo('lsof /var/lib/dpkg/lock-frontend | grep dpkg | awk \'{print $2}\'').stdout.replace('\n','') - if pid != '': - datalab.fab.conn.sudo('kill -9 {}'.format(pid)) - datalab.fab.conn.sudo('rm -f /var/lib/dpkg/lock-frontend') - pid = datalab.fab.conn.sudo('lsof /var/lib/dpkg/lock | grep dpkg | awk \'{print $2}\'').stdout.replace('\n','') - if pid != '': - datalab.fab.conn.sudo('kill -9 {}'.format(pid)) - datalab.fab.conn.sudo('rm -f /var/lib/dpkg/lock') - datalab.fab.conn.sudo('dpkg --configure -a 2>&1 | tee /tmp/tee.tmp; if ! grep -w -E "({0})" /tmp/tee.tmp > ' - '/tmp/dpkg.log; then echo "no_error" > /tmp/dpkg.log;fi'.format(error_parser)) - err = datalab.fab.conn.sudo('cat /tmp/dpkg.log').stdout - count = count + 1 + if 'no_lock' not in err: + handle_dpkg_lock(err, error_parser, rerun=True) + datalab.fab.conn.sudo('apt update 2>&1 | tee /tmp/tee.tmp; if ! grep -w -E "({0})" /tmp/tee.tmp > ' - '/tmp/apt.log; then echo "no_error" > /tmp/apt.log;fi'.format(error_parser)) + '/tmp/apt.log; then echo "no_lock" > /tmp/apt.log;fi'.format(error_parser)) err = datalab.fab.conn.sudo('cat /tmp/apt.log').stdout - count = 0 - while 'no_error' not in err and count < 10: - pid = datalab.fab.conn.sudo('lsof /var/lib/apt/lists/lock | grep apt | awk \'{print $2}\'').stdout.replace('\n','') - if pid != '': - datalab.fab.conn.sudo('kill -9 {}'.format(pid)) - datalab.fab.conn.sudo('rm -f /var/lib/apt/lists/lock') - datalab.fab.conn.sudo('apt update 2>&1 | tee /tmp/tee.tmp; if ! grep -w -E "({0})" /tmp/tee.tmp > ' - '/tmp/apt.log; then echo "" > /tmp/apt.log;fi'.format(error_parser)) - err = datalab.fab.conn.sudo('cat /tmp/apt.log').stdout - count = count + 1 + if 'no_lock' not in err: + handle_dpkg_lock(err, error_parser) + handle_apt_lock(err, error_parser, rerun=True) datalab.fab.conn.sudo('apt-get {0} {1} 2>&1 | tee /tmp/tee.tmp; if ! grep -w -E "({2})" /tmp/tee.tmp > ' - '/tmp/apt-get.log; then echo "no_error" > /tmp/apt-get.log;fi'.format(command, requisites, error_parser)) + '/tmp/apt-get.log; then echo "no_lock" > /tmp/apt-get.log;fi'.format(command, requisites, error_parser)) err = datalab.fab.conn.sudo('cat /tmp/apt-get.log').stdout - count = 0 - while 'no_error' not in err and count < 10: - datalab.fab.conn.sudo('lsof /var/lib/dpkg/lock') - datalab.fab.conn.sudo('lsof /var/lib/apt/lists/lock') - datalab.fab.conn.sudo('lsof /var/cache/apt/archives/lock') - datalab.fab.conn.sudo('rm -f /var/lib/apt/lists/lock') - datalab.fab.conn.sudo('rm -f /var/cache/apt/archives/lock') - datalab.fab.conn.sudo('rm -f /var/lib/dpkg/lock') - datalab.fab.conn.sudo('apt-get {0} {1} 2>&1 | tee /tmp/tee.tmp; if ! grep -w -E "({2})" /tmp/tee.tmp > ' - '/tmp/apt.log; then echo "no_error" > /tmp/apt.log;fi'.format(command, requisites, error_parser)) - err = datalab.fab.conn.sudo('cat /tmp/apt.log').stdout - count = count + 1 + + if 'no_lock' not in err: + handle_dpkg_lock(err, error_parser) + handle_apt_lock(err, error_parser) + handle_apt_get_lock(err, command, requisites, error_parser, rerun=True) + allow = True except Exception as err: traceback.print_exc() --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
