Index: src/poudriere.d/common.sh ================================================================== --- src/poudriere.d/common.sh +++ src/poudriere.d/common.sh @@ -438,10 +438,11 @@ } cleanup() { [ -n "${CLEANED_UP}" ] && return 0 msg "Cleaning up" + lock_release origin-pkgname || : # If this is a builder, don't cleanup, the master will handle that. if [ -n "${MY_JOBID}" ]; then [ -n "${PKGNAME}" ] && clean_pool ${PKGNAME} 1 || : return 0 @@ -459,12 +460,12 @@ for pid in ${MASTERMNT:-${JAILMNT}}/poudriere/var/run/*.pid; do # Ensure there is a pidfile to read or break [ "${pid}" = "${MASTERMNT:-${JAILMNT}}/poudriere/var/run/*.pid" ] && break pkill -15 -F ${pid} >/dev/null 2>&1 || : done - wait fi + wait zfs destroy -r ${JAILFS%/build/*}/build 2>/dev/null || : zfs destroy -r ${JAILFS%/build/*}@prepkg 2>/dev/null || : zfs destroy -r ${JAILFS%/build/*}@preinst 2>/dev/null || : jail_stop @@ -1209,15 +1210,36 @@ [ -n "$p" ] || return 0 touch ${p}/.building # pkgname echo ${p##*/} } + +lock_acquire() { + [ $# -ne 1 ] && eargs lockname + local lockname=$1 + + while :; do + if mkdir ${POUDRIERE_DATA}/.lock-${JAILNAME}-${lockname} 2>/dev/null; then + break + fi + sleep 1 + done +} + +lock_release() { + [ $# -ne 1 ] && eargs lockname + local lockname=$1 + + rmdir ${POUDRIERE_DATA}/.lock-${JAILNAME}-${lockname} 2>/dev/null +} cache_get_pkgname() { [ $# -ne 1 ] && eargs origin local origin=$1 local pkgname existing_origin + + lock_acquire origin-pkgname pkgname=$(awk -v o=${origin} '$1 == o { print $2 }' ${MASTERMNT:-${JAILMNT}}/poudriere/var/cache/origin-pkgname) # Add to cache if not found. if [ -z "${pkgname}" ]; then @@ -1226,17 +1248,23 @@ existing_origin=$(cache_get_origin "${pkgname}") [ -n "${existing_origin}" ] && err 1 "Duplicated origin for ${pkgname}: ${origin} AND ${existing_origin}. Rerun with -D to see which ports are depending on these." echo "${origin} ${pkgname}" >> ${MASTERMNT:-${JAILMNT}}/poudriere/var/cache/origin-pkgname fi echo ${pkgname} + + lock_release origin-pkgname } cache_get_origin() { [ $# -ne 1 ] && eargs pkgname local pkgname=$1 + +# lock_acquire origin-pkgname awk -v p=${pkgname} '$2 == p { print $1 }' ${MASTERMNT:-${JAILMNT}}/poudriere/var/cache/origin-pkgname + +# lock_release origin-pkgname } # Take optional pkgname to speedup lookup compute_deps() { [ $# -lt 1 ] && eargs port @@ -1243,13 +1271,14 @@ [ $# -gt 2 ] && eargs port pkgnme local port=$1 local pkgname="${2:-$(cache_get_pkgname ${port})}" local dep_pkgname dep_port local pkg_pooldir="${JAILMNT}/poudriere/pool/${pkgname}" - [ -d "${pkg_pooldir}" ] && return + mkdir "${pkg_pooldir}" 2>/dev/null || return - mkdir "${pkg_pooldir}" + msg "Computing deps for ${port}" + for dep_port in `list_deps ${port}`; do debug "${port} depends on ${dep_port}" dep_pkgname=$(cache_get_pkgname ${dep_port}) compute_deps "${dep_port}" "${dep_pkgname}" touch "${pkg_pooldir}/${dep_pkgname}" @@ -1280,22 +1309,47 @@ msg "Calculating ports order and dependencies" mkdir -p "${JAILMNT}/poudriere" [ -n "${TMPFS_DATA}" ] && mount -t tmpfs tmpfs "${JAILMNT}/poudriere" mkdir -p "${JAILMNT}/poudriere/pool" "${JAILMNT}/poudriere/var/run" "${JAILMNT}/poudriere/var/cache" touch "${JAILMNT}/poudriere/var/cache/origin-pkgname" + lock_release origin-pkgname || : zset stats_queued "0" :> ${JAILMNT}/poudriere/ports.built :> ${JAILMNT}/poudriere/ports.failed :> ${JAILMNT}/poudriere/ports.ignored :> ${JAILMNT}/poudriere/ports.skipped build_stats zset status "computingdeps:" + + JOBS="$(jot -w %02d ${PARALLEL_JOBS})" listed_ports | while read port; do - compute_deps "${port}" + for j in ${JOBS}; do + next=0 + if [ -f "${JAILMNT}/poudriere/var/run/${j}.pid" ]; then + if pgrep -F "${JAILMNT}/poudriere/var/run/${j}.pid" >/dev/null 2>&1; then + continue + fi + # A dep finished + next=1 + else + next=1 + fi + + [ ${next} -eq 0 ] && continue + + compute_deps "${port}" & + echo "$!" > ${JAILMNT}/poudriere/var/run/${j}.pid + done + if [ ${next} -eq 0 ]; then + sleep 2 + else + sleep 0.1 + fi done + wait zset status "sanity:" if [ ${CLEAN_LISTED:-0} -eq 1 ]; then listed_ports | while read port; do @@ -1443,5 +1497,6 @@ ''|*[!0-9]*) PARALLEL_JOBS=$(sysctl -n hw.ncpu) ;; esac +mypid=$$