summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--gluster/swift/common/DiskDir.py275
-rw-r--r--test/unit/common/test_diskdir.py251
2 files changed, 379 insertions, 147 deletions
diff --git a/gluster/swift/common/DiskDir.py b/gluster/swift/common/DiskDir.py
index 60aecf4..be193f1 100644
--- a/gluster/swift/common/DiskDir.py
+++ b/gluster/swift/common/DiskDir.py
@@ -55,72 +55,97 @@ def _read_metadata(dd):
def filter_prefix(objects, prefix):
"""
- Accept sorted list.
+ Accept a sorted list of strings, returning all strings starting with the
+ given prefix.
"""
- found = 0
- filtered_objs = []
+ found = False
for object_name in objects:
if object_name.startswith(prefix):
- filtered_objs.append(object_name)
- found = 1
+ yield object_name
+ found = True
else:
+ # Since the list is assumed to be sorted, once we find an object
+ # name that does not start with the prefix we know we won't find
+ # any others, so we exit early.
if found:
break
- return filtered_objs
-def filter_delimiter(objects, delimiter, prefix):
+def filter_delimiter(objects, delimiter, prefix, marker, path=None):
"""
- Accept sorted list.
- Objects should start with prefix.
+ Accept a sorted list of strings, returning strings that:
+ 1. begin with "prefix" (empty string matches all)
+ 2. does not match the "path" argument
+ 3. does not contain the delimiter in the given prefix length
+ 4.
+ be those that start with the prefix.
"""
- filtered_objs = []
+ assert delimiter
+ assert prefix is not None
+ skip_name = None
for object_name in objects:
- tmp_obj = object_name.replace(prefix, '', 1)
- sufix = tmp_obj.split(delimiter, 1)
- new_obj = prefix + sufix[0]
- if new_obj and new_obj not in filtered_objs:
- filtered_objs.append(new_obj)
-
- return filtered_objs
+ if prefix and not object_name.startswith(prefix):
+ break
+ if path is not None:
+ if object_name == path:
+ continue
+ if skip_name:
+ if object_name < skip_name:
+ continue
+ else:
+ skip_name = None
+ end = object_name.find(delimiter, len(prefix))
+ if end >= 0 and (len(object_name) > (end + 1)):
+ skip_name = object_name[:end] + chr(ord(delimiter) + 1)
+ continue
+ else:
+ if skip_name:
+ if object_name < skip_name:
+ continue
+ else:
+ skip_name = None
+ end = object_name.find(delimiter, len(prefix))
+ if end > 0:
+ dir_name = object_name[:end + 1]
+ if dir_name != marker:
+ yield dir_name
+ skip_name = object_name[:end] + chr(ord(delimiter) + 1)
+ continue
+ yield object_name
def filter_marker(objects, marker):
"""
- TODO: We can traverse in reverse order to optimize.
- Accept sorted list.
+ Accept sorted list of strings, return all strings whose value is strictly
+ greater than the given marker value.
"""
- filtered_objs = []
- if objects[-1] < marker:
- return filtered_objs
for object_name in objects:
if object_name > marker:
- filtered_objs.append(object_name)
+ yield object_name
+
- return filtered_objs
+def filter_prefix_as_marker(objects, prefix):
+ """
+ Accept sorted list of strings, return all strings whose value is greater
+ than or equal to the given prefix value.
+ """
+ for object_name in objects:
+ if object_name >= prefix:
+ yield object_name
def filter_end_marker(objects, end_marker):
"""
- Accept sorted list.
+ Accept a list of strings, sorted, and return all the strings that are
+ strictly less than the given end_marker string. We perform this as a
+ generator to avoid creating potentially large intermediate object lists.
"""
- filtered_objs = []
for object_name in objects:
if object_name < end_marker:
- filtered_objs.append(object_name)
+ yield object_name
else:
break
- return filtered_objs
-
-
-def filter_limit(objects, limit):
- filtered_objs = []
- for i in range(0, limit):
- filtered_objs.append(objects[i])
-
- return filtered_objs
-
class DiskCommon(object):
def is_deleted(self):
@@ -264,53 +289,82 @@ class DiskDir(DiskCommon):
"""
Returns tuple of name, created_at, size, content_type, etag.
"""
+ assert limit >= 0
+ assert not delimiter or (len(delimiter) == 1 and ord(delimiter) <= 254)
+
if path is not None:
- prefix = path
if path:
prefix = path = path.rstrip('/') + '/'
+ else:
+ prefix = path
delimiter = '/'
elif delimiter and not prefix:
prefix = ''
- objects = self.update_object_count()
+ container_list = []
+ objects = self.update_object_count()
if objects:
objects.sort()
-
- if objects and prefix:
- objects = filter_prefix(objects, prefix)
-
- if objects and delimiter:
- objects = filter_delimiter(objects, delimiter, prefix)
-
- if objects and marker:
- objects = filter_marker(objects, marker)
+ else:
+ return container_list
if objects and end_marker:
objects = filter_end_marker(objects, end_marker)
- if objects and limit:
- if len(objects) > limit:
- objects = filter_limit(objects, limit)
-
- container_list = []
if objects:
- for obj in objects:
- obj_path = os.path.join(self.datadir, obj)
- metadata = read_metadata(obj_path)
- if not metadata or not validate_object(metadata):
- metadata = create_object_metadata(obj_path)
- if Glusterfs.OBJECT_ONLY and metadata \
- and metadata[X_CONTENT_TYPE] == DIR_TYPE:
- continue
- list_item = []
- list_item.append(obj)
- if metadata:
- list_item.append(metadata[X_TIMESTAMP])
- list_item.append(int(metadata[X_CONTENT_LENGTH]))
- list_item.append(metadata[X_CONTENT_TYPE])
- list_item.append(metadata[X_ETAG])
- container_list.append(list_item)
+ if marker and marker >= prefix:
+ objects = filter_marker(objects, marker)
+ elif prefix:
+ objects = filter_prefix_as_marker(objects, prefix)
+
+ if prefix is None:
+ # No prefix, we don't need to apply the other arguments, we just
+ # return what we have.
+ pass
+ else:
+ # We have a non-None (for all intents and purposes it is a string)
+ # prefix.
+ if not delimiter:
+ if not prefix:
+ # We have nothing more to do
+ pass
+ else:
+ objects = filter_prefix(objects, prefix)
+ else:
+ objects = filter_delimiter(objects, delimiter, prefix, marker,
+ path)
+
+ count = 0
+ for obj in objects:
+ obj_path = os.path.join(self.datadir, obj)
+ metadata = read_metadata(obj_path)
+ if not metadata or not validate_object(metadata):
+ if delimiter == '/' and obj_path[-1] == delimiter:
+ clean_obj_path = obj_path[:-1]
+ else:
+ clean_obj_path = obj_path
+ try:
+ metadata = create_object_metadata(clean_obj_path)
+ except OSError as e:
+ # FIXME - total hack to get upstream swift ported unit
+ # test cases working for now.
+ if e.errno != errno.ENOENT:
+ raise
+ if Glusterfs.OBJECT_ONLY and metadata \
+ and metadata[X_CONTENT_TYPE] == DIR_TYPE:
+ continue
+ list_item = []
+ list_item.append(obj)
+ if metadata:
+ list_item.append(metadata[X_TIMESTAMP])
+ list_item.append(int(metadata[X_CONTENT_LENGTH]))
+ list_item.append(metadata[X_CONTENT_TYPE])
+ list_item.append(metadata[X_ETAG])
+ container_list.append(list_item)
+ count += 1
+ if count >= limit:
+ break
return container_list
@@ -525,49 +579,62 @@ class DiskAccount(DiskDir):
if delimiter and not prefix:
prefix = ''
+ account_list = []
containers = self.update_container_count()
-
if containers:
containers.sort()
-
- if containers and prefix:
- containers = filter_prefix(containers, prefix)
-
- if containers and delimiter:
- containers = filter_delimiter(containers, delimiter, prefix)
-
- if containers and marker:
- containers = filter_marker(containers, marker)
+ else:
+ return account_list
if containers and end_marker:
containers = filter_end_marker(containers, end_marker)
- if containers and limit:
- if len(containers) > limit:
- containers = filter_limit(containers, limit)
-
- account_list = []
if containers:
- for cont in containers:
- list_item = []
- metadata = None
- list_item.append(cont)
- cont_path = os.path.join(self.datadir, cont)
- metadata = _read_metadata(cont_path)
- if not metadata or not validate_container(metadata):
- try:
- metadata = create_container_metadata(cont_path)
- except OSError as e:
- # FIXME - total hack to get port unit test cases
- # working for now.
- if e.errno != errno.ENOENT:
- raise
-
- if metadata:
- list_item.append(metadata[X_OBJECTS_COUNT][0])
- list_item.append(metadata[X_BYTES_USED][0])
- list_item.append(0)
- account_list.append(list_item)
+ if marker and marker >= prefix:
+ containers = filter_marker(containers, marker)
+ elif prefix:
+ containers = filter_prefix_as_marker(containers, prefix)
+
+ if prefix is None:
+ # No prefix, we don't need to apply the other arguments, we just
+ # return what we have.
+ pass
+ else:
+ # We have a non-None (for all intents and purposes it is a string)
+ # prefix.
+ if not delimiter:
+ if not prefix:
+ # We have nothing more to do
+ pass
+ else:
+ containers = filter_prefix(containers, prefix)
+ else:
+ containers = filter_delimiter(containers, delimiter, prefix,
+ marker)
+
+ count = 0
+ for cont in containers:
+ list_item = []
+ metadata = None
+ list_item.append(cont)
+ cont_path = os.path.join(self.datadir, cont)
+ metadata = _read_metadata(cont_path)
+ if not metadata or not validate_container(metadata):
+ try:
+ metadata = create_container_metadata(cont_path)
+ except OSError as e:
+ # FIXME - total hack to get port unit test cases
+ # working for now.
+ if e.errno != errno.ENOENT:
+ raise
+ if metadata:
+ list_item.append(metadata[X_OBJECTS_COUNT][0])
+ list_item.append(metadata[X_BYTES_USED][0])
+ list_item.append(0)
+ account_list.append(list_item)
+ count += 1
+ if count >= limit:
+ break
return account_list
diff --git a/test/unit/common/test_diskdir.py b/test/unit/common/test_diskdir.py
index ba04e7f..91187fa 100644
--- a/test/unit/common/test_diskdir.py
+++ b/test/unit/common/test_diskdir.py
@@ -518,7 +518,7 @@ class TestContainerBroker(unittest.TestCase):
# Test swift.common.db.ContainerBroker.get_info
broker = self._get_broker(account='test1',
container='test2')
- broker.initialize(normalize_timestamp('1'))
+ broker.initialize(self.initial_ts)
info = broker.get_info()
self.assertEquals(info['account'], 'test1')
@@ -565,7 +565,7 @@ class TestContainerBroker(unittest.TestCase):
def test_set_x_syncs(self):
broker = self._get_broker(account='test1',
container='test2')
- broker.initialize(normalize_timestamp('1'))
+ broker.initialize(self.initial_ts)
info = broker.get_info()
self.assertEquals(info['x_container_sync_point1'], -1)
@@ -579,7 +579,7 @@ class TestContainerBroker(unittest.TestCase):
def test_list_objects_iter(self):
# Test swift.common.db.ContainerBroker.list_objects_iter
broker = self._get_broker(account='a', container='c')
- broker.initialize(normalize_timestamp('1'))
+ broker.initialize(self.initial_ts)
for obj1 in xrange(4):
for obj2 in xrange(125):
@@ -634,17 +634,17 @@ class TestContainerBroker(unittest.TestCase):
self.assertEquals(len(listing), 0)
listing = broker.list_objects_iter(10, '2.d/0050', None, '2.d/', '/')
- self.assertEquals(len(listing), 9)
+ self.assertEquals(len(listing), 10)
self.assertEquals(listing[0][0], '2.d/0051')
self.assertEquals(listing[1][0], '2.d/0052')
- self.assertEquals(listing[-1][0], '2.d/0059')
+ self.assertEquals(listing[-1][0], '2.d/0060')
listing = broker.list_objects_iter(10, '3.d/0045', None, '3.d/', '/')
- self.assertEquals(len(listing), 5)
+ self.assertEquals(len(listing), 10)
self.assertEquals([row[0] for row in listing],
- ['3.d/0046', '3.d/0047',
- '3.d/0048', '3.d/0049',
- '3.d/0050'])
+ ['3.d/0046', '3.d/0047', '3.d/0048', '3.d/0049',
+ '3.d/0050', '3.d/0051', '3.d/0052', '3.d/0053',
+ '3.d/0054', '3.d/0055'])
# FIXME
#broker.put_object('3/0049/', normalize_timestamp(time()), 0,
@@ -657,35 +657,141 @@ class TestContainerBroker(unittest.TestCase):
# '3.d/0052', '3.d/0052.d/0049'])
listing = broker.list_objects_iter(10, '3.d/0048', None, '3.d/', '/')
- self.assertEquals(len(listing), 5)
+ self.assertEquals(len(listing), 10)
self.assertEquals([row[0] for row in listing],
- ['3.d/0049', '3.d/0050',
- '3.d/0051', '3.d/0052', '3.d/0053'])
+ ['3.d/0049', '3.d/0050', '3.d/0051', '3.d/0052', '3.d/0053',
+ '3.d/0054', '3.d/0055', '3.d/0056', '3.d/0057', '3.d/0058'])
listing = broker.list_objects_iter(10, None, None, '3.d/0049.d/', '/')
self.assertEquals(len(listing), 1)
self.assertEquals([row[0] for row in listing],
['3.d/0049.d/0049'])
- # FIXME
- #listing = broker.list_objects_iter(10, None, None, None, None,
- # '3.d/0049')
- #self.assertEquals(len(listing), 1)
- #self.assertEquals([row[0] for row in listing], ['3.d/0049.d/0049'])
+ listing = broker.list_objects_iter(10, None, None, None, None,
+ '3.d/0049.d')
+ self.assertEquals(len(listing), 1)
+ self.assertEquals([row[0] for row in listing], ['3.d/0049.d/0049'])
listing = broker.list_objects_iter(2, None, None, '3.d/', '/')
+ self.assertEquals(len(listing), 2)
+ self.assertEquals([row[0] for row in listing], ['3.d/0000', '3.d/0001'])
+
+ listing = broker.list_objects_iter(2, None, None, None, None, '3.d')
+ self.assertEquals(len(listing), 2)
+ self.assertEquals([row[0] for row in listing], ['3.d/0000', '3.d/0001'])
+
+ def test_list_objects_iter_non_slash(self):
+ # Test swift.common.db.ContainerBroker.list_objects_iter using a
+ # delimiter that is not a slash
+ broker = self._get_broker(account='a', container='c')
+ broker.initialize(self.initial_ts)
+
+ for obj1 in xrange(4):
+ for obj2 in xrange(125):
+ self._create_file('%d:%04d' % (obj1, obj2))
+ for obj in xrange(125):
+ self._create_file('2:0051:%04d' % obj)
+ for obj in xrange(125):
+ self._create_file('3:%04d:0049' % obj)
+
+ listing = broker.list_objects_iter(100, '', None, None, '')
+ self.assertEquals(len(listing), 100)
+ self.assertEquals(listing[0][0], '0:0000')
+ self.assertEquals(listing[-1][0], '0:0099')
+
+ listing = broker.list_objects_iter(100, '', '0:0050', None, '')
+ self.assertEquals(len(listing), 50)
+ self.assertEquals(listing[0][0], '0:0000')
+ self.assertEquals(listing[-1][0], '0:0049')
+
+ listing = broker.list_objects_iter(100, '0:0099', None, None, '')
+ self.assertEquals(len(listing), 100)
+ self.assertEquals(listing[0][0], '0:0100')
+ self.assertEquals(listing[-1][0], '1:0074')
+
+ listing = broker.list_objects_iter(55, '1:0074', None, None, '')
+ self.assertEquals(len(listing), 55)
+ self.assertEquals(listing[0][0], '1:0075')
+ self.assertEquals(listing[-1][0], '2:0004')
+
+ listing = broker.list_objects_iter(10, '', None, '0:01', '')
+ self.assertEquals(len(listing), 10)
+ self.assertEquals(listing[0][0], '0:0100')
+ self.assertEquals(listing[-1][0], '0:0109')
+
+ listing = broker.list_objects_iter(10, '', None, '0:', ':')
+ self.assertEquals(len(listing), 10)
+ self.assertEquals(listing[0][0], '0:0000')
+ self.assertEquals(listing[-1][0], '0:0009')
+
+ # Same as above, but using the path argument, so nothing should be
+ # returned since path uses a '/' as a delimiter.
+ listing = broker.list_objects_iter(10, '', None, None, '', '0')
+ self.assertEquals(len(listing), 0)
+
+ listing = broker.list_objects_iter(10, '', None, '', ':')
+ self.assertEquals(len(listing), 4)
+ self.assertEquals([row[0] for row in listing],
+ ['0:', '1:', '2:', '3:'])
+
+ listing = broker.list_objects_iter(10, '2', None, None, ':')
+ self.assertEquals(len(listing), 2)
+ self.assertEquals([row[0] for row in listing], ['2:', '3:'])
+
+ listing = broker.list_objects_iter(10, '2:', None, None, ':')
self.assertEquals(len(listing), 1)
- self.assertEquals([row[0] for row in listing], ['3.d/0000'])
+ self.assertEquals([row[0] for row in listing], ['3:'])
- # FIXME
- #listing = broker.list_objects_iter(2, None, None, None, None, '3')
- #self.assertEquals(len(listing), 2)
- #self.assertEquals([row[0] for row in listing], ['3.d/0000', '3.d/0001'])
+ listing = broker.list_objects_iter(10, '2:0050', None, '2:', ':')
+ self.assertEquals(len(listing), 10)
+ self.assertEquals(listing[0][0], '2:0051')
+ self.assertEquals(listing[1][0], '2:0051:')
+ self.assertEquals(listing[2][0], '2:0052')
+ self.assertEquals(listing[-1][0], '2:0059')
+
+ listing = broker.list_objects_iter(10, '3:0045', None, '3:', ':')
+ self.assertEquals(len(listing), 10)
+ self.assertEquals([row[0] for row in listing],
+ ['3:0045:', '3:0046', '3:0046:', '3:0047',
+ '3:0047:', '3:0048', '3:0048:', '3:0049',
+ '3:0049:', '3:0050'])
+
+ self._create_file('3:0049:')
+ listing = broker.list_objects_iter(10, '3:0048', None, None, None)
+ self.assertEquals(len(listing), 10)
+ self.assertEquals([row[0] for row in listing],
+ ['3:0048:0049', '3:0049', '3:0049:',
+ '3:0049:0049', '3:0050', '3:0050:0049', '3:0051', '3:0051:0049',
+ '3:0052', '3:0052:0049'])
+
+ listing = broker.list_objects_iter(10, '3:0048', None, '3:', ':')
+ self.assertEquals(len(listing), 10)
+ self.assertEquals([row[0] for row in listing],
+ ['3:0048:', '3:0049', '3:0049:', '3:0050',
+ '3:0050:', '3:0051', '3:0051:', '3:0052', '3:0052:', '3:0053'])
+
+ listing = broker.list_objects_iter(10, None, None, '3:0049:', ':')
+ self.assertEquals(len(listing), 2)
+ self.assertEquals([row[0] for row in listing],
+ ['3:0049:', '3:0049:0049'])
+
+ # Same as above, but using the path argument, so nothing should be
+ # returned since path uses a '/' as a delimiter.
+ listing = broker.list_objects_iter(10, None, None, None, None,
+ '3:0049')
+ self.assertEquals(len(listing), 0)
+
+ listing = broker.list_objects_iter(2, None, None, '3:', ':')
+ self.assertEquals(len(listing), 2)
+ self.assertEquals([row[0] for row in listing], ['3:0000', '3:0000:'])
+
+ listing = broker.list_objects_iter(2, None, None, None, None, '3')
+ self.assertEquals(len(listing), 0)
def test_list_objects_iter_prefix_delim(self):
# Test swift.common.db.ContainerBroker.list_objects_iter
broker = self._get_broker(account='a', container='c')
- broker.initialize(normalize_timestamp('1'))
+ broker.initialize(self.initial_ts)
os.mkdir(os.path.join(self.container, 'pets'))
os.mkdir(os.path.join(self.container, 'pets', 'dogs'))
@@ -723,7 +829,7 @@ class TestContainerBroker(unittest.TestCase):
# Test swift.common.db.ContainerBroker.list_objects_iter for a
# container that has an odd file with a trailing delimiter
broker = self._get_broker(account='a', container='c')
- broker.initialize(normalize_timestamp('1'))
+ broker.initialize(self.initial_ts)
self._create_file('a')
self._create_file('a.d/a')
@@ -769,10 +875,65 @@ class TestContainerBroker(unittest.TestCase):
self.assertEquals(len(listing), 2)
self.assertEquals([row[0] for row in listing], ['b.d/a', 'b.d/b'])
+ def test_double_check_trailing_delimiter_non_slash(self):
+ # Test swift.common.db.ContainerBroker.list_objects_iter for a
+ # container that has an odd file with a trailing delimiter
+ broker = self._get_broker(account='a', container='c')
+ broker.initialize(self.initial_ts)
+
+ self._create_file('a')
+ self._create_file('a:')
+ self._create_file('a:a')
+ self._create_file('a:a:a')
+ self._create_file('a:a:b')
+ self._create_file('a:b')
+ self._create_file('b')
+ self._create_file('b:a')
+ self._create_file('b:b')
+ self._create_file('c')
+ self._create_file('a:0')
+ self._create_file('0')
+ self._create_file('0:')
+ self._create_file('00')
+ self._create_file('0:0')
+ self._create_file('0:00')
+ self._create_file('0:1')
+ self._create_file('0:1:')
+ self._create_file('0:1:0')
+ self._create_file('1')
+ self._create_file('1:')
+ self._create_file('1:0')
+
+ listing = broker.list_objects_iter(25, None, None, None, None)
+ self.assertEquals(len(listing), 22)
+ self.assertEquals([row[0] for row in listing],
+ ['0', '00', '0:', '0:0', '0:00', '0:1', '0:1:', '0:1:0', '1', '1:',
+ '1:0', 'a', 'a:', 'a:0', 'a:a', 'a:a:a', 'a:a:b', 'a:b', 'b', 'b:a',
+ 'b:b', 'c'])
+ listing = broker.list_objects_iter(25, None, None, '', ':')
+ self.assertEquals(len(listing), 10)
+ self.assertEquals([row[0] for row in listing],
+ ['0', '00', '0:', '1', '1:', 'a', 'a:', 'b', 'b:', 'c'])
+ listing = broker.list_objects_iter(25, None, None, 'a:', ':')
+ self.assertEquals(len(listing), 5)
+ self.assertEquals([row[0] for row in listing],
+ ['a:', 'a:0', 'a:a', 'a:a:', 'a:b'])
+ listing = broker.list_objects_iter(25, None, None, '0:', ':')
+ self.assertEquals(len(listing), 5)
+ self.assertEquals([row[0] for row in listing],
+ ['0:', '0:0', '0:00', '0:1', '0:1:'])
+ listing = broker.list_objects_iter(25, None, None, '0:1:', ':')
+ self.assertEquals(len(listing), 2)
+ self.assertEquals([row[0] for row in listing],
+ ['0:1:', '0:1:0'])
+ listing = broker.list_objects_iter(25, None, None, 'b:', ':')
+ self.assertEquals(len(listing), 2)
+ self.assertEquals([row[0] for row in listing], ['b:a', 'b:b'])
+
def test_metadata(self):
# Initializes a good broker for us
broker = self._get_broker(account='a', container='c')
- broker.initialize(normalize_timestamp('1'))
+ broker.initialize(self.initial_ts)
# Add our first item
first_timestamp = normalize_timestamp(1)
@@ -916,7 +1077,7 @@ class TestAccountBroker(unittest.TestCase):
def test_get_info(self):
# Test swift.common.db.AccountBroker.get_info
broker = self._get_broker(account='test1')
- broker.initialize(normalize_timestamp('1'))
+ broker.initialize(self.initial_ts)
info = broker.get_info()
self.assertEquals(info['account'], 'test1')
@@ -947,7 +1108,7 @@ class TestAccountBroker(unittest.TestCase):
def test_list_containers_iter(self):
# Test swift.common.db.AccountBroker.list_containers_iter
broker = self._get_broker(account='a')
- broker.initialize(normalize_timestamp('1'))
+ broker.initialize(self.initial_ts)
for cont1 in xrange(4):
for cont2 in xrange(125):
self._create_container('%d-%04d' % (cont1, cont2))
@@ -994,27 +1155,29 @@ class TestAccountBroker(unittest.TestCase):
listing = broker.list_containers_iter(10, '', None, '', '-')
self.assertEquals(len(listing), 4)
self.assertEquals([row[0] for row in listing],
- ['0', '1', '2', '3'])
+ ['0-', '1-', '2-', '3-'])
listing = broker.list_containers_iter(10, '2-', None, None, '-')
self.assertEquals(len(listing), 1)
- self.assertEquals([row[0] for row in listing], ['3'])
+ self.assertEquals([row[0] for row in listing], ['3-'])
listing = broker.list_containers_iter(10, '', None, '2', '-')
self.assertEquals(len(listing), 1)
- self.assertEquals([row[0] for row in listing], ['2'])
+ self.assertEquals([row[0] for row in listing], ['2-'])
listing = broker.list_containers_iter(10, '2-0050', None, '2-', '-')
self.assertEquals(len(listing), 10)
self.assertEquals(listing[0][0], '2-0051')
- self.assertEquals(listing[1][0], '2-0052')
- self.assertEquals(listing[-1][0], '2-0060')
+ self.assertEquals(listing[1][0], '2-0051-')
+ self.assertEquals(listing[2][0], '2-0052')
+ self.assertEquals(listing[-1][0], '2-0059')
listing = broker.list_containers_iter(10, '3-0045', None, '3-', '-')
self.assertEquals(len(listing), 10)
self.assertEquals([row[0] for row in listing],
- ['3-0046', '3-0047', '3-0048', '3-0049', '3-0050',
- '3-0051', '3-0052', '3-0053', '3-0054', '3-0055'])
+ ['3-0045-', '3-0046', '3-0046-', '3-0047',
+ '3-0047-', '3-0048', '3-0048-', '3-0049',
+ '3-0049-', '3-0050'])
self._create_container('3-0049-')
listing = broker.list_containers_iter(10, '3-0048', None, None, None)
@@ -1027,8 +1190,9 @@ class TestAccountBroker(unittest.TestCase):
listing = broker.list_containers_iter(10, '3-0048', None, '3-', '-')
self.assertEquals(len(listing), 10)
self.assertEquals([row[0] for row in listing],
- ['3-0049', '3-0050', '3-0051', '3-0052', '3-0053',
- '3-0054', '3-0055', '3-0056', '3-0057', '3-0058'])
+ ['3-0048-', '3-0049', '3-0049-', '3-0050',
+ '3-0050-', '3-0051', '3-0051-', '3-0052',
+ '3-0052-', '3-0053'])
listing = broker.list_containers_iter(10, None, None, '3-0049-', '-')
self.assertEquals(len(listing), 2)
@@ -1037,9 +1201,9 @@ class TestAccountBroker(unittest.TestCase):
def test_double_check_trailing_delimiter(self):
# Test swift.common.db.AccountBroker.list_containers_iter for an
- # account that has an odd file with a trailing delimiter
+ # account that has an odd container with a trailing delimiter
broker = self._get_broker(account='a')
- broker.initialize(normalize_timestamp('1'))
+ broker.initialize(self.initial_ts)
self._create_container('a')
self._create_container('a-')
self._create_container('a-a')
@@ -1050,26 +1214,27 @@ class TestAccountBroker(unittest.TestCase):
self._create_container('b-a')
self._create_container('b-b')
self._create_container('c')
+
listing = broker.list_containers_iter(15, None, None, None, None)
self.assertEquals(len(listing), 10)
self.assertEquals([row[0] for row in listing],
['a', 'a-', 'a-a', 'a-a-a', 'a-a-b', 'a-b', 'b',
'b-a', 'b-b', 'c'])
listing = broker.list_containers_iter(15, None, None, '', '-')
- self.assertEquals(len(listing), 3)
+ self.assertEquals(len(listing), 5)
self.assertEquals([row[0] for row in listing],
- ['a', 'b', 'c'])
+ ['a', 'a-', 'b', 'b-', 'c'])
listing = broker.list_containers_iter(15, None, None, 'a-', '-')
- self.assertEquals(len(listing), 3)
+ self.assertEquals(len(listing), 4)
self.assertEquals([row[0] for row in listing],
- ['a-', 'a-a', 'a-b'])
+ ['a-', 'a-a', 'a-a-', 'a-b'])
listing = broker.list_containers_iter(15, None, None, 'b-', '-')
self.assertEquals(len(listing), 2)
self.assertEquals([row[0] for row in listing], ['b-a', 'b-b'])
def test_delete_db(self):
broker = self._get_broker(account='a')
- broker.initialize(normalize_timestamp('1'))
+ broker.initialize(self.initial_ts)
self.assertEqual(broker.db_file, dd._db_file)
self.assertEqual(os.path.basename(broker.db_file), 'db_file.db')
broker.initialize(self.initial_ts)