Ejemplo n.º 1
0
    def fetch(self, first=None, last=None, firstID=None):
        """
        Произвести выборку сообщений из лога по указанным критериям выборки.

        @param first: минимальная дата возвращаемого сообщения
        @type first: C{int}
        @param last: максимальная дата возвращаемого сообщения
        @type last: C{int}
        @param firstID: минимальный ID элемента лога, который будет возвращен
        @type firstID: C{int}
        @return: Deferred с C{list(}L{ILogEntry}C{)}
        @rtype: C{twisted.internet.defer.Deferred} 
        """
        if last is None or last > time():
            last = time()

        if first is None or last < first or (last - first) > self.timeChunk * (self.numChunks - 1):
            first = time() - self.timeChunk * (self.numChunks - 1)

        firstKey = first / self.timeChunk % self.numChunks
        lastKey = last / self.timeChunk % self.numChunks

        if firstKey < lastKey:
            keyRange = range(firstKey, lastKey + 1)
        else:
            keyRange = range(firstKey, self.numChunks) + range(0, lastKey + 1)

        def logFetched(data):
            result = []

            for item in data:
                if item[0] == defer.FAILURE:
                    continue

                input = StringIO.StringIO(item[1])

                while True:
                    try:
                        data = pickle.load(input)
                        if data.when >= first and data.when <= last:
                            if firstID is None or data.id >= firstID:
                                result.append(data)
                    except EOFError:
                        break

            return result

        return defer.DeferredList(
            [self.storage.get(self.keyTemplate % key) for key in keyRange], consumeErrors=1
        ).addCallback(logFetched)
Ejemplo n.º 2
0
    def set(self, key, value, expire):
        """
        Записать (перезаписать) значение ключа.

        @param key: ключ
        @type key: C{str}
        @param value: значение
        @type value: C{str} или C{int}
        @param expire: время жизни ключа в секундах, 0 - хранить "вечно"
        @type expire: C{int}
        @return: Deferred о завершении операции
        @rtype: C{twisted.internet.Deferred}
        """
        if expire != 0:
            expire = time() + expire
        if self.hash.has_key(key):
            data = self.hash[key]
            if data[0] != 0:
                del self.deleteQueue[data[0] / self.deleteInterval][key]

        self.hash[key] = (expire, value)
        if expire != 0:
            if not self.deleteQueue.has_key(expire / self.deleteInterval):
                self.deleteQueue[expire / self.deleteInterval] = dict()
            self.deleteQueue[expire / self.deleteInterval][key] = 1

        return defer.succeed(None)
Ejemplo n.º 3
0
 def __init__(self):
     """
     Конструктор.
     """
     self.counter = 0
     self.increments = 0
     self.start = time()
Ejemplo n.º 4
0
    def testConstructor(self):
        l = LogEntry(when=None, message=self.message1)
        self.assertEquals([], l.tags)
        self.assertEquals(time(), l.when)

        l = LogEntry(when=200, message=self.message2)
        self.assertEquals(['bad', 'good'], l.tags)
        self.assertEquals(200, l.when)
Ejemplo n.º 5
0
    def period(self):
        """
        Период времени, за который собирается значение счетчика.

        @return: период времени, секунды
        @rtype: C{int}
        """
        period = time() - self.start
        if period == 0:
            period = 1

        return period
Ejemplo n.º 6
0
    def _exists(self, key):
        """
        Внутренний метод: существует ли указанный ключ в хранилище?

        @rtype: C{bool}
        """
        if not self.hash.has_key(key):
            return False

        data = self.hash[key]
        if data[0] != 0 and data[0] <= time():
            del self.hash[key]
            del self.deleteQueue[data[0] / self.deleteInterval][key]
            return False

        return True
Ejemplo n.º 7
0
    def set(self, key, value, expire):
        """
        Записать (перезаписать) значение ключа.

        @param key: ключ
        @type key: C{str}
        @param value: значение
        @type value: C{str} или C{int}
        @param expire: время жизни ключа в секундах, 0 - хранить "вечно"
        @type expire: C{int}
        @return: Deferred о завершении операции
        @rtype: C{twisted.internet.Deferred}
        """
        if expire != 0:
            expire += time()
        
        self.db[key] = pickle.dumps((expire, value), pickle.HIGHEST_PROTOCOL)
        return defer.succeed(None)
Ejemplo n.º 8
0
    def _fetch(self, key):
        """
        Получить значение ключа.

        @param key: ключ
        @type key: C{str}
        @return: пара (срок_годности, значение), если ключ есть в БД или (None, None), если он отсутствует
        """
        if not self.db.has_key(key):
            return (None, None)

        (expire, value) = pickle.loads(self.db[key])

        if expire != 0 and expire <= time():
            del self.db[key]
            return (None, None)

        return (expire, value)
Ejemplo n.º 9
0
    def __init__(self, deleteInterval=10, cleanupInterval=60):
        """
        Конструктор.

        @param deleteInterval: интервал группировки ключей на удаление в секундах (ключи с
           временем жизни в данном интервале будут удалены общей пачкой)
        @type deleteInterval: C{int}
        @param cleanupInterval: интервал запуска задачи очистки просроченных ключей, если
           интервал 0, то задача очистки не запускается никогда
        @type cleanupInterval: C{int}
        """
        self.hash = dict()
        self.deleteQueue = dict()
        self.deleteInterval = deleteInterval
        self.cleanupInterval = cleanupInterval
        self.lastDeleteTime = time() / self.deleteInterval
        self.cleanupDelayed = None

        if self.cleanupInterval != 0:
            self.cleanupDelayed = reactor.callLater(self.cleanupInterval, self._cleanup)
Ejemplo n.º 10
0
    def _cleanup(self):
        """
        Очистить старые ключи. 

        Метод либо вызывается автоматически через каждые L{cleanupInterval} секунд,
        либо может вызываться в любой момент времени.
        """
        self.cleanupDelayed = None

        curDeleteTime = time() / self.deleteInterval
        todoIntervals = xrange(self.lastDeleteTime, curDeleteTime)

        for interval in todoIntervals:
            todo = self.deleteQueue.get(interval, {})
            for key in todo.iterkeys():
                del self.hash[key]
            if interval in self.deleteQueue:
                del self.deleteQueue[interval]

        self.lastDeleteTime = curDeleteTime
        if self.cleanupInterval != 0:
            self.cleanupDelayed = reactor.callLater(self.cleanupInterval, self._cleanup)
Ejemplo n.º 11
0
    def __init__(self, when, message, tags=None, id=None):
        """
        Конструктор.

        @param when: дата/время записи в логе, UTC
        @type when: C{int}
        @param message: само сообщение
        @type message: L{IMessage} или L{ITaggedMessage} или L{TransitMessage}
        @param tags: тэги, привзяанные к сообщению
        @type tags: C{list(str)}
        """
        if when is None:
            when = time()
        self.when = when
        if tags is None:
            tags = []
        self.tags = tags
        if IMessage.providedBy(message):
            if ITaggedMessage.providedBy(message):
                self.tags.extend(message.getTags())
            message = TransitMessage(message=message)
        self.message = message
        self.id = id
Ejemplo n.º 12
0
 def testTearDown(self):
     tearDownTestTimer()
     _inaccurate_timer_tick()
     self.assert_((int(sys_time.time())-time()) <= 1)
     startUpTestTimer(10)
Ejemplo n.º 13
0
 def testSet(self):
     setTestTimer(40)
     self.assertEquals(40, time())
Ejemplo n.º 14
0
 def testAdvance(self):
     advanceTestTimer(20)
     self.assertEquals(30, time())
Ejemplo n.º 15
0
 def testStartUp(self):
     self.assertEquals(10, time())
Ejemplo n.º 16
0
 def testTime(self):
     _inaccurate_timer_tick()
     self.assert_((int(sys_time.time())-time()) <= 1)