On Fri, Sep 25, 2015 at 06:18:50PM +0200, 'Klaus Aehlig' via ganeti-devel wrote:
The doShrink function, which is used for tieredAllocation,
tries to find the first shrinking size where the allocation
statistics changes. As computing the allocation statistics
is an expensive operation, use a guess and verify strategy
to do this computation less often.

While there, also fix a typo in the function description.

Signed-off-by: Klaus Aehlig <[email protected]>
---
src/Ganeti/HTools/Cluster.hs | 20 ++++++++++++++------
1 file changed, 14 insertions(+), 6 deletions(-)

diff --git a/src/Ganeti/HTools/Cluster.hs b/src/Ganeti/HTools/Cluster.hs
index 2ea3580..65746fd 100644
--- a/src/Ganeti/HTools/Cluster.hs
+++ b/src/Ganeti/HTools/Cluster.hs
@@ -882,7 +882,7 @@ underlyingCause x = x
-- this resource changes. Note that it might no be possible to allocate
-- an instance at this size; nevertheless there might be a need to change
-- the resource to shrink on, e.g., if the current instance is too big on
--- to resources.
+-- two resources.
doShrink :: (Instance.Instance -> AllocSolution) -> Instance.Instance
         -> FailMode -> Maybe Instance.Instance
doShrink allocFn inst fm =
@@ -890,11 +890,19 @@ doShrink allocFn inst fm =
      getCount = runListHead 0 snd . filter ((==) physRes . fst)
                 . collapseFailures . map underlyingCause . asFailures
      initialStat = getCount $ allocFn inst
-  in  case dropWhile ((==) initialStat . getCount . fst)
-           . map (allocFn &&& id)
-           $ iterateOk (`Instance.shrinkByType` physRes) inst
-      of x:_ -> Just $ snd x
-         _ -> Nothing
+      hasChanged = ((/=) initialStat . getCount . fst)
+      -- as the list of possible shrinks can be quite long, and, moreover,
+      -- has some cost of computing it, our heuristics is to look into it
+      -- only for a limited range; only once the list is shorter, we do
+      -- binary search.
+      lookAhead = 50
+      heuristics xs = if null (drop lookAhead xs)
+                        then length xs `div` 2
+                        else lookAhead
+  in fmap snd
+     . monotoneFind heuristics hasChanged
+     . map (allocFn &&& id)
+     $ iterateOk (`Instance.shrinkByType` physRes) inst

-- | Tiered allocation method.
--
--
2.6.0.rc2.230.g3dd15c0


LGTM, thanks

Reply via email to