<div dir="ltr">I just realised that there is a different mailing list and repo for bitbake, I will be posting a new post with the corrected patch.<br></div><div class="gmail_extra"><br><br><div class="gmail_quote">On Thu, Jul 31, 2014 at 12:27 AM, Dimitrios Katsaros <span dir="ltr"><<a href="mailto:dmtkatsa@gmail.com" target="_blank">dmtkatsa@gmail.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">The current implementation only commits database changes<br>
after database exceptions or daemon shutdown. This patch adds<br>
a delayed commit after every request finish, defaulting to 20 seconds.<br>
I chose to make the sync on the consumer thread rather than the<br>
producer. This is to avoid simultaneous access to the database.<br>
I chose to use a separate timeout than the timeout defined for handle_request<br>
in work_forever. This is because the consumer thread would reach the<br>
handle_request before the quit flag was set. Thus for long timeouts<br>
the stop_daemon function would have to wait for an equally long<br>
amount of time.<br>
<br>
This solution is based on this discussion :<br>
<a href="https://www.mail-archive.com/openembedded-core@lists.openembedded.org/msg52932.html" target="_blank">https://www.mail-archive.com/openembedded-core@lists.openembedded.org/msg52932.html</a><br>
<br>
Signed-off-by: Dimitrios Katsaros <<a href="mailto:dmtkatsa@gmail.com">dmtkatsa@gmail.com</a>><br>
---<br>
bitbake/lib/prserv/serv.py | 22 ++++++++++++++++++----<br>
1 file changed, 18 insertions(+), 4 deletions(-)<br>
<br>
diff --git a/bitbake/lib/prserv/serv.py b/bitbake/lib/prserv/serv.py<br>
index 1e170ce..9c37339 100644<br>
--- a/bitbake/lib/prserv/serv.py<br>
+++ b/bitbake/lib/prserv/serv.py<br>
@@ -1,4 +1,4 @@<br>
-import os,sys,logging<br>
+import os,sys,logging, time<br>
import signal, time, atexit, threading<br>
from SimpleXMLRPCServer import SimpleXMLRPCServer, SimpleXMLRPCRequestHandler<br>
import xmlrpclib<br>
@@ -36,7 +36,7 @@ singleton = None<br>
<br>
<br>
class PRServer(SimpleXMLRPCServer):<br>
- def __init__(self, dbfile, logfile, interface, daemon=True):<br>
+ def __init__(self, dbfile, logfile, interface, daemon=True, sync_timeout=20):<br>
''' constructor '''<br>
SimpleXMLRPCServer.__init__(self, interface,<br>
logRequests=False, allow_none=True)<br>
@@ -46,6 +46,8 @@ class PRServer(SimpleXMLRPCServer):<br>
self.working_thread=None<br>
self.host, self.port = self.socket.getsockname()<br>
self.pidfile=PIDPREFIX % (self.host, self.port)<br>
+ self.dirty = False<br>
+ self.sync_timeout = sync_timeout<br>
<br>
self.register_function(self.getPR, "getPR")<br>
self.register_function(self.quit, "quit")<br>
@@ -70,8 +72,13 @@ class PRServer(SimpleXMLRPCServer):<br>
while True:<br>
(request, client_address) = self.requestqueue.get()<br>
try:<br>
- self.finish_request(request, client_address)<br>
- self.shutdown_request(request)<br>
+ if request == "Sync":<br>
+ self.table.sync()<br>
+ else:<br>
+ self.finish_request(request, client_address)<br>
+ self.shutdown_request(request)<br>
+ self.time_from_dirty = time.time()<br>
+ self.dirty = True<br>
except:<br>
self.handle_error(request, client_address)<br>
self.shutdown_request(request)<br>
@@ -126,6 +133,13 @@ class PRServer(SimpleXMLRPCServer):<br>
self.server_close()<br>
return<br>
<br>
+ def handle_timeout(self):<br>
+ if self.dirty:<br>
+ # making the consumer thead perform sync to ensure thread safty<br>
+ if time.time() - self.time_from_dirty > self.sync_timeout:<br>
+ self.requestqueue.put(("Sync", None))<br>
+ self.dirty = False<br>
+<br>
def start(self):<br>
pid = self.daemonize()<br>
# Ensure both the parent sees this and the child from the work_forever log entry above<br>
<span class="HOEnZb"><font color="#888888">--<br>
1.9.1<br>
<br>
</font></span></blockquote></div><br></div>