From e5a41ca3bf74f80d8decfe22f7916be4566838ec Mon Sep 17 00:00:00 2001 From: Simon Marchi Date: Thu, 9 Apr 2020 16:44:07 -0400 Subject: [PATCH] lib: add precondition checks that count of discarded events/packets is greater than 0 It does not make sense to send a discarded packet or discarded event message with the count 0. That would mean that there is no discarded event or packet, so the message must simply not be sent. If the number of packets or events that were discarded is unknown, the count must not be set, in which case it will stay "unavailable". A precondition failure looks like: 04-12 00:17:25.171 680020 680020 F LIB/MSG-DISCARDED-ITEMS bt_message_discarded_packets_set_count@discarded-items.c:317 Babeltrace 2 library precondition not satisfied; error is: 04-12 00:17:25.171 680020 680020 F LIB/MSG-DISCARDED-ITEMS bt_message_discarded_packets_set_count@discarded-items.c:317 Discarded packet count is 0. 04-12 00:17:25.171 680020 680020 F LIB/MSG-DISCARDED-ITEMS bt_message_discarded_packets_set_count@discarded-items.c:317 Aborting... The equivalent checks are added to the Python bindings, as well as tests. Change-Id: I3b56f2635df5d918ec35e9756b0a9658e1a1668d Signed-off-by: Simon Marchi Reviewed-on: https://review.lttng.org/c/babeltrace/+/3388 CI-Build: Philippe Proulx Tested-by: jenkins Reviewed-by: Philippe Proulx --- include/babeltrace2/graph/message.h | 4 +++ src/bindings/python/bt2/bt2/message.py | 6 ++++ src/lib/graph/message/discarded-items.c | 2 ++ tests/bindings/python/bt2/test_message.py | 34 +++++++++++++++++++++++ 4 files changed, 46 insertions(+) diff --git a/include/babeltrace2/graph/message.h b/include/babeltrace2/graph/message.h index bc977238..27730f69 100644 --- a/include/babeltrace2/graph/message.h +++ b/include/babeltrace2/graph/message.h @@ -2568,6 +2568,8 @@ property. @bt_pre_not_null{message} @bt_pre_hot{message} @bt_pre_is_disc_ev_msg{message} +@pre + \bt_p{count} > 0 @sa bt_message_discarded_events_get_count() — Returns the number of discarded events of a discarded events @@ -2886,6 +2888,8 @@ property. @bt_pre_not_null{message} @bt_pre_hot{message} @bt_pre_is_disc_pkt_msg{message} +@pre + \bt_p{count} > 0 @sa bt_message_discarded_packets_get_count() — Returns the number of discarded packets of a discarded packets diff --git a/src/bindings/python/bt2/bt2/message.py b/src/bindings/python/bt2/bt2/message.py index 95522736..5f5b8656 100644 --- a/src/bindings/python/bt2/bt2/message.py +++ b/src/bindings/python/bt2/bt2/message.py @@ -233,6 +233,10 @@ class _DiscardedMessage(_DiscardedMessageConst, _Message): def _set_count(self, count): utils._check_uint64(count) + + if count == 0: + raise ValueError('discarded {} count is 0'.format(self._item_name)) + self._set_count(self._ptr, count) _count = property(fget=_DiscardedMessageConst.count.fget, fset=_set_count) @@ -258,6 +262,7 @@ class _DiscardedEventsMessageConst(_DiscardedMessageConst): class _DiscardedEventsMessage(_DiscardedEventsMessageConst, _DiscardedMessage): _borrow_stream_ptr = staticmethod(native_bt.message_discarded_events_borrow_stream) _set_count = staticmethod(native_bt.message_discarded_events_set_count) + _item_name = 'event' class _DiscardedPacketsMessageConst(_DiscardedMessageConst): @@ -280,6 +285,7 @@ class _DiscardedPacketsMessageConst(_DiscardedMessageConst): class _DiscardedPacketsMessage(_DiscardedPacketsMessageConst, _DiscardedMessage): _borrow_stream_ptr = staticmethod(native_bt.message_discarded_packets_borrow_stream) _set_count = staticmethod(native_bt.message_discarded_packets_set_count) + _item_name = 'packet' _MESSAGE_TYPE_TO_CLS = { diff --git a/src/lib/graph/message/discarded-items.c b/src/lib/graph/message/discarded-items.c index b3709cce..10c02160 100644 --- a/src/lib/graph/message/discarded-items.c +++ b/src/lib/graph/message/discarded-items.c @@ -238,6 +238,7 @@ void bt_message_discarded_events_set_count(struct bt_message *message, { BT_ASSERT_PRE_NON_NULL(message, "Message"); BT_ASSERT_PRE_MSG_IS_TYPE(message, BT_MESSAGE_TYPE_DISCARDED_EVENTS); + BT_ASSERT_PRE(count > 0, "Discarded event count is 0."); set_discarded_items_message_count(message, count); } @@ -315,6 +316,7 @@ void bt_message_discarded_packets_set_count(struct bt_message *message, { BT_ASSERT_PRE_NON_NULL(message, "Message"); BT_ASSERT_PRE_MSG_IS_TYPE(message, BT_MESSAGE_TYPE_DISCARDED_PACKETS); + BT_ASSERT_PRE(count > 0, "Discarded packet count is 0."); set_discarded_items_message_count(message, count); } diff --git a/tests/bindings/python/bt2/test_message.py b/tests/bindings/python/bt2/test_message.py index a99972aa..d9e2fdbc 100644 --- a/tests/bindings/python/bt2/test_message.py +++ b/tests/bindings/python/bt2/test_message.py @@ -418,6 +418,22 @@ class CreateDiscardedEventMessageTestCase(unittest.TestCase): self.assertIs(type(msg), bt2._DiscardedEventsMessage) self.assertEqual(msg.count, 242) + # With event count == 0. + def test_create_with_count_zero_raises(self): + def create_stream_class(tc, cc): + return tc.create_stream_class(supports_discarded_events=True) + + def msg_iter_next(msg_iter, stream): + with self.assertRaisesRegex( + ValueError, 'discarded event count is 0', + ): + msg_iter._create_discarded_events_message(stream, count=0) + + return 123 + + res = utils.run_in_message_iterator_next(create_stream_class, msg_iter_next) + self.assertEqual(res, 123) + # With clock snapshots. def test_create_with_clock_snapshots(self): def create_stream_class(tc, cc): @@ -547,6 +563,24 @@ class CreateDiscardedPacketMessageTestCase(unittest.TestCase): self.assertIs(type(msg), bt2._DiscardedPacketsMessage) self.assertEqual(msg.count, 242) + # With packet count == 0. + def test_create_with_count_zero_raises(self): + def create_stream_class(tc, cc): + return tc.create_stream_class( + supports_packets=True, supports_discarded_packets=True + ) + + def msg_iter_next(msg_iter, stream): + with self.assertRaisesRegex( + ValueError, 'discarded packet count is 0', + ): + msg_iter._create_discarded_packets_message(stream, count=0) + + return 123 + + res = utils.run_in_message_iterator_next(create_stream_class, msg_iter_next) + self.assertEqual(res, 123) + # With clock snapshots. def test_create_with_clock_snapshots(self): def create_stream_class(tc, cc): -- 2.34.1