def test_hash_shard(self): num_shards = 128 self.assertEqual(len(set(_get_hash_shard("aaa", num_shards) for _ in xrange(100))), 1) sh_max = max(_get_hash_shard(str(x), num_shards) for x in xrange(10000)) sh_min = min(_get_hash_shard(str(x), num_shards) for x in xrange(10000)) self.assertEqual(sh_max, num_shards - 1) self.assertEqual(sh_min, 0)
def _save_metric_rollup(self, metric_id, ts, values, is_hot): values_sum = defaultdict(int) for v in values: values_sum[v.metric_key] += v.value query = [] query.append('BEGIN BATCH') for metric_key, v in values_sum.iteritems(): params = [metric_id, ts, _get_hash_shard(metric_key, self._CounterBase.num_shards), metric_key, v] query.append(bind_params(self._write_stmt_str, params)) query.append('APPLY BATCH') query_string = '\n'.join(query) statement = SimpleStatement(query_string, consistency_level=self._write_consistency_level) self._CounterBase.session.execute(statement) self._save_to_journal(metric_id, ts, is_hot)
def _get_add_query_values(cls, key, value): encoded_key = cls._protocol.encode(key) return [cls.get_metric_id(), _get_ts_rotation(cls.metrics_rotation), _get_hash_shard(encoded_key, cls.num_shards), encoded_key, value]