Example #1
0
 async def _list_events_by_id(self, request):
     id = request.id
     timeout_seconds = request.timeout_seconds
     if 0 == timeout_seconds:
         event_models = self._query_all_events_by_id(id)
         event_proto_list = event_list_to_proto(event_models)
         return notification_service_pb2.ListEventsResponse(
             return_code=str(notification_service_pb2.ReturnStatus.SUCCESS),
             return_msg='',
             events=event_proto_list)
     else:
         start = time.time()
         event_models = self._query_all_events_by_id(id)
         async with self.write_condition:
             while time.time() - start < timeout_seconds and len(
                     event_models) == 0:
                 try:
                     await asyncio.wait_for(
                         self.write_condition.wait(),
                         timeout_seconds - time.time() + start)
                     event_models = self._query_all_events_by_id(id)
                 except asyncio.TimeoutError:
                     pass
         event_proto_list = event_list_to_proto(event_models)
         return notification_service_pb2.ListEventsResponse(
             return_code=str(notification_service_pb2.ReturnStatus.SUCCESS),
             return_msg='',
             events=event_proto_list)
    async def _list_events(self, request):
        keys = request.keys
        event_type = request.event_type
        start_time = request.start_time
        start_version = request.start_version
        namespace = None if request.namespace == '' else request.namespace
        sender = None if request.sender == '' else request.sender
        timeout_seconds = request.timeout_seconds

        if timeout_seconds == 0:
            event_models = self._query_events(keys, event_type, start_time,
                                              start_version, namespace, sender)
            event_proto_list = event_list_to_proto(event_models)
            return notification_service_pb2.ListEventsResponse(
                return_code=notification_service_pb2.ReturnStatus.SUCCESS,
                return_msg='',
                events=event_proto_list)
        else:
            start = time.time()
            # Lock conditions dict for get/check/update of key
            await self.lock.acquire()
            for key in keys:
                if self.notification_conditions.get(key) is None:
                    self.notification_conditions.update({
                        (key, asyncio.Condition())
                    })
            # Release lock after check/update key of notification conditions dict
            self.lock.release()
            event_models = []
            if len(keys) == 1:
                key = keys[0]
                condition = self.notification_conditions.get(key)
            else:
                condition = self.write_condition
            async with condition:
                while time.time() - start < timeout_seconds and len(
                        event_models) == 0:
                    try:
                        await asyncio.wait_for(
                            condition.wait(),
                            timeout_seconds - time.time() + start)
                        event_models = self._query_events(
                            keys, event_type, start_time, start_version,
                            namespace, sender)
                    except asyncio.TimeoutError:
                        pass
                if len(event_models) == 0:
                    event_models = self._query_events(keys, event_type,
                                                      start_time,
                                                      start_version, namespace,
                                                      sender)
            event_proto_list = event_list_to_proto(event_models)
            return notification_service_pb2.ListEventsResponse(
                return_code=notification_service_pb2.ReturnStatus.SUCCESS,
                return_msg='',
                events=event_proto_list)
Example #3
0
 def listEvents(self, request, context):
     try:
         return self._list_events(request)
     except Exception as e:
         return notification_service_pb2.ListEventsResponse(
             return_code=str(notification_service_pb2.ReturnStatus.ERROR),
             return_msg=str(e))
Example #4
0
 async def _get_latest_version_by_key(self, request):
     key = request.key
     namespace = request.namespace
     timeout_seconds = request.timeout_seconds
     if 0 == timeout_seconds:
         latest_version = self._query_latest_version_by_key(key, namespace)
         return notification_service_pb2.GetLatestVersionResponse(
             return_code=str(notification_service_pb2.ReturnStatus.SUCCESS),
             return_msg='',
             version=latest_version)
     else:
         start = time.time()
         latest_version = self._query_latest_version_by_key(key, namespace)
         async with self.write_condition:
             while time.time(
             ) - start < timeout_seconds and latest_version == 0:
                 try:
                     await asyncio.wait_for(
                         self.write_condition.wait(),
                         timeout_seconds - time.time() + start)
                     latest_version = self._query_latest_version_by_key(
                         key, namespace)
                 except asyncio.TimeoutError:
                     pass
         return notification_service_pb2.ListEventsResponse(
             return_code=str(notification_service_pb2.ReturnStatus.SUCCESS),
             return_msg='',
             version=latest_version)
Example #5
0
    async def _list_events(self, request):
        event_proto = request.event
        key = event_proto.key
        version = event_proto.version
        timeout_seconds = request.timeout_seconds

        if timeout_seconds == 0:
            event_models = self._query_events(key, version)
            event_proto_list = event_list_to_proto(event_models)
            return notification_service_pb2.ListEventsResponse(
                return_code=str(notification_service_pb2.ReturnStatus.SUCCESS),
                return_msg='',
                events=event_proto_list)
        else:
            start = time.time()
            # Lock conditions dict for get/check/update of key
            await self.lock.acquire()
            if self.notification_conditions.get(key) is None:
                self.notification_conditions.update({(key, asyncio.Condition())
                                                     })
            # Release lock after check/update key of notification conditions dict
            self.lock.release()
            event_models = self._query_events(key, version)
            async with self.notification_conditions.get(key):
                while time.time() - start < timeout_seconds and len(
                        event_models) == 0:
                    try:
                        await asyncio.wait_for(
                            self.notification_conditions.get(key).wait(),
                            timeout_seconds - time.time() + start)
                        event_models = self._query_events(key, version)
                    except asyncio.TimeoutError:
                        pass
            event_proto_list = event_list_to_proto(event_models)
            return notification_service_pb2.ListEventsResponse(
                return_code=str(notification_service_pb2.ReturnStatus.SUCCESS),
                return_msg='',
                events=event_proto_list)