[Kimchi-devel] [PATCH V2] [Wok] Save notifications in memory instead of object store

Paulo Ricardo Paz Vital pvital at linux.vnet.ibm.com
Tue May 10 13:46:02 UTC 2016


Reviewed-by: Paulo Ricardo Paz Vital <pvital at linux.vnet.ibm.com>

On May 09 04:55PM, Lucio Correia wrote:
> Notifications are temporary data structure, so save it in
> memory instead of object store, allowing it to work even
> when there is no disk space.
>
> Signed-off-by: Lucio Correia <luciojhc at linux.vnet.ibm.com>
> ---
>  src/wok/model/notifications.py | 52 ++++++++++++++++++++++++++++++------------
>  src/wok/objectstore.py         | 36 -----------------------------
>  src/wok/server.py              |  4 ----
>  3 files changed, 38 insertions(+), 54 deletions(-)
>
> Changes in V2:
>  * Do not log notification delete requests
>
> diff --git a/src/wok/model/notifications.py b/src/wok/model/notifications.py
> index 77184db..79bed03 100644
> --- a/src/wok/model/notifications.py
> +++ b/src/wok/model/notifications.py
> @@ -17,40 +17,64 @@
>  # License along with this library; if not, write to the Free Software
>  # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301 USA
>
> +from datetime import datetime
> +
>  from wok.exception import NotFoundError, OperationFailed
>  from wok.message import WokMessage
> +from wok.utils import wok_log
> +
> +
> +notificationsStore = {}
> +
> +
> +def add_notification(code, args={}, plugin_name=None):
> +    if not code:
> +        wok_log.error("Unable to add notification: invalid code '%(code)s'" %
> +                      {'code': str(code)})
> +        return
> +
> +    global notificationsStore
> +    notification = notificationsStore.get(code)
> +
> +    # do not update timestamp if notification already exists
> +    timestamp = datetime.now().isoformat() if notification is None else \
> +        notification['timestamp']
> +
> +    args.update({"_plugin_name": plugin_name, "timestamp": timestamp})
> +    notificationsStore[code] = args
>
>
>  class NotificationsModel(object):
>      def __init__(self, **kargs):
> -        self.objstore = kargs['objstore']
> +        pass
>
>      def get_list(self):
> -        with self.objstore as session:
> -            return session.get_list('notification')
> +        global notificationsStore
> +        return notificationsStore.keys()
>
>
>  class NotificationModel(object):
>      def __init__(self, **kargs):
> -        self.objstore = kargs['objstore']
> +        pass
>
>      def lookup(self, id):
> -        with self.objstore as session:
> -            notification = session.get('notification', str(id))
> +        global notificationsStore
> +        notification = notificationsStore.get(str(id))
>
> -            # use WokMessage to translate the notification
> -            if notification:
> -                timestamp = notification['timestamp']
> -                plugin = notification.pop('_plugin_name', None)
> -                message = WokMessage(id, notification, plugin).get_text()
> -                return {"code": id, "message": message, "timestamp": timestamp}
> +        # use WokMessage to translate the notification
> +        if notification:
> +            timestamp = notification['timestamp']
> +            plugin = notification.pop('_plugin_name', None)
> +            message = WokMessage(str(id), notification, plugin).get_text()
> +            return {"code": id, "message": message, "timestamp": timestamp}
>
>          raise NotFoundError("WOKNOT0001E", {'id': str(id)})
>
>      def delete(self, id):
> +        global notificationsStore
> +
>          try:
> -            with self.objstore as session:
> -                session.delete('notification', str(id))
> +            del notificationsStore[str(id)]
>          except Exception as e:
>              raise OperationFailed("WOKNOT0002E", {'id': str(id),
>                                                    'msg': e.msg()})
> diff --git a/src/wok/objectstore.py b/src/wok/objectstore.py
> index ff3796c..59354f3 100644
> --- a/src/wok/objectstore.py
> +++ b/src/wok/objectstore.py
> @@ -23,8 +23,6 @@ import sqlite3
>  import threading
>  import traceback
>
> -from datetime import datetime
> -
>  try:
>      from collections import OrderedDict
>  except ImportError:
> @@ -146,37 +144,3 @@ class ObjectStore(object):
>                  # exception again
>                  wok_log.error(traceback.format_exc())
>                  return False
> -
> -
> -def add_notification(code, args={}, plugin_name=None):
> -    if not code:
> -        wok_log.error("Unable to add notification: invalid code '%(code)s'" %
> -                      {'code': str(code)})
> -        return
> -
> -    try:
> -        with ObjectStore() as session:
> -            notification = session.get('notification', code)
> -    except NotFoundError:
> -        notification = None
> -
> -    try:
> -        # do not update timestamp if notification already exists
> -        timestamp = datetime.now().isoformat() if notification is None else \
> -            notification['timestamp']
> -        args.update({"_plugin_name": plugin_name, "timestamp": timestamp})
> -
> -        with ObjectStore() as session:
> -            session.store('notification', code, args)
> -    except Exception as e:
> -        wok_log.error("Unable to store notification: %s" % e.message)
> -
> -
> -def clean_notifications():
> -    try:
> -        with ObjectStore() as session:
> -            notifications = session.get_list('notification')
> -            for item in notifications:
> -                session.delete('notification', item)
> -    except Exception as e:
> -        wok_log.error("Unable to clean notifications: %s" % e.message)
> diff --git a/src/wok/server.py b/src/wok/server.py
> index a329ed4..902d4bf 100644
> --- a/src/wok/server.py
> +++ b/src/wok/server.py
> @@ -33,7 +33,6 @@ from wok.config import config as configParser
>  from wok.config import paths, PluginConfig, WokConfig
>  from wok.control import sub_nodes
>  from wok.model import model
> -from wok.objectstore import clean_notifications
>  from wok.proxy import start_proxy, terminate_proxy
>  from wok.reqlogger import RequestLogger
>  from wok.root import WokRoot
> @@ -107,9 +106,6 @@ class Server(object):
>          if dev_env:
>              cherrypy.log.screen = True
>
> -        # clean object store notifications
> -        clean_notifications()
> -
>          # close standard file handlers because we are going to use a
>          # watchedfiled handler, otherwise we will have two file handlers
>          # pointing to the same file, duplicating log enries
> --
> 1.9.1
>
> _______________________________________________
> Kimchi-devel mailing list
> Kimchi-devel at ovirt.org
> http://lists.ovirt.org/mailman/listinfo/kimchi-devel
>

--
Paulo Ricardo Paz Vital
Linux Technology Center, IBM Systems
http://www.ibm.com/linux/ltc/




More information about the Kimchi-devel mailing list