示例#1
0
 def __init__(self, max_byte_size, max_entries, max_index_size):
     self.static_storage = lrustorage.LruStorage()
     for k, v in g_default_kvs:
         self.static_storage.Store(lrustorage.KV(k, v))
     self.lru_storage = lrustorage.LruStorage(max_byte_size, max_entries,
                                              max_index_size,
                                              len(self.static_storage))
示例#2
0
    def DecompressorExecuteOps(self, ops, group_id):
        store_later = deque()
        stoggles = set()
        etoggles = set()
        headers = dict()
        current_header_group = self.FindOrMakeHeaderGroup(group_id)

        for op in ops:
            opcode = op['opcode']
            if opcode == 'stoggl':
                lru_idx = op['index']
                stoggles.symmetric_difference_update([lru_idx])
            elif opcode == 'etoggl':
                lru_idx = op['index']
                etoggles.symmetric_difference_update([lru_idx])
            elif opcode == 'strang':
                lru_idx_last = op['index']
                lru_idx_start = op['index_start']
                for lru_idx in xrange(lru_idx_start, lru_idx_last + 1):
                    stoggles.symmetric_difference_update([lru_idx])
            elif opcode == 'etrang':
                lru_idx_last = op['index']
                lru_idx_start = op['index_start']
                for lru_idx in xrange(lru_idx_start, lru_idx_last + 1):
                    etoggles.symmetric_difference_update([lru_idx])
            elif opcode == 'sclone':
                lru_idx = op['index']
                val = op['val']
                kv = self.storage.LookupFromIdx(lru_idx)
                AppendToHeaders(headers, kv.key(), val)
                store_later.append(lrustorage.KV(kv.key_, val))
            elif opcode == 'eclone':
                lru_idx = op['index']
                val = op['val']
                kv = self.storage.LookupFromIdx(lru_idx)
                AppendToHeaders(headers, kv.key(), val)
            elif opcode == 'skvsto':
                key = op['key']
                val = op['val']
                AppendToHeaders(headers, key, val)
                store_later.append(lrustorage.KV(key, val))
            elif opcode == 'ekvsto':
                key = op['key']
                val = op['val']
                AppendToHeaders(headers, key, val)

        # modify and store the new header group.
        current_header_group.hg_store.symmetric_difference_update(stoggles)
        kv_references = etoggles.symmetric_difference(
            current_header_group.hg_store)

        for lru_idx in kv_references:
            kv = self.storage.LookupFromIdx(lru_idx)
            AppendToHeaders(headers, kv.key(), kv.val())

        if self.hg_adjust:
            hg_store_later = []
            for lru_idx in sorted(current_header_group.hg_store):
                kv = self.storage.LookupFromIdx(lru_idx)
                hg_store_later.append((kv, lru_idx))
        # Modify the LRU.
        for kv in store_later:
            new_idx = self.Store(kv)
            if self.implicit_hg_add and new_idx is not None:
                current_header_group.hg_store.add(new_idx)
        if self.hg_adjust:
            for kv, old_idx in hg_store_later:
                if old_idx in current_header_group.hg_store:
                    current_header_group.hg_store.remove(old_idx)
                new_idx = self.Store(kv)
                if new_idx is not None:
                    current_header_group.hg_store.add(new_idx)

        if 'cookie' in headers:
            headers['cookie'] = headers['cookie'].replace('\0', '; ')
        return headers
示例#3
0
 def Store(self, kv):
     if self.refcnt_vals:
         return self.storage.InsertVal(lrustorage.KV(kv.key_, kv.val_))
     return self.storage.InsertVal(lrustorage.KV(kv.key_, kv.val()))