Here is a patch that fixes some problems with the sql backend.

Index: sql.py
===================================================================
--- sql.py  (revision 791542)
+++ sql.py  (working copy)
@@ -48,14 +48,19 @@
       self.hostLock = threading.Lock()
       self.hostLocks = {}
       self.maxInstanceId = 1
+       self.sqlLock = threading.Lock()
       self.verifyStructure()

   def executeStatement(self, stmt):
-       cur = self.conn.cursor()
+       self.sqlLock.acquire()
       try:
-           cur.execute(stmt)
-       except:
-           self.log.exception('Exception executing SQL statement')
+           cur = self.conn.cursor()
+           try:
+               cur.execute(stmt)
+           except:
+               self.log.exception('Exception executing SQL statement')
+       finally:
+           self.sqlLock.release()
       return cur

   def getNewInstanceId(self):
@@ -66,10 +71,10 @@
       return instanceId

   def verifyStructure(self):
- self.executeStatement("CREATE TABLE instances (id int(11) NOT NULL, vmId int(11), hostId int(11), decayed tinyint(1) NOT NULL, state int(11) NOT NULL, userId int(11), name varchar(256), cores int(11) NOT NULL, memory int(11) NOT NULL, disks varchar(1024) NOT NULL, nics varchar(1024) NOT NULL, hints varchar(1024) NOT NULL)") - self.executeStatement("CREATE TABLE hosts (id int(11) NOT NULL, name varchar(256) NOT NULL, up tinyint(1) NOT NULL, decayed tinyint(1) NOT NULL, state int(11) NOT NULL, memory int(11), cores int(11), version varchar(256))") - self.executeStatement("CREATE TABLE networks (id int(11) NOT NULL, name varchar(256) NOT NULL)") - self.executeStatement("CREATE TABLE users (id int(11) NOT NULL, name varchar(256) NOT NULL)") + self.executeStatement("CREATE TABLE IF NOT EXISTS instances (id int(11) NOT NULL, vmId int(11), hostId int(11), decayed tinyint(1) NOT NULL, state int(11) NOT NULL, userId int(11), name varchar(256), cores int(11) NOT NULL, memory int(11) NOT NULL, disks varchar(1024) NOT NULL, nics varchar(1024) NOT NULL, hints varchar(1024) NOT NULL)") + self.executeStatement("CREATE TABLE IF NOT EXISTS hosts (id int(11) NOT NULL, name varchar(256) NOT NULL, up tinyint(1) NOT NULL, decayed tinyint(1) NOT NULL, state int(11) NOT NULL, memory int(11), cores int(11), version varchar(256))") + self.executeStatement("CREATE TABLE IF NOT EXISTS networks (id int(11) NOT NULL, name varchar(256) NOT NULL)") + self.executeStatement("CREATE TABLE IF NOT EXISTS users (id int(11) NOT NULL, name varchar(256) NOT NULL)")

   def sanitizeForSql(self, s):
       if (s == '"True"'):
@@ -89,7 +94,10 @@
   def makeListInstance(self, l):
       i = Instance()
       for e in range(0, len(self.instanceOrder)):
-           i.__dict__[self.instanceOrder[e]] = l[e]
+           if self.instanceOrder[e] == 'state':
+               i.__dict__[self.instanceOrder[e]] = int(l[e])
+           else:
+               i.__dict__[self.instanceOrder[e]] = l[e]
       i.decayed = boolean(i.decayed)
       i.disks = map(lambda x: DiskConfiguration(d=x), eval(i.disks))
       i.nics = map(lambda x: NetworkConfiguration(d=x), eval(i.nics))
@@ -105,7 +113,10 @@
   def makeListHost(self, l):
       h = Host()
       for e in range(0, len(self.hostOrder)):
-           h.__dict__[self.hostOrder[e]] = l[e]
+           if self.hostOrder[e] == 'state':
+               h.__dict__[self.hostOrder[e]] = int(l[e])
+           else:
+               h.__dict__[self.hostOrder[e]] = l[e]
       return h

   def registerInstance(self, instance):
@@ -211,6 +222,8 @@
   def getInstance(self, id):
cur = self.executeStatement("SELECT * FROM instances WHERE id = %d" % (id))
       r = cur.fetchone()
+       if (not r):
+ raise TashiException(d={'errno':Errors.NoSuchInstanceId, 'msg':"No such instanceId - %d" % (id)})
       instance = self.makeListInstance(r)
       return instance

Reply via email to