[ARVADOS] created: 1.1.4-382-g6714a5e7f

Git user git at public.curoverse.com
Thu Jun 14 10:39:00 EDT 2018


        at  6714a5e7fcf4d5fde2ecd5a7f9f6504cb5ca374b (commit)


commit 6714a5e7fcf4d5fde2ecd5a7f9f6504cb5ca374b
Author: Lucas Di Pentima <ldipentima at veritasgenetics.com>
Date:   Thu Jun 7 14:11:00 2018 -0300

    13581: Available types reported to the user when CR is not satisfiable.
    
    Arvados-DCO-1.1-Signed-off-by: Lucas Di Pentima <ldipentima at veritasgenetics.com>

diff --git a/lib/dispatchcloud/node_size.go b/lib/dispatchcloud/node_size.go
index 2ca405060..facbc70fc 100644
--- a/lib/dispatchcloud/node_size.go
+++ b/lib/dispatchcloud/node_size.go
@@ -8,6 +8,7 @@ import (
 	"errors"
 	"log"
 	"os/exec"
+	"sort"
 	"strings"
 	"time"
 
@@ -15,11 +16,17 @@ import (
 )
 
 var (
-	ErrConstraintsNotSatisfiable  = errors.New("constraints not satisfiable by any configured instance type")
 	ErrInstanceTypesNotConfigured = errors.New("site configuration does not list any instance types")
 	discountConfiguredRAMPercent  = 5
 )
 
+// ConstraintsNotSatisfiableError includes a list of available instance types
+// to be reported back to the user.
+type ConstraintsNotSatisfiableError struct {
+	error
+	AvailableTypes []arvados.InstanceType
+}
+
 // ChooseInstanceType returns the cheapest available
 // arvados.InstanceType big enough to run ctr.
 func ChooseInstanceType(cc *arvados.Cluster, ctr *arvados.Container) (best arvados.InstanceType, err error) {
@@ -40,7 +47,15 @@ func ChooseInstanceType(cc *arvados.Cluster, ctr *arvados.Container) (best arvad
 	needRAM := ctr.RuntimeConstraints.RAM + ctr.RuntimeConstraints.KeepCacheRAM
 	needRAM = (needRAM * 100) / int64(100-discountConfiguredRAMPercent)
 
-	err = ErrConstraintsNotSatisfiable
+	availableTypes := make([]arvados.InstanceType, len(cc.InstanceTypes))
+	copy(availableTypes, cc.InstanceTypes)
+	sort.Slice(availableTypes, func(a, b int) bool {
+		return availableTypes[a].Price < availableTypes[b].Price
+	})
+	err = ConstraintsNotSatisfiableError{
+		errors.New("constraints not satisfiable by any configured instance type"),
+		availableTypes,
+	}
 	for _, it := range cc.InstanceTypes {
 		switch {
 		case err == nil && it.Price > best.Price:
diff --git a/lib/dispatchcloud/node_size_test.go b/lib/dispatchcloud/node_size_test.go
index 0c02a0e3e..31944cfa5 100644
--- a/lib/dispatchcloud/node_size_test.go
+++ b/lib/dispatchcloud/node_size_test.go
@@ -32,7 +32,8 @@ func (*NodeSizeSuite) TestChooseUnsatisfiable(c *check.C) {
 			{Price: 2.2, RAM: 2000000000, VCPUs: 4, Name: "small2"},
 			{Price: 4.4, RAM: 4000000000, VCPUs: 8, Name: "small4", Scratch: GiB},
 		}}, ctr)
-		c.Check(err, check.Equals, ErrConstraintsNotSatisfiable)
+		err, ok := err.(ConstraintsNotSatisfiableError)
+		c.Check(ok, check.Equals, true)
 	}
 
 	for _, rc := range []arvados.RuntimeConstraints{
diff --git a/services/crunch-dispatch-slurm/crunch-dispatch-slurm.go b/services/crunch-dispatch-slurm/crunch-dispatch-slurm.go
index 9e3baab95..8c5b220b4 100644
--- a/services/crunch-dispatch-slurm/crunch-dispatch-slurm.go
+++ b/services/crunch-dispatch-slurm/crunch-dispatch-slurm.go
@@ -7,6 +7,7 @@ package main
 // Dispatcher service for Crunch that submits containers to the slurm queue.
 
 import (
+	"bytes"
 	"context"
 	"flag"
 	"fmt"
@@ -274,8 +275,19 @@ func (disp *Dispatcher) runContainer(_ *dispatch.Dispatcher, ctr arvados.Contain
 		log.Printf("Submitting container %s to slurm", ctr.UUID)
 		if err := disp.submit(ctr, disp.CrunchRunCommand); err != nil {
 			var text string
-			if err == dispatchcloud.ErrConstraintsNotSatisfiable {
-				text = fmt.Sprintf("cannot run container %s: %s", ctr.UUID, err)
+			if err, ok := err.(dispatchcloud.ConstraintsNotSatisfiableError); ok {
+				var logBuf bytes.Buffer
+				logBuf.WriteString(fmt.Sprintf("cannot run container %s: %s\n", ctr.UUID, err))
+				if len(err.AvailableTypes) > 0 {
+					logBuf.WriteString("Available instance types:\n")
+				}
+				for _, t := range err.AvailableTypes {
+					logBuf.WriteString(fmt.Sprintf(
+						"Type %q: %d VCPUs, %d RAM, %d Scratch, %f Price\n",
+						t.Name, t.VCPUs, t.RAM, t.Scratch, t.Price,
+					))
+				}
+				text = logBuf.String()
 				disp.UpdateState(ctr.UUID, dispatch.Cancelled)
 			} else {
 				text = fmt.Sprintf("Error submitting container %s to slurm: %s", ctr.UUID, err)
diff --git a/services/crunch-dispatch-slurm/crunch-dispatch-slurm_test.go b/services/crunch-dispatch-slurm/crunch-dispatch-slurm_test.go
index 85617cf11..b4033e78b 100644
--- a/services/crunch-dispatch-slurm/crunch-dispatch-slurm_test.go
+++ b/services/crunch-dispatch-slurm/crunch-dispatch-slurm_test.go
@@ -391,16 +391,18 @@ func (s *StubbedSuite) TestSbatchInstanceTypeConstraint(c *C) {
 			types: []arvados.InstanceType{
 				{Name: "a1.tiny", Price: 0.02, RAM: 128000000, VCPUs: 1},
 			},
-			err: dispatchcloud.ErrConstraintsNotSatisfiable,
+			err: dispatchcloud.ConstraintsNotSatisfiableError{},
 		},
 	} {
 		c.Logf("%#v", trial)
 		s.disp.cluster = &arvados.Cluster{InstanceTypes: trial.types}
 
 		args, err := s.disp.sbatchArgs(container)
-		c.Check(err, Equals, trial.err)
+		c.Check(err == nil, Equals, trial.err == nil)
 		if trial.err == nil {
 			c.Check(args, DeepEquals, append([]string{"--job-name=123", "--nice=10000"}, trial.sbatchArgs...))
+		} else {
+			c.Check(len(err.(dispatchcloud.ConstraintsNotSatisfiableError).AvailableTypes), Equals, len(trial.types))
 		}
 	}
 }

-----------------------------------------------------------------------


hooks/post-receive
-- 




More information about the arvados-commits mailing list