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))
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
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()))