extras-buildsys/server UserInterface.py, 1.8, 1.9 BuildMaster.py, 1.6, 1.7
Daniel Williams (dcbw)
fedora-extras-commits at redhat.com
Sat Jun 25 22:22:25 UTC 2005
Author: dcbw
Update of /cvs/fedora/extras-buildsys/server
In directory cvs-int.fedora.redhat.com:/tmp/cvs-serv15630/server
Modified Files:
UserInterface.py BuildMaster.py
Log Message:
2005-06-25 Dan Williams <dcbw at redhat.com>
* server/BuildMaster.py
server/UserInterface.py
- Make queries work again
Index: UserInterface.py
===================================================================
RCS file: /cvs/fedora/extras-buildsys/server/UserInterface.py,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -r1.8 -r1.9
--- UserInterface.py 24 Jun 2005 17:24:20 -0000 1.8
+++ UserInterface.py 25 Jun 2005 22:22:10 -0000 1.9
@@ -22,6 +22,7 @@
import time
import sys
import os
+import copy
import BuildMaster
@@ -118,13 +119,20 @@
if len(search):
sql = sql + search
- self._curs.execute(sql)
- self._dbcx.commit()
- data = self._curs.fetchall()
+ if not len(sql):
+ return []
+
job_list = []
- for row in data:
- tempX = [ item for item in row]
- job_list.append(tempX)
+ query = BuildMaster.JobsQuery(sql)
+ self._bm.queue_query(query)
+ start_time = time.time()
+
+ # Wait for query to return from BuildMaster
+ while time.time() <= start_time + 5:
+ if query.done:
+ job_list = copy.deepcopy(query.result)
+ del query
+ break
return job_list
Index: BuildMaster.py
===================================================================
RCS file: /cvs/fedora/extras-buildsys/server/BuildMaster.py,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- BuildMaster.py 24 Jun 2005 17:24:20 -0000 1.6
+++ BuildMaster.py 25 Jun 2005 22:22:10 -0000 1.7
@@ -25,6 +25,18 @@
import Repo
+class JobsQuery:
+ """ Wrapper class around DB query results. Since only one
+ thread has access to the database (to work around sqlite
+ locking limitations), this object wraps requests to and
+ from the BuildMaster thread.
+ """
+ def __init__(self, query):
+ self.sql = query
+ self.done = False
+ self.result = None
+
+
def ensure_job_db_tables(dbcx):
""" Central routine to create the database table structure """
@@ -71,6 +83,9 @@
self._status_updates = {}
self._status_updates_lock = threading.Lock()
+ self._query_queue = []
+ self._query_queue_lock = threading.Lock()
+
self.dbcx = sqlite.connect("jobdb", encoding="utf-8", timeout=3)
self.curs = self.dbcx.cursor()
ensure_job_db_tables(self.dbcx)
@@ -203,9 +218,55 @@
self._new_queue_lock.release()
+ def queue_query(self, query):
+ self._query_queue_lock.acquire()
+ if query.sql:
+ self._query_queue.append(query)
+ self._query_queue_lock.release()
+
+ def _process_queries(self):
+ self._query_queue_lock.acquire()
+
+ for query in self._query_queue:
+ self.curs.execute(query.sql)
+ self.dbcx.commit()
+ data = self.curs.fetchall()
+ results = []
+ for row in data:
+ tempX = [ item for item in row ]
+ results.append(tempX)
+ query.result = results
+ query.done = True
+ self._query_queue.remove(query)
+ self._query_queue_lock.release()
+
+ def _have_work(self):
+ have_work = False
+ self._new_queue_lock.acquire()
+ if len(self._new_queue) > 0:
+ have_work = True
+ self._new_queue_lock.release()
+ if have_work:
+ return True
+
+ self._query_queue_lock.acquire()
+ if len(self._query_queue) > 0:
+ have_work = True
+ self._query_queue_lock.release()
+ if have_work:
+ return True
+
+ self._status_updates_lock.acquire()
+ if len(self._status_updates) > 0:
+ have_work = True
+ self._status_updates_lock.release()
+ if have_work:
+ return True
+
+ return False
+
def run(self):
while self.should_stop == False:
-
# Write update status for jobs to the database
self._save_job_status()
@@ -218,14 +279,10 @@
# Start any new jobs
self._start_new_jobs()
+ # Execute any queued queries from other threads
+ self._process_queries()
+
last_time = time.time()
- have_work = False
- while not have_work and time.time() <= last_time + 5:
+ while not self._have_work() and time.time() <= last_time + 5:
time.sleep(0.25)
- # Break out early if there's work to do
- self._new_queue_lock.acquire()
- if len(self._new_queue) > 0:
- have_work = True
- self._new_queue_lock.release()
-
More information about the fedora-extras-commits
mailing list