cmdlib: Opportunistic locking on instance creation
authorMichael Hanselmann <hansmi@google.com>
Fri, 7 Dec 2012 12:29:49 +0000 (13:29 +0100)
committerMichael Hanselmann <hansmi@google.com>
Fri, 7 Dec 2012 12:36:45 +0000 (13:36 +0100)
Adds a new parameter to “OpInstanceCreate” and “OpInstanceMultiAlloc” to
use opportunistic locks.

Signed-off-by: Michael Hanselmann <hansmi@google.com>
Reviewed-by: Guido Trotter <ultrotter@google.com>

htest/Test/Ganeti/OpCodes.hs
htools/Ganeti/OpCodes.hs
htools/Ganeti/OpParams.hs
lib/opcodes.py

index 3251ee2..a1631e5 100644 (file)
@@ -217,7 +217,7 @@ instance Arbitrary OpCodes.OpCode where
           genMaybe (pure []) <*> genMaybe genNodeNameNE <*>
           arbitrary <*> genMaybe genNodeNameNE <*>
           genMaybe genNodeNameNE <*> genMaybe genNameNE <*>
-          arbitrary <*> (genTags >>= mapM mkNonEmpty)
+          arbitrary <*> arbitrary <*> (genTags >>= mapM mkNonEmpty)
       "OP_INSTANCE_MULTI_ALLOC" ->
         OpCodes.OpInstanceMultiAlloc <$> genMaybe genNameNE <*> pure []
       "OP_INSTANCE_REINSTALL" ->
index 6d93286..03b6069 100644 (file)
@@ -294,6 +294,7 @@ $(genOpCode "OpCode"
      , pSrcNode
      , pSrcPath
      , pStartInstance
+     , pOpportunisticLocking
      , pInstTags
      ])
   , ("OpInstanceMultiAlloc",
index cda751e..d3eca0e 100644 (file)
@@ -71,6 +71,7 @@ module Ganeti.OpParams
   , pIgnoreConsistency
   , pStorageName
   , pUseLocking
+  , pOpportunisticLocking
   , pNameCheck
   , pNodeGroupAllocPolicy
   , pGroupNodeParams
@@ -607,6 +608,12 @@ pStorageName =
 pUseLocking :: Field
 pUseLocking = defaultFalse "use_locking"
 
+-- | Whether to employ opportunistic locking for nodes, meaning nodes already
+-- locked by another opcode won't be considered for instance allocation (only
+-- when an iallocator is used).
+pOpportunisticLocking :: Field
+pOpportunisticLocking = defaultFalse "opportunistic_locking"
+
 -- | Whether to check name.
 pNameCheck :: Field
 pNameCheck = defaultTrue "name_check"
index 91818d1..47216cc 100644 (file)
@@ -159,6 +159,12 @@ _PDiskParams = \
 _PHvState = ("hv_state", None, ht.TMaybeDict, "Set hypervisor states")
 _PDiskState = ("disk_state", None, ht.TMaybeDict, "Set disk states")
 
+#: Opportunistic locking
+_POpportunisticLocking = \
+  ("opportunistic_locking", False, ht.TBool,
+   ("Whether to employ opportunistic locking for nodes, meaning nodes"
+    " already locked by another opcode won't be considered for instance"
+    " allocation (only when an iallocator is used)"))
 
 _PIgnoreIpolicy = ("ignore_ipolicy", False, ht.TBool,
                    "Whether to ignore ipolicy violations")
@@ -1241,6 +1247,7 @@ class OpInstanceCreate(OpCode):
     _PWaitForSync,
     _PNameCheck,
     _PIgnoreIpolicy,
+    _POpportunisticLocking,
     ("beparams", ht.EmptyDict, ht.TDict, "Backend parameters for instance"),
     ("disks", ht.NoDefault, ht.TListOf(_TDiskParams),
      "Disk descriptions, for example ``[{\"%s\": 100}, {\"%s\": 5}]``;"
@@ -1300,6 +1307,7 @@ class OpInstanceMultiAlloc(OpCode):
 
   """
   OP_PARAMS = [
+    _POpportunisticLocking,
     _PIAllocFromDesc("Iallocator used to allocate all the instances"),
     ("instances", ht.EmptyList, ht.TListOf(ht.TInstanceOf(OpInstanceCreate)),
      "List of instance create opcodes describing the instances to allocate"),