[OE-core] [PATCH] PR_Service: Improvement of persistance of PR service

Dimitrios Katsaros dmtkatsa at gmail.com
Tue Aug 5 15:11:36 UTC 2014


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.


On Thu, Jul 31, 2014 at 12:27 AM, Dimitrios Katsaros <dmtkatsa at gmail.com>
wrote:

> The current implementation only commits database changes
> after database exceptions or daemon shutdown. This patch adds
> a delayed commit after every request finish, defaulting to 20 seconds.
> I chose to make the sync on the consumer thread rather than the
> producer. This is to avoid simultaneous access to the database.
> I chose to use a separate timeout than the timeout defined for
> handle_request
> in work_forever. This is because the consumer thread would reach the
> handle_request before the quit flag was set. Thus for long timeouts
> the stop_daemon function would have to wait for an equally long
> amount of time.
>
> This solution is based on this discussion :
>
> https://www.mail-archive.com/openembedded-core@lists.openembedded.org/msg52932.html
>
> Signed-off-by: Dimitrios Katsaros <dmtkatsa at gmail.com>
> ---
>  bitbake/lib/prserv/serv.py | 22 ++++++++++++++++++----
>  1 file changed, 18 insertions(+), 4 deletions(-)
>
> diff --git a/bitbake/lib/prserv/serv.py b/bitbake/lib/prserv/serv.py
> index 1e170ce..9c37339 100644
> --- a/bitbake/lib/prserv/serv.py
> +++ b/bitbake/lib/prserv/serv.py
> @@ -1,4 +1,4 @@
> -import os,sys,logging
> +import os,sys,logging, time
>  import signal, time, atexit, threading
>  from SimpleXMLRPCServer import SimpleXMLRPCServer,
> SimpleXMLRPCRequestHandler
>  import xmlrpclib
> @@ -36,7 +36,7 @@ singleton = None
>
>
>  class PRServer(SimpleXMLRPCServer):
> -    def __init__(self, dbfile, logfile, interface, daemon=True):
> +    def __init__(self, dbfile, logfile, interface, daemon=True,
> sync_timeout=20):
>          ''' constructor '''
>          SimpleXMLRPCServer.__init__(self, interface,
>                                      logRequests=False, allow_none=True)
> @@ -46,6 +46,8 @@ class PRServer(SimpleXMLRPCServer):
>          self.working_thread=None
>          self.host, self.port = self.socket.getsockname()
>          self.pidfile=PIDPREFIX % (self.host, self.port)
> +        self.dirty = False
> +        self.sync_timeout = sync_timeout
>
>          self.register_function(self.getPR, "getPR")
>          self.register_function(self.quit, "quit")
> @@ -70,8 +72,13 @@ class PRServer(SimpleXMLRPCServer):
>          while True:
>              (request, client_address) = self.requestqueue.get()
>              try:
> -                self.finish_request(request, client_address)
> -                self.shutdown_request(request)
> +                if request == "Sync":
> +                    self.table.sync()
> +                else:
> +                    self.finish_request(request, client_address)
> +                    self.shutdown_request(request)
> +                    self.time_from_dirty = time.time()
> +                    self.dirty = True
>              except:
>                  self.handle_error(request, client_address)
>                  self.shutdown_request(request)
> @@ -126,6 +133,13 @@ class PRServer(SimpleXMLRPCServer):
>          self.server_close()
>          return
>
> +    def handle_timeout(self):
> +        if self.dirty:
> +            # making the consumer thead perform sync to ensure thread
> safty
> +            if time.time() - self.time_from_dirty > self.sync_timeout:
> +                self.requestqueue.put(("Sync", None))
> +                self.dirty = False
> +
>      def start(self):
>          pid = self.daemonize()
>          # Ensure both the parent sees this and the child from the
> work_forever log entry above
> --
> 1.9.1
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.openembedded.org/pipermail/openembedded-core/attachments/20140805/64ae850a/attachment-0002.html>


More information about the Openembedded-core mailing list