From owner-svn-src-projects@FreeBSD.ORG Sat May 28 05:40:20 2011 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 50719106566C; Sat, 28 May 2011 05:40:20 +0000 (UTC) (envelope-from linimon@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 402348FC08; Sat, 28 May 2011 05:40:20 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id p4S5eKvg070079; Sat, 28 May 2011 05:40:20 GMT (envelope-from linimon@svn.freebsd.org) Received: (from linimon@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id p4S5eKIv070077; Sat, 28 May 2011 05:40:20 GMT (envelope-from linimon@svn.freebsd.org) Message-Id: <201105280540.p4S5eKIv070077@svn.freebsd.org> From: Mark Linimon Date: Sat, 28 May 2011 05:40:20 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r222405 - projects/portbuild/scripts X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 28 May 2011 05:40:20 -0000 Author: linimon (doc,ports committer) Date: Sat May 28 05:40:19 2011 New Revision: 222405 URL: http://svn.freebsd.org/changeset/base/222405 Log: Big rework to attmempt to clean up hanging mounts of vanished chroots. While here, attempt to remove builds that are now stale, as well. Modified: projects/portbuild/scripts/cleanup-chroots Modified: projects/portbuild/scripts/cleanup-chroots ============================================================================== --- projects/portbuild/scripts/cleanup-chroots Sat May 28 05:28:00 2011 (r222404) +++ projects/portbuild/scripts/cleanup-chroots Sat May 28 05:40:19 2011 (r222405) @@ -9,6 +9,8 @@ pbd=${PORTBUILD_DATA:-/var/portbuild} +VERBOSE=1 + kill_procs() { dir=$1 @@ -25,6 +27,7 @@ kill_procs() done } +# clean up a single mount cleanup_mount() { chroot=$1 mount=$2 @@ -41,60 +44,114 @@ cleanup_mount() { fi } +# cleanup all mounts (old NFS, devfs, linux), as well as mds +cleanup_all() { + chroot=$1 + + mounts=$(mount | grep ${chroot} | awk '{print $3}') + if [ ! -z "${mounts}" ]; then + for j in ${mounts}; do + umount ${j} || cleanup_mount ${j} + done + # XXX MCL is this redundant with the above? + umount ${chroot}/compat/linux/proc || cleanup_mount ${chroot}/compat/linux/proc + fi + if [ "${use_zfs}" != "1" -a "${use_md_swap}" = "1" ]; then + chrootnum=$(basename ${chroot}) + umount -f /dev/md${chroot} + mdconfig -d -u ${chrootnum} + fi +} + # note: uname is not being overridden (should not need client.conf here) arch=$(uname -m) +# note: if any are missing, the script exits here. . ${pbd}/${arch}/client.conf . ${pbd}/${arch}/portbuild.conf . ${pbd}/${arch}/portbuild.$(hostname) if [ "${use_zfs}" = "1" ]; then - old=$(find ${scratchdir}/*/*/* -prune -mmin +60 2> /dev/null) + old_chroots=$(find ${scratchdir}/*/*/* -prune -mmin +60 2> /dev/null) else - old=$(find ${scratchdir}/*/*/chroot/* -prune -mmin +60 2> /dev/null) + old_chroots=$(find ${scratchdir}/*/*/chroot/* -prune -mmin +60 2> /dev/null) fi -if [ -z "${old}" ]; then - exit 0 +if [ $VERBOSE ]; then + echo "non-empty chroots > 1 hr old found on $(hostname):" + echo ${old_chroots} fi -# Prune out chroots with active builds -for i in ${old}; do - if [ ! -d ${i}/used ]; then - old2="${i} ${old2}" - # Also remove "in use" chroots that were set up more than 5 days ago - elif [ ! -z "`find $i/used -prune -mmin +7200`" ]; then - echo "cleanup-chroots: Found old files on `hostname`:" - ls -l ${i}/tmp ${i}/used - echo "${i} allegedly in use but >5 days old" - old2="${i} ${old2}" - fi -done +if [ ! -z "${old_chroots}" ]; then + # Flag non-empty chroots with no active builds + for chroot in ${old_chroots}; do + if [ ! -d ${chroot}/used ]; then + stale_chroots="${chroot} ${stale_chroots}" + # Also flag "in use" chroots that were set up more than 5 days ago + elif [ ! -z "`find ${chroot}/used -prune -mmin +7200`" ]; then + echo "cleanup-chroots: Found old files on $(hostname):" + ls -l ${chroot}/tmp ${chroot}/used + echo "${chroot} allegedly in use but >5 days old" + stale_chroots="${chroot} ${stale_chroots}" + fi + done +fi -if [ -z "${old2}" ]; then - exit 0 +if [ $VERBOSE ]; then + echo "non-empty, >1 hr old stale chroots found on $(hostname):" + echo ${stale_chroots} fi -# cleanup old NFS and devfs mounts -for i in ${old2}; do - mounts=$(mount | grep $i | awk '{print $3}') - if [ ! -z "${mounts}" ]; then - for j in ${mounts}; do - umount ${j} || cleanup_mount ${j} - done - umount ${i}/compat/linux/proc || cleanup_mount ${i}/compat/linux/proc +# save off non-empty, stale chroots for possible examination +if [ -z "${stale_chroots}" ]; then + mkdir -p ${scratchdir}/old + for chroot in ${stale_chroots}; do + mv ${chroot} ${scratchdir}/old + done + rm -rf ${scratchdir}/old 2> /dev/null + if [ -d ${scratchdir}/old ]; then + chflags -R noschg ${scratchdir}/old + rm -rf ${scratchdir}/old fi - if [ "${use_zfs}" != "1" -a "${use_md_swap}" = "1" ]; then - chrootnum=$(basename $i) - umount -f /dev/md${i} - mdconfig -d -u ${chrootnum} +fi + +# cleanup old NFS and devfs mounts for stale chroots +if [ ! -z "${stale_chroots}" ]; then + for chroot in ${stale_chroots}; do + cleanup_all ${chroot} + done +fi + +# now look for empty stale builds +if [ "${use_zfs}" = "1" ]; then + builds=$(find ${scratchdir}/[0-9]*/* -prune -mmin +7200 2> /dev/null) +else + builds=$(find ${scratchdir}/[0-9]*/* -prune -mmin +7200 2> /dev/null) +fi + +for build in ${builds}; do + if [ -e ${build} ]; then + stale_builds="${build} ${stale_builds}" fi done -mkdir -p ${scratchdir}/old -mv ${old2} ${scratchdir}/old -rm -rf ${scratchdir}/old 2> /dev/null -if [ -d ${scratchdir}/old ]; then - chflags -R noschg ${scratchdir}/old - rm -rf ${scratchdir}/old +if [ $VERBOSE ]; then + echo "empty stale builds found on $(hostname):" + echo ${stale_builds} fi + +# cleanup old NFS and devfs mounts for vanished chroots in stale builds +if [ ! -z "${stale_builds}" ]; then + for build in ${stale_builds}; do + # XXX MCL HACK! what I really want is "give me the next 2 subdirs after $build" + mounts=$(mount | grep "${build}" | awk '{print $3}' | grep -E "/dev$") + if [ ! -z "${mounts}" ]; then + for mount in ${mounts}; do + target=`echo ${mount} | sed -e "s@/dev@@"` + cleanup_all ${target} + done + fi + rm -rf ${build} + done +fi +