X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/53ce9b61336c5385eb2250267efa69613b5eaec7..5dc5d156d1f586f41b6341c30f3c2a202f3e037e:/services/crunch-dispatch-slurm/squeue_test.go diff --git a/services/crunch-dispatch-slurm/squeue_test.go b/services/crunch-dispatch-slurm/squeue_test.go index c9329fdf95..ce74fe61cc 100644 --- a/services/crunch-dispatch-slurm/squeue_test.go +++ b/services/crunch-dispatch-slurm/squeue_test.go @@ -7,6 +7,7 @@ package main import ( "time" + "github.com/sirupsen/logrus" . "gopkg.in/check.v1" ) @@ -24,6 +25,7 @@ func (s *SqueueSuite) TestReleasePending(c *C) { queue: uuids[0] + " 10000 4294000000 PENDING Resources\n" + uuids[1] + " 10000 4294000111 PENDING Resources\n" + uuids[2] + " 10000 0 PENDING BadConstraints\n", } sqc := &SqueueChecker{ + Logger: logrus.StandardLogger(), Slurm: slurm, Period: time.Hour, } @@ -88,6 +90,7 @@ func (s *SqueueSuite) TestReniceAll(c *C) { queue: test.squeue, } sqc := &SqueueChecker{ + Logger: logrus.StandardLogger(), Slurm: slurm, PrioritySpread: test.spread, Period: time.Hour, @@ -103,6 +106,51 @@ func (s *SqueueSuite) TestReniceAll(c *C) { } } +// If a limited nice range prevents desired priority adjustments, give +// up and clamp nice to 10K. +func (s *SqueueSuite) TestReniceInvalidNiceValue(c *C) { + uuids := []string{"zzzzz-dz642-fake0fake0fake0", "zzzzz-dz642-fake1fake1fake1", "zzzzz-dz642-fake2fake2fake2"} + slurm := &slurmFake{ + queue: uuids[0] + " 0 4294000222 PENDING Resources\n" + uuids[1] + " 0 4294555222 PENDING Resources\n", + rejectNice10K: true, + } + sqc := &SqueueChecker{ + Logger: logrus.StandardLogger(), + Slurm: slurm, + PrioritySpread: 1, + Period: time.Hour, + } + sqc.startOnce.Do(sqc.start) + sqc.check() + sqc.SetPriority(uuids[0], 2) + sqc.SetPriority(uuids[1], 1) + + // First attempt should renice to 555001, which will fail + sqc.reniceAll() + c.Check(slurm.didRenice, DeepEquals, [][]string{{uuids[1], "555001"}}) + + // Next attempt should renice to 10K, which will succeed + sqc.reniceAll() + c.Check(slurm.didRenice, DeepEquals, [][]string{{uuids[1], "555001"}, {uuids[1], "10000"}}) + // ...so we'll change the squeue response to reflect the + // updated priority+nice, and make sure sqc sees that... + slurm.queue = uuids[0] + " 0 4294000222 PENDING Resources\n" + uuids[1] + " 10000 4294545222 PENDING Resources\n" + sqc.check() + + // Next attempt should leave nice alone because it's already + // at the 10K limit + sqc.reniceAll() + c.Check(slurm.didRenice, DeepEquals, [][]string{{uuids[1], "555001"}, {uuids[1], "10000"}}) + + // Back to normal if desired nice value falls below 10K + slurm.queue = uuids[0] + " 0 4294000222 PENDING Resources\n" + uuids[1] + " 10000 4294000111 PENDING Resources\n" + sqc.check() + sqc.reniceAll() + c.Check(slurm.didRenice, DeepEquals, [][]string{{uuids[1], "555001"}, {uuids[1], "10000"}, {uuids[1], "9890"}}) + + sqc.Stop() +} + // If the given UUID isn't in the slurm queue yet, SetPriority() // should wait for it to appear on the very next poll, then give up. func (s *SqueueSuite) TestSetPriorityBeforeQueued(c *C) { @@ -111,6 +159,7 @@ func (s *SqueueSuite) TestSetPriorityBeforeQueued(c *C) { slurm := &slurmFake{} sqc := &SqueueChecker{ + Logger: logrus.StandardLogger(), Slurm: slurm, Period: time.Hour, }