From: Mukund Sivaraman Date: Fri, 5 Jul 2013 11:07:44 +0000 (+0530) Subject: [2856] Extend SegmentInfo and add some basic tests X-Git-Tag: bind10-1.2.0beta1-release~306^2~37 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=a06a52e6609159bb97b49169192b19d9657aceff;p=thirdparty%2Fkea.git [2856] Extend SegmentInfo and add some basic tests This is according to the description in #2856, but it needs further testing and also documentation. These will be added in future commits after handling "load" command in the MemorySegmentBuilder. --- diff --git a/src/lib/python/isc/memmgr/datasrc_info.py b/src/lib/python/isc/memmgr/datasrc_info.py index 86f2d6a637..cf7456d9c3 100644 --- a/src/lib/python/isc/memmgr/datasrc_info.py +++ b/src/lib/python/isc/memmgr/datasrc_info.py @@ -43,6 +43,97 @@ class SegmentInfo: READER = 0 WRITER = 1 + # Enumerated values for state + UPDATING = 0 + SYNCHRONIZING = 1 + COPYING = 2 + READY = 3 + + def __init__(self): + self.__state = self.READY + self.__readers = set() + self.__old_readers = set() + self.__events = [] + + def get_state(self): + return self.__state + + def get_readers(self): + return self.__readers + + def get_old_readers(self): + return self.__old_readers + + def get_events(self): + return self.__events + + def complete_update(self): + if self.__state == self.UPDATING: + self.__state = self.SYNCHRONIZING + elif self.__state == self.COPYING: + self.__state = self.READY + else: + raise SegmentInfoError('complete_update() called in ' + + 'incorrect state: ' + str(self.__state)) + + def __sync_reader_helper(self): + if len(self.__old_readers) == 0: + self.__state = self.COPYING + if len(self.__events) > 0: + e = self.__events[0] + del self.__events[0] + return e + + return None + + def sync_reader(self, reader_session_id): + if self.__state != self.SYNCHRONIZING: + raise SegmentInfoError('sync_reader() called in ' + + 'incorrect state: ' + str(self.__state)) + if reader_session_id not in self.__old_readers: + raise SegmentInfoError('Reader session ID is not in old readers set: ' + + reader_session_id) + if reader_session_id in self.__readers: + raise SegmentInfoError('Reader session ID is already in readers set: ' + + reader_session_id) + + self.__old_readers.remove(reader_session_id) + self.__readers.add(reader_session_id) + + return self.__sync_reader_helper() + + def remove_reader(self, reader_session_id): + if self.__state != self.SYNCHRONIZING: + raise SegmentInfoError('remove_reader() called in ' + + 'incorrect state: ' + str(self.__state)) + if reader_session_id in self.__old_readers: + self.__old_readers.remove(reader_session_id) + return self.__sync_reader_helper() + elif reader_session_id in self.__readers: + self.__readers.remove(reader_session_id) + return None + else: + raise SegmentInfoError('Reader session ID is not in current ' + + 'readers or old readers set: ' + + reader_session_id) + + def add_event(self, event_data): + self.__events.append(event_data) + + def start_update(self): + if self.__state == self.READY and len(self.__events) > 0: + self.__state = self.UPDATING + return self.__events[0] + + return None + + def add_reader(self, reader_session_id): + if reader_session_id in self.__readers: + raise SegmentInfoError('Reader session ID is already in readers set: ' + + reader_session_id) + + self.__readers.add(reader_session_id) + def create(type, genid, rrclass, datasrc_name, mgr_config): """Factory of specific SegmentInfo subclass instance based on the segment type. diff --git a/src/lib/python/isc/memmgr/tests/datasrc_info_tests.py b/src/lib/python/isc/memmgr/tests/datasrc_info_tests.py index cc6307f046..c8cf77f662 100644 --- a/src/lib/python/isc/memmgr/tests/datasrc_info_tests.py +++ b/src/lib/python/isc/memmgr/tests/datasrc_info_tests.py @@ -60,6 +60,25 @@ class TestSegmentInfo(unittest.TestCase): self.__check_sgmt_reset_param(SegmentInfo.WRITER, 0) self.__check_sgmt_reset_param(SegmentInfo.READER, None) + self.assertEqual(self.__sgmt_info.get_state(), SegmentInfo.READY) + self.assertEqual(len(self.__sgmt_info.get_readers()), 0) + self.assertEqual(len(self.__sgmt_info.get_old_readers()), 0) + self.assertEqual(len(self.__sgmt_info.get_events()), 0) + + def test_complete_update_when_ready(self): + self.assertRaises(SegmentInfoError, self.__sgmt_info.complete_update) + + def test_sync_reader_when_ready(self): + self.assertRaises(SegmentInfoError, self.__sgmt_info.sync_reader, (None)) + + def test_remove_reader_when_ready(self): + self.assertRaises(SegmentInfoError, self.__sgmt_info.remove_reader, (None)) + + def test_add_event(self): + self.assertEqual(len(self.__sgmt_info.get_events()), 0) + self.__sgmt_info.add_event(None) + self.assertNotEqual(len(self.__sgmt_info.get_events()), 0) + def test_swtich_versions(self): self.__sgmt_info.switch_versions() self.__check_sgmt_reset_param(SegmentInfo.WRITER, 1)