From: Jérémie Galarneau Date: Mon, 20 Jul 2020 19:29:41 +0000 (-0400) Subject: Fix: consumerd: packet sent before channel rotation X-Git-Tag: v2.13.0-rc1~591 X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=commitdiff_plain;h=b32703d679aa5dd34dbee1ff21e44c3728c01b78;hp=b32703d679aa5dd34dbee1ff21e44c3728c01b78 Fix: consumerd: packet sent before channel rotation Issue observed ============== A clear test occasionally fails with the following output: # Test ust streaming rotate-clear # Parameters: tracing_active=0, clear_twice=1, rotate_before=0, rotate_after=0, buffer_type=uid ok 605 - Create session S0BXcJKWrmAwNSzm with uri:net://localhost and opts: PASS: tools/clear/test_ust 605 - Create session S0BXcJKWrmAwNSzm with uri:net://localhost and opts: ok 606 - Enable channel chan for session S0BXcJKWrmAwNSzm PASS: tools/clear/test_ust 606 - Enable channel chan for session S0BXcJKWrmAwNSzm ok 607 - Enable ust event tp:tptest for session S0BXcJKWrmAwNSzm PASS: tools/clear/test_ust 607 - Enable ust event tp:tptest for session S0BXcJKWrmAwNSzm ok 608 - Start tracing for session S0BXcJKWrmAwNSzm PASS: tools/clear/test_ust 608 - Start tracing for session S0BXcJKWrmAwNSzm ok 609 - Rotate session S0BXcJKWrmAwNSzm PASS: tools/clear/test_ust 609 - Rotate session S0BXcJKWrmAwNSzm ok 610 - Stop lttng tracing for session S0BXcJKWrmAwNSzm PASS: tools/clear/test_ust 610 - Stop lttng tracing for session S0BXcJKWrmAwNSzm ok 611 - Clear session S0BXcJKWrmAwNSzm PASS: tools/clear/test_ust 611 - Clear session S0BXcJKWrmAwNSzm ok 612 - Clear session S0BXcJKWrmAwNSzm PASS: tools/clear/test_ust 612 - Clear session S0BXcJKWrmAwNSzm Error: Relayd rotate streams replied error 97 Error: Relayd rotate stream failed. Cleaning up relayd 33 Error: Relayd send index failed. Cleaning up relayd 33. Error: Rotate channel failed Error: Stream 76 relayd ID 33 unknown. Can't write index. Error: Stream 74 relayd ID 33 unknown. Can't write index. Error: Stream 72 relayd ID 33 unknown. Can't write index. ok 613 - Start tracing for session S0BXcJKWrmAwNSzm PASS: tools/clear/test_ust 613 - Start tracing for session S0BXcJKWrmAwNSzm not ok 614 - Stop lttng tracing for session S0BXcJKWrmAwNSzm FAIL: tools/clear/test_ust 614 - Stop lttng tracing for session S0BXcJKWrmAwNSzm # Failed test 'Stop lttng tracing for session S0BXcJKWrmAwNSzm' # in ./tools/clear//../../../utils/utils.sh:stop_lttng_tracing_opt() at line 1311. ok 615 - Validate trace for event tp:tptest, 1 events PASS: tools/clear/test_ust 615 - Validate trace for event tp:tptest, 1 events not ok 616 - Read a total of 1 events, expected 4 FAIL: tools/clear/test_ust 616 - Read a total of 1 events, expected 4 # Failed test 'Read a total of 1 events, expected 4' # in ./tools/clear//../../../utils/utils.sh:validate_trace_count() at line 1764. Error: Failed to perform an implicit rotation as part of the destruction of session "S0BXcJKWrmAwNSzm": Unknown error code not ok 617 - Destroy session S0BXcJKWrmAwNSzm FAIL: tools/clear/test_ust 617 - Destroy session S0BXcJKWrmAwNSzm # Failed test 'Destroy session S0BXcJKWrmAwNSzm' # in ./tools/clear//../../../utils/utils.sh:destroy_lttng_session() at line 1347. # Test ust streaming clear-rotate Looking at the relay daemon log when the problem is reproduced, we see: Error: Protocol error: received a packet for a stream that doesn't have a current trace chunk: stream_id = 1, channel_name = chan_0 Cause ===== The "rotate channel" consumer command iterates over a channel's streams to perform a rotation and open a new packet when necessary (see comments). In the case where a channel is associated with a relay daemon, the rotation positions are accumulated to send a single "rotate channel streams" command to the relay daemon. This is done to reduce the time needed to complete a rotation when tracing to a relay daemon through an high-latency network connection. Unfortunately, this causes packets to be opened before the rotation command was sent to the relay daemon as the "open packet" command is performed during the iteration on the streams. Solution ======== Streams for which a packet should be opened are accumulated into an array of stream pointers. The "open packet" is performed after a successful rotation of the streams as a second "pass". Known drawbacks =============== None. Signed-off-by: Jérémie Galarneau Change-Id: I6cb0b92619da73ebf223e1dfee88530e4244b56b ---