make_range function is fixed and properly tested
Fixes bug 1223293 Change-Id: I9c285be69cfa3e021cec418e5d794328b6066732
This commit is contained in:
parent
1774bd973f
commit
3e29cb9ea2
@ -18,6 +18,7 @@ import re
|
|||||||
import memcache
|
import memcache
|
||||||
|
|
||||||
from stackalytics.openstack.common import log as logging
|
from stackalytics.openstack.common import log as logging
|
||||||
|
from stackalytics.processor import utils
|
||||||
|
|
||||||
LOG = logging.getLogger(__name__)
|
LOG = logging.getLogger(__name__)
|
||||||
|
|
||||||
@ -131,7 +132,7 @@ class MemcachedStorage(RuntimeStorage):
|
|||||||
for i in self.get_all_records():
|
for i in self.get_all_records():
|
||||||
yield i
|
yield i
|
||||||
else:
|
else:
|
||||||
for update_id_set in self._make_range(last_update, update_count,
|
for update_id_set in utils.make_range(last_update, update_count,
|
||||||
BULK_READ_SIZE):
|
BULK_READ_SIZE):
|
||||||
update_set = self.memcached.get_multi(
|
update_set = self.memcached.get_multi(
|
||||||
update_id_set, UPDATE_ID_PREFIX).values()
|
update_id_set, UPDATE_ID_PREFIX).values()
|
||||||
@ -156,7 +157,7 @@ class MemcachedStorage(RuntimeStorage):
|
|||||||
min_update = n
|
min_update = n
|
||||||
|
|
||||||
first_valid_update = self.memcached.get('first_valid_update') or 0
|
first_valid_update = self.memcached.get('first_valid_update') or 0
|
||||||
for delete_id_set in self._make_range(first_valid_update, min_update,
|
for delete_id_set in utils.make_range(first_valid_update, min_update,
|
||||||
BULK_DELETE_SIZE):
|
BULK_DELETE_SIZE):
|
||||||
if not self.memcached.delete_multi(delete_id_set,
|
if not self.memcached.delete_multi(delete_id_set,
|
||||||
key_prefix=UPDATE_ID_PREFIX):
|
key_prefix=UPDATE_ID_PREFIX):
|
||||||
@ -182,15 +183,8 @@ class MemcachedStorage(RuntimeStorage):
|
|||||||
def _set_record_count(self, count):
|
def _set_record_count(self, count):
|
||||||
self.memcached.set('record:count', count)
|
self.memcached.set('record:count', count)
|
||||||
|
|
||||||
def _make_range(self, start, stop, step):
|
|
||||||
i = start
|
|
||||||
for i in xrange(start, stop, step):
|
|
||||||
yield xrange(i, i + step)
|
|
||||||
if (stop - start) % step > 0:
|
|
||||||
yield xrange(i, stop)
|
|
||||||
|
|
||||||
def get_all_records(self):
|
def get_all_records(self):
|
||||||
for record_id_set in self._make_range(0, self._get_record_count(),
|
for record_id_set in utils.make_range(0, self._get_record_count(),
|
||||||
BULK_READ_SIZE):
|
BULK_READ_SIZE):
|
||||||
for i in self.memcached.get_multi(
|
for i in self.memcached.get_multi(
|
||||||
record_id_set, RECORD_ID_PREFIX).values():
|
record_id_set, RECORD_ID_PREFIX).values():
|
||||||
|
@ -52,6 +52,14 @@ def read_json_from_uri(uri):
|
|||||||
LOG.warn('Error while reading uri: %s' % e)
|
LOG.warn('Error while reading uri: %s' % e)
|
||||||
|
|
||||||
|
|
||||||
|
def make_range(start, stop, step):
|
||||||
|
last_full = stop - ((stop - start) % step)
|
||||||
|
for i in xrange(start, last_full, step):
|
||||||
|
yield xrange(i, i + step)
|
||||||
|
if stop > last_full:
|
||||||
|
yield xrange(last_full, stop)
|
||||||
|
|
||||||
|
|
||||||
def store_user(runtime_storage_inst, user):
|
def store_user(runtime_storage_inst, user):
|
||||||
runtime_storage_inst.set_by_key('user:%s' % user['user_id'], user)
|
runtime_storage_inst.set_by_key('user:%s' % user['user_id'], user)
|
||||||
|
|
||||||
|
44
tests/unit/test_utils.py
Normal file
44
tests/unit/test_utils.py
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
# Copyright (c) 2013 Mirantis Inc.
|
||||||
|
#
|
||||||
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
# you may not use this file except in compliance with the License.
|
||||||
|
# You may obtain a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||||
|
# implied.
|
||||||
|
# See the License for the specific language governing permissions and
|
||||||
|
# limitations under the License.
|
||||||
|
|
||||||
|
import testtools
|
||||||
|
|
||||||
|
from stackalytics.processor import utils
|
||||||
|
|
||||||
|
|
||||||
|
class TestUtils(testtools.TestCase):
|
||||||
|
def setUp(self):
|
||||||
|
super(TestUtils, self).setUp()
|
||||||
|
|
||||||
|
def _test_one_range(self, start, end, step):
|
||||||
|
elements = set()
|
||||||
|
for chunk in utils.make_range(start, end, step):
|
||||||
|
for item in chunk:
|
||||||
|
self.assertFalse(item in elements)
|
||||||
|
elements.add(item)
|
||||||
|
|
||||||
|
self.assertTrue(set(range(start, end)) == elements)
|
||||||
|
|
||||||
|
def test_make_range_0_10_1(self):
|
||||||
|
self._test_one_range(0, 10, 1)
|
||||||
|
|
||||||
|
def test_make_range_0_10_3(self):
|
||||||
|
self._test_one_range(0, 10, 3)
|
||||||
|
|
||||||
|
def test_make_range_3_5_4(self):
|
||||||
|
self._test_one_range(3, 5, 4)
|
||||||
|
|
||||||
|
def test_make_range_5_26_10(self):
|
||||||
|
self._test_one_range(5, 26, 10)
|
Loading…
x
Reference in New Issue
Block a user