#!/bin/sh
#
# Runs in the background on the server.  This script keeps track of
# the relative loads of the client machines, and specifies which machine(s)
# should be handed new jobs, according to the following algorithm:
#
# For each machine listed in ${buildroot}/mlist, check whether its load
# information has been updated in the last 15 seconds (should be updated by
# the reportload script every 5 seconds).  If so, then divide the number of
# running jobs on the client by its weighting in mlist, and output the
# machine(s) with the minimum value to ${buildroot}/ulist. 
#
# Dividing by the weight has the effect of grouping machines with similar
# job load (e.g. a weight of 5 will rank machines with job loads 0, 1, 2, 3, 4
# as the same; if the machines all had a weight of 1 then it would only
# choose the machine with the least value of the job load, and would probably
# choose a single machine most of the time).

buildroot=/var/portbuild

arches=$*

while true; do
  for i in ${arches}; do
    mlist=${buildroot}/${i}/mlist
    stamp=${buildroot}/${i}/loads/.stamp
  
    unset DISPLAY
  
    touch ${stamp}
    sleep 15
    min=99
    set $(cat $mlist)
    while [ $# -gt 1 ]; do
      m=$1
      l=$2
      if [ -f ${buildroot}/${i}/loads/$m -a \
        ! -z "$(find ${buildroot}/${i}/loads/$m -newer ${stamp})" ]; then
        num=$(awk '{print $1}' ${buildroot}/${i}/loads/$m)
        if [ "x$num" = "x" ]; then
  #	logger "checkmachines: file ${buildroot}/${i}/loads/$m is empty"
  	num=99
        fi
      else
        num=99
      fi
  #xxx
  #xxx Need to figure out how this is happening and fix this script
  #xxx accordingly.  This is what causes this script to go away on
  #xxx occasion.
  #xxx
  #xxx arith: syntax error: "7:53AM / 5"
  #xxx
      num=$(($num / $l))
      if [ $num -lt $min ]; then
        mach=$m
        min=$num
      elif [ $num = $min ]; then
        mach="$mach $m"
      fi
      shift 2
    done
    echo "$mach" > ${buildroot}/${i}/ulist
  done
done
