You are viewing a plain text version of this content. The canonical link for it is here.
Posted to tashi-commits@incubator.apache.org by rg...@apache.org on 2011/10/30 02:40:55 UTC
svn commit: r1195094 - /incubator/tashi/trunk/src/tashi/agents/primitive.py
Author: rgass
Date: Sun Oct 30 02:40:55 2011
New Revision: 1195094
URL: http://svn.apache.org/viewvc?rev=1195094&view=rev
Log:
Fixing another bug with nodes that are drained and possibly added a few:D
Need to determine if the check if a host is not normal should be in clustermanagerservice/activateVm.
This probably should be something the scheduler needs to decide and depends on who implements it.
Modified:
incubator/tashi/trunk/src/tashi/agents/primitive.py
Modified: incubator/tashi/trunk/src/tashi/agents/primitive.py
URL: http://svn.apache.org/viewvc/incubator/tashi/trunk/src/tashi/agents/primitive.py?rev=1195094&r1=1195093&r2=1195094&view=diff
==============================================================================
--- incubator/tashi/trunk/src/tashi/agents/primitive.py (original)
+++ incubator/tashi/trunk/src/tashi/agents/primitive.py Sun Oct 30 02:40:55 2011
@@ -53,6 +53,7 @@ class Primitive(object):
self.instances = {}
self.muffle = {}
self.lastScheduledHost = 0
+ self.clearHints = {}
def __getState(self):
@@ -99,8 +100,15 @@ class Primitive(object):
return True
return False
+
+ def __clearHints(self, hint, name):
+ # remove the clearHint if the host comes back to normal mode
+ if name in self.clearHints[hint]:
+ popit = self.clearHints[hint].index(name)
+ self.clearHints[hint].pop(popit)
def __scheduleInstance(self, inst):
+
try:
minMax = None
minMaxHost = None
@@ -112,7 +120,15 @@ class Primitive(object):
else:
densePack = boolean(densePack)
+ # Grab the targetHost config options if passed
targetHost = inst.hints.get("targetHost", None)
+ # Check to see if we have already handled this hint
+ clearHints = self.clearHints
+ clearHints["targetHost"] = clearHints.get("targetHost", [])
+ # If we handled the hint, don't look at it anymore
+ if targetHost in clearHints["targetHost"]:
+ targetHost = None
+
try:
allowElsewhere = boolean(inst.hints.get("allowElsewhere", "False"))
except Exception, e:
@@ -120,6 +136,8 @@ class Primitive(object):
# has a host preference been expressed?
if (targetHost != None):
for h in self.hosts.values():
+ if (h.state == HostState.Normal):
+ self.__clearHints("targetHost", h.name)
# if this is not the host we are looking for, continue
if ((str(h.id) != targetHost and h.name != targetHost)):
continue
@@ -140,6 +158,9 @@ class Primitive(object):
# If we don't have a host yet, find one here
if ((targetHost == None or allowElsewhere) and minMaxHost == None):
# cycle list
+ # Adding this to catch if this gets set to None. Fix
+ if self.lastScheduledHost == None:
+ self.lastScheduledHost = 0
for ctr in range(self.lastScheduledHost, len(self.hosts)) + range(0, self.lastScheduledHost):
h = self.hosts[ctr]
@@ -151,6 +172,9 @@ class Primitive(object):
# find another machine
if (h.state != HostState.Normal):
continue
+ else:
+ # If the host is back to normal, get rid of the entry in clearHints
+ self.__clearHints("targetHost", h.name)
# if it's reserved, see if we can use it
if ((len(h.reserved) > 0) and inst.userId not in h.reserved):
@@ -170,21 +194,29 @@ class Primitive(object):
if (minMaxHost):
# found a host
- self.lastScheduledHost = minMaxCtr
if (not inst.hints.get("__resume_source", None)):
# only run preCreate hooks if newly starting
for hook in self.hooks:
hook.preCreate(inst)
self.log.info("Scheduling instance %s (%d mem, %d cores, %d uid) on host %s" % (inst.name, inst.memory, inst.cores, inst.userId, minMaxHost.name))
- rv = self.cm.activateVm(inst.id, minMaxHost)
+ rv = "fail"
+ try:
+ rv = self.cm.activateVm(inst.id, minMaxHost)
+ if rv == "success":
+ self.lastScheduledHost = minMaxCtr
+ self.load[minMaxHost.id] = self.load[minMaxHost.id] + [inst.id]
+ # get rid of its possible entry in muffle if VM is scheduled to a host
+ if (inst.name in self.muffle):
+ self.muffle.pop(inst.name)
+ else:
+ self.log.warning("Instance %s failed to activate on host %s" % (inst.name, minMaxHost.name))
+ except TashiException, e :
+ # If we try to activate the VM and get errno 10, host not in normal mode, add it to the list
+ # check for other errors later
+ if e.errno == Errors.HostStateError:
+ self.clearHints["targetHost"] = self.clearHints.get("targetHost", [])
+ self.clearHints["targetHost"].append(targetHost)
- if rv == "success":
- self.load[minMaxHost.id] = self.load[minMaxHost.id] + [inst.id]
- # get rid of its possible entry in muffle if VM is scheduled to a host
- if (inst.name in self.muffle):
- self.muffle.pop(inst.name)
- else:
- self.log.warning("Instance %s failed to activate on host %s" % (inst.name, minMaxHost.name))
else:
# did not find a host
if (inst.name not in self.muffle):