BIND 10 trac2856, updated. e7855781ad5d287d91c883143bbe2552bcc29f8d [2856] Reorder methods

BIND 10 source code commits bind10-changes at lists.isc.org
Mon Jul 8 12:09:23 UTC 2013


The branch, trac2856 has been updated
       via  e7855781ad5d287d91c883143bbe2552bcc29f8d (commit)
       via  59c4a138d18a6fb2a0adc0daff488406b6a6ad09 (commit)
       via  af0db15b1727fb986a5a08819624b231f97999e8 (commit)
       via  3401846345cc6654eec63649e6bf1c71261b8b4f (commit)
       via  e68217dd349bb078aae6029b95e182ed165e7bcf (commit)
       via  c6e820b3078f39bfc19c40afb1c0294c15c16707 (commit)
      from  8df3463968ed8d79144303a9ec82accc7f7302db (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit e7855781ad5d287d91c883143bbe2552bcc29f8d
Author: Mukund Sivaraman <muks at isc.org>
Date:   Mon Jul 8 17:39:05 2013 +0530

    [2856] Reorder methods

commit 59c4a138d18a6fb2a0adc0daff488406b6a6ad09
Author: Mukund Sivaraman <muks at isc.org>
Date:   Mon Jul 8 17:37:20 2013 +0530

    [2856] Add add_reader() tests

commit af0db15b1727fb986a5a08819624b231f97999e8
Author: Mukund Sivaraman <muks at isc.org>
Date:   Mon Jul 8 17:32:28 2013 +0530

    [2856] Fix test name

commit 3401846345cc6654eec63649e6bf1c71261b8b4f
Author: Mukund Sivaraman <muks at isc.org>
Date:   Mon Jul 8 17:32:09 2013 +0530

    [2856] Move test in file

commit e68217dd349bb078aae6029b95e182ed165e7bcf
Author: Mukund Sivaraman <muks at isc.org>
Date:   Mon Jul 8 17:31:53 2013 +0530

    [2856] Test UPDATING -> SYNCHRONIZING with and without events in the queue

commit c6e820b3078f39bfc19c40afb1c0294c15c16707
Author: Mukund Sivaraman <muks at isc.org>
Date:   Mon Jul 8 17:25:26 2013 +0530

    [2856] Add state transition test helpers, and extend complete_update() tests

-----------------------------------------------------------------------

Summary of changes:
 src/lib/python/isc/memmgr/datasrc_info.py          |   62 +++++++-------
 .../python/isc/memmgr/tests/datasrc_info_tests.py  |   85 ++++++++++++++++++--
 2 files changed, 111 insertions(+), 36 deletions(-)

-----------------------------------------------------------------------
diff --git a/src/lib/python/isc/memmgr/datasrc_info.py b/src/lib/python/isc/memmgr/datasrc_info.py
index cf7456d..9d329a8 100644
--- a/src/lib/python/isc/memmgr/datasrc_info.py
+++ b/src/lib/python/isc/memmgr/datasrc_info.py
@@ -67,25 +67,46 @@ class SegmentInfo:
     def get_events(self):
         return self.__events
 
+    def __sync_reader_helper(self, new_state):
+        if len(self.__old_readers) == 0:
+            self.__state = new_state
+            if len(self.__events) > 0:
+                e = self.__events[0]
+                del self.__events[0]
+                return e
+
+        return None
+
+    def add_event(self, event_data):
+        self.__events.append(event_data)
+
+    def add_reader(self, reader_session_id):
+        if reader_session_id in self.__readers:
+            raise SegmentInfoError('Reader session ID is already in readers set: ' +
+                                   str(reader_session_id))
+
+        self.__readers.add(reader_session_id)
+
+    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 complete_update(self):
         if self.__state == self.UPDATING:
             self.__state = self.SYNCHRONIZING
+            self.__old_readers.update(self.__readers)
+            self.__readers.clear()
+            return self.__sync_reader_helper(self.SYNCHRONIZING)
         elif self.__state == self.COPYING:
             self.__state = self.READY
+            return None
         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 ' +
@@ -100,7 +121,7 @@ class SegmentInfo:
         self.__old_readers.remove(reader_session_id)
         self.__readers.add(reader_session_id)
 
-        return self.__sync_reader_helper()
+        return self.__sync_reader_helper(self.COPYING)
 
     def remove_reader(self, reader_session_id):
         if self.__state != self.SYNCHRONIZING:
@@ -108,7 +129,7 @@ class SegmentInfo:
                                    '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()
+            return self.__sync_reader_helper(self.COPYING)
         elif reader_session_id in self.__readers:
             self.__readers.remove(reader_session_id)
             return None
@@ -117,23 +138,6 @@ class SegmentInfo:
                                    '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 c8cf77f..b2d02d1 100644
--- a/src/lib/python/isc/memmgr/tests/datasrc_info_tests.py
+++ b/src/lib/python/isc/memmgr/tests/datasrc_info_tests.py
@@ -65,21 +65,92 @@ class TestSegmentInfo(unittest.TestCase):
         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):
+    def __si_to_ready_state(self):
+        # Go to a default starting state
+        self.__sgmt_info = SegmentInfo.create('mapped', 0, RRClass.IN,
+                                              'sqlite3',
+                                              {'mapped_file_dir':
+                                                   self.__mapped_file_dir})
+        self.assertEqual(self.__sgmt_info.get_state(), SegmentInfo.READY)
+
+    def __si_to_updating_state(self):
+        self.__si_to_ready_state()
+        self.__sgmt_info.add_reader(3)
+        self.__sgmt_info.add_event((42,))
+        e = self.__sgmt_info.start_update()
+        self.assertTupleEqual(e, (42,))
+        self.assertSetEqual(self.__sgmt_info.get_readers(), {3})
+        self.assertEqual(self.__sgmt_info.get_state(), SegmentInfo.UPDATING)
+
+    def __si_to_synchronizing_state(self):
+        self.__si_to_updating_state()
+        self.__sgmt_info.complete_update()
+        self.assertEqual(self.__sgmt_info.get_state(), SegmentInfo.SYNCHRONIZING)
+
+    def __si_to_copying_state(self):
+        self.__si_to_synchronizing_state()
+        self.__sgmt_info.sync_reader(3)
+        self.assertEqual(self.__sgmt_info.get_state(), SegmentInfo.COPYING)
+
+    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_add_reader(self):
+        self.assertSetEqual(self.__sgmt_info.get_readers(), set())
+        self.__sgmt_info.add_reader(1)
+        self.assertSetEqual(self.__sgmt_info.get_readers(), {1})
+        self.__sgmt_info.add_reader(3)
+        self.assertSetEqual(self.__sgmt_info.get_readers(), {1, 3})
+        # ordering doesn't matter in sets
+        self.__sgmt_info.add_reader(2)
+        self.assertSetEqual(self.__sgmt_info.get_readers(), {1, 2, 3})
+        self.assertSetEqual(self.__sgmt_info.get_readers(), {1, 3, 2})
+
+        # adding the same existing reader must throw
+        self.assertRaises(SegmentInfoError, self.__sgmt_info.add_reader, (1))
+        # but the existing readers must be untouched
+        self.assertSetEqual(self.__sgmt_info.get_readers(), {1, 3, 2})
+
+    def test_complete_update(self):
+        # in READY state
+        self.__si_to_ready_state()
+        self.assertRaises(SegmentInfoError, self.__sgmt_info.complete_update)
+
+        # in UPDATING state this is the same as calling
+        # self.__si_to_synchronizing_state(), but let's try to be
+        # descriptive
+        #
+        # a) with no events
+        self.__si_to_updating_state()
+        e = self.__sgmt_info.complete_update()
+        self.assertIsNone(e)
+        self.assertEqual(self.__sgmt_info.get_state(), SegmentInfo.SYNCHRONIZING)
+
+        # b) with events
+        self.__si_to_updating_state()
+        self.__sgmt_info.add_event((81,))
+        e = self.__sgmt_info.complete_update()
+        self.assertIsNone(e) # old_readers is not empty
+        self.assertEqual(self.__sgmt_info.get_state(), SegmentInfo.SYNCHRONIZING)
+
+        # in SYNCHRONIZING state
+        self.__si_to_synchronizing_state()
         self.assertRaises(SegmentInfoError, self.__sgmt_info.complete_update)
 
+        # in COPYING state with no events
+        self.__si_to_copying_state()
+        self.__sgmt_info.complete_update()
+        self.assertEqual(self.__sgmt_info.get_state(), SegmentInfo.READY)
+
     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):
+    def test_switch_versions(self):
         self.__sgmt_info.switch_versions()
         self.__check_sgmt_reset_param(SegmentInfo.WRITER, 1)
         self.__check_sgmt_reset_param(SegmentInfo.READER, 0)



More information about the bind10-changes mailing list