1. 09 Mar, 2004 1 commit
  2. 08 Mar, 2004 10 commits
    • Robert Ricci's avatar
      A faily fundamental change in assign - change the criteria we use · 5a72226d
      Robert Ricci authored
      to accept new solutions, so that we don't give violtions any special
      treatment.
      
      This can greatly reduce 'thrasing' at low scores, allowing assign to
      converge on a solution much faster. For example, in the 1000-node
      topology used for the virtualization paper, assign's runtime dropped
      from nearly two hours to just over half an hour, with no degredation
      in scores found.
      
      You can get the old accept behavior by enabling the
      SPECIAL_VIOLATION_TREATMENT #define, which is on right now (hence, we
      are not using this change yet.)
      
      Here are the pertinent comments from the code:
      
      #ifdef SPECIAL_VIOLATION_TREATMENT
               /*
                * In this ifdef, we always accept new solutions that have fewer
                * violations than the old solution, and when we're trying to
                * determine whether or not to accept a new solution with a higher
                * score, we don't take violations into the account.
                *
                * The problem with this shows up at low temperatures. What can often
                * happen is that we accept a solution with worse violations but a
                * better (or similar) score. Then, if we were to try, say the first
                * solution (or a score-equivalent one) again, we'd accept it again.
                *
                * What this leads to is 'thrashing', where we have a whole lot of
                * variation of scores over time, but are not making any real
                * progress. This prevents the cooling schedule from converging for
                * much, much longer than it should really take.
                */
      #else // no SPECIAL_VIOLATION_TREATMENT
               /*
                * In this branch of the ifdef, we give violations no special
                * treatment when it comes to accepting new solution - we just add
                * them into the score. This makes assign behave in a more 'classic'
                * simulated annealing manner.
                *
                * One consequence, though, is that we have to be more careful with
                * scores. We do not want to be able to get into a situation where
                * adding a violation results in a _lower_ score than a solution with
                * fewer violations.
                */
      5a72226d
    • Robert Ricci's avatar
    • Mike Hibler's avatar
      update tarball-making target · 6c8e42f1
      Mike Hibler authored
      fix up standalone makefiles
      have imagezip -v spit out the FSes it supports
      6c8e42f1
    • Mike Hibler's avatar
      changes to make it work better with Linux · b645b345
      Mike Hibler authored
      b645b345
    • Robert Ricci's avatar
      Make the getbandwidth() function aware of node types - it takes as a · 5cb2e92f
      Robert Ricci authored
      parameter the virtual node it is being called for, and considers only
      bandwidths that can be supported by physical nodes that virtual node
      can be mapped to.
      
      This fixes some cases where we were mistakenly setting interfaces
      on slow links to 10Mbps, which does not work reliably.
      
      Not surpisingly, tracking down problems with vtypes was half the
      trouble with making this change.
      5cb2e92f
    • Kirk Webb's avatar
      Plab updates. · eb561e97
      Kirk Webb authored
      eb561e97
    • Leigh B. Stoller's avatar
      Update · e77d744d
      Leigh B. Stoller authored
      e77d744d
    • Leigh B. Stoller's avatar
      Converted os_load and node_reboot into libraries. Basically that meant · 9bfe3d61
      Leigh B. Stoller authored
      splitting the existing code between a frontend script that parses arguments
      and does taint checking, and a backend library where all the work is done
      (including permission checks). The interface to the libraries is simple
      right now (didn't want to spend a lot of time on designing interface
      without knowing if the approach would work long term).
      
      	use libreboot;
      	use libosload;
      
              nodereboot(\%reboot_args, \%reboot_results);
              osload(\%reload_args, \%reload_results);
      
      Arguments are passed to the libraries in the form of a hash. For example,
      in os_setup:
      
      	$reload_args{'debug'}     = $dbg;
      	$reload_args{'asyncmode'} = 1;
      	$reload_args{'imageid'}   = $imageid;
      	$reload_args{'nodelist'}  = [ @nodelist ];
      
      Results are passed back both as a return code (-1 means total failure right
      away, while a positive argument indicates the number of nodes that failed),
      and in the results hash which gives the status for each individual node. At
      the moment it is just success or failure (0 or 1), but in the future might
      be something more meaningful.
      
      os_setup can now find out about individual failures, both in reboot and
      reload, and alter how it operates afterwards. The main thing is to not wait
      for nodes that fail to reboot/reload, and to terminate with no retry when
      this happens, since at the moment it indicates an unusual failure, and it
      is better to terminate early. In the past an os_load failure would result
      in a tbswap retry, and another failure (multiple times). I have already
      tested this by trying to load images that have no file on disk; it is nice
      to see those failures caught early and the experiment failure to happen
      much quicker!
      
      A note about "asyncmode" above. In order to promote parallelism in
      os_setup, asyncmode tells the library to fork off a child and return
      immediately. Later, os_setup can block and wait for status by calling
      back into the library:
      
      	my $foo = nodereboot(\%reboot_args, \%reboot_results);
      	nodereboot_wait($foo);
      
      If you are wondering how the child reports individual node status back to
      the parent (so it can fill in the results hash), Perl really is a kitchen
      sink. I create a pipe with Perl's pipe function and then fork a child to so
      the work; the child writes the results to the pipe (status for each node),
      and the parent reads that back later when nodereboot_wait() is called,
      moving the results into the %reboot_results array. The parent meanwhile can
      go on and in the case of os_setup, make more calls to reboot/reload other
      nodes, later calling the wait() routines once all have been initiated.
      Also worth noting that in order to make the libraries "reentrant" I had to
      do some cleaning up and reorganizing of the code. Nothing too major though,
      just removal of lots of global variables. I also did some mild unrelated
      cleanup of code that had been run over once too many times with a tank.
      
      So how did this work out. Well, for os_setup/os_load it works rather
      nicely!
      
      node_reboot is another story. I probably should have left it alone, but
      since I had already climbed the curve on osload, I decided to go ahead and
      do reboot. The problem is that node_reboot needs to run as root (its a
      setuid script), which means it can only be used as a library from something
      that is already setuid. os_setup and os_load runs as the user. However,
      having a consistent library interface and the ability to cleanly figure out
      which individual nodes failed, is a very nice thing.
      
      So I came up with a suitable approach that is hidden in the library. When the
      library is entered without proper privs, it silently execs an instance of
      node_reboot (the setuid script), and then uses the same trick mentioned
      above to read back individual node status. I create the pipe in the parent
      before the exec, and set the no-close-on-exec flag. I pass the fileno along
      in an environment variable, and the library uses that to the write the
      results to, just like above. The result is that os_setup sees the same
      interface for both os_load and node_reboot, without having to worry that
      one or the other needs to be run setuid.
      9bfe3d61
    • Leigh B. Stoller's avatar
    • Leigh B. Stoller's avatar
      Trivial change; Update comment! · ceb4bb31
      Leigh B. Stoller authored
      ceb4bb31
  3. 05 Mar, 2004 6 commits
  4. 04 Mar, 2004 8 commits
  5. 03 Mar, 2004 2 commits
    • Kirk Webb's avatar
      More plab updates/changes · d4a887e5
      Kirk Webb authored
      * implemented PLC slice renewal
      * restructured daemon code/startup
        - removed getfree daemon (replaced by plabdiscover; run from cron)
        - moved generic daemonizing code into libtestbed (class)
        - created plabrenewd - small script that utilizes daemonizing class
        - removed plabdaemon file.
        - updated bossnode startup scripts
      * changed slice prefix - PLC denies permission w/ anything other than "utah"
      * Minor semantic changes to module API to be more consistent with other parts.
      * Some bug fixes.
      d4a887e5
    • Robert Ricci's avatar
      Stop hard-coding the digest of Utah's capture certificate, and read · e1871b51
      Robert Ricci authored
      it out of a file in /usr/testbed/etc .
      
      We put it in a seperate file from the rest of the certificate, because
      we need the fingerprint to be publically-readable.
      e1871b51
  6. 02 Mar, 2004 5 commits
  7. 01 Mar, 2004 2 commits
  8. 27 Feb, 2004 3 commits
  9. 26 Feb, 2004 3 commits