Skip to content

Commit dbd8d74

Browse files
committed
feat(plugin): add support for seeking
When working with large traces, we want to provide efficient extraction of the interesting trace sections. For that, we implement seeking support. Signed-off-by: Felix Moessbauer <[email protected]>
1 parent 894448a commit dbd8d74

File tree

3 files changed

+116
-0
lines changed

3 files changed

+116
-0
lines changed

src/bt-ftrace-plugin.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,15 @@ BT_PLUGIN_SOURCE_COMPONENT_CLASS_MESSAGE_ITERATOR_CLASS_INITIALIZE_METHOD(
3535
tracedat, ftrace_in_message_iterator_initialize);
3636
BT_PLUGIN_SOURCE_COMPONENT_CLASS_MESSAGE_ITERATOR_CLASS_FINALIZE_METHOD(
3737
tracedat, ftrace_in_message_iterator_finalize);
38+
39+
/* seek interface */
40+
BT_PLUGIN_SOURCE_COMPONENT_CLASS_MESSAGE_ITERATOR_CLASS_SEEK_BEGINNING_METHODS(
41+
tracedat, ftrace_in_message_iterator_seek_beginning,
42+
ftrace_in_message_iterator_can_seek_beginning);
43+
BT_PLUGIN_SOURCE_COMPONENT_CLASS_MESSAGE_ITERATOR_CLASS_SEEK_NS_FROM_ORIGIN_METHODS(
44+
tracedat, ftrace_in_message_iterator_seek_ns_from_origin,
45+
ftrace_in_message_iterator_can_seek_ns_from_origin);
46+
3847
BT_PLUGIN_SOURCE_COMPONENT_CLASS_GET_SUPPORTED_MIP_VERSIONS_METHOD(
3948
tracedat, ftrace_get_supported_mip_versions);
4049
BT_PLUGIN_SOURCE_COMPONENT_CLASS_QUERY_METHOD(tracedat, ftrace_query_method);

src/bt-ftrace-source.c

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@
2121
* babeltrace2 --plugin-path=. query -p "inputs=[trace.dat]"
2222
* source.ftrace.tracedat babeltrace.trace-infos
2323
*
24+
* Seek in trace:
25+
* babeltrace2 trace.dat --begin=<> --end=<>
2426
*/
2527

2628
#define _GNU_SOURCE
@@ -571,6 +573,10 @@ ftrace_in_message_iterator_initialize(
571573
ftrace_in_iter->events_in_pkg = 0;
572574
ftrace_in_iter->events_discarded = 0;
573575

576+
/* the iterator supports seeking */
577+
bt_self_message_iterator_configuration_set_can_seek_forward(configuration,
578+
BT_TRUE);
579+
574580
/* Set the message iterator's user data to our private data structure */
575581
bt_self_message_iterator_set_data(self_message_iterator, ftrace_in_iter);
576582

@@ -807,6 +813,91 @@ ftrace_in_message_iterator_next(bt_self_message_iterator *self_message_iterator,
807813
return status;
808814
}
809815

816+
bt_message_iterator_class_seek_beginning_method_status
817+
ftrace_in_message_iterator_seek_beginning(
818+
bt_self_message_iterator *self_message_iterator)
819+
{
820+
struct ftrace_in_message_iterator *ftrace_in_iter =
821+
bt_self_message_iterator_get_data(self_message_iterator);
822+
823+
/* cleanup current state */
824+
tracecmd_free_record(ftrace_in_iter->rec);
825+
BT_PACKET_PUT_REF_AND_RESET(ftrace_in_iter->packet);
826+
827+
/* Set the message iterator's initial state */
828+
ftrace_in_iter->rec = tracecmd_read_cpu_first(
829+
ftrace_in_iter->ftrace_in->tc_input, ftrace_in_iter->cpu_id);
830+
831+
ftrace_in_iter->events_in_pkg = 0;
832+
ftrace_in_iter->events_discarded = 0;
833+
ftrace_in_iter->last_rec_ts = 0;
834+
ftrace_in_iter->state = FTRACE_IN_MESSAGE_ITERATOR_STATE_STREAM_BEGINNING;
835+
836+
return BT_MESSAGE_ITERATOR_CLASS_SEEK_BEGINNING_METHOD_STATUS_OK;
837+
}
838+
839+
bt_message_iterator_class_can_seek_beginning_method_status
840+
ftrace_in_message_iterator_can_seek_beginning(
841+
bt_self_message_iterator *self_message_iterator, bt_bool *can_seek)
842+
{
843+
*can_seek = BT_TRUE;
844+
return BT_MESSAGE_ITERATOR_CLASS_CAN_SEEK_BEGINNING_METHOD_STATUS_OK;
845+
}
846+
847+
bt_message_iterator_class_seek_ns_from_origin_method_status
848+
ftrace_in_message_iterator_seek_ns_from_origin(
849+
bt_self_message_iterator *self_message_iterator, int64_t ns_from_origin)
850+
{
851+
struct ftrace_in_message_iterator *ftrace_in_iter =
852+
bt_self_message_iterator_get_data(self_message_iterator);
853+
bt_logging_level log_level = ftrace_in_iter->ftrace_in->log_level;
854+
855+
const bt_stream *stream =
856+
ftrace_in_iter->ftrace_in->streams[ftrace_in_iter->cpu_id];
857+
const bt_bool supports_discarded_events =
858+
bt_stream_class_supports_discarded_events(
859+
bt_stream_borrow_class_const(stream));
860+
861+
/* the cast is safe, as we only allow positive seeking anyways */
862+
const uint64_t ns_from_orig_pos = (uint64_t)ns_from_origin;
863+
if (ftrace_in_iter->last_rec_ts < ns_from_orig_pos) {
864+
while (ftrace_in_iter->rec &&
865+
ftrace_in_iter->last_rec_ts < ns_from_orig_pos) {
866+
tracecmd_free_record(ftrace_in_iter->rec);
867+
868+
ftrace_in_iter->rec = tracecmd_read_data(
869+
ftrace_in_iter->ftrace_in->tc_input, ftrace_in_iter->cpu_id);
870+
if (supports_discarded_events && ftrace_in_iter->rec) {
871+
ftrace_in_iter->events_discarded =
872+
ftrace_in_iter->rec->missed_events;
873+
}
874+
}
875+
} else {
876+
return BT_MESSAGE_ITERATOR_CLASS_SEEK_NS_FROM_ORIGIN_METHOD_STATUS_ERROR;
877+
}
878+
879+
return BT_MESSAGE_ITERATOR_CLASS_SEEK_NS_FROM_ORIGIN_METHOD_STATUS_OK;
880+
}
881+
882+
bt_message_iterator_class_can_seek_ns_from_origin_method_status
883+
ftrace_in_message_iterator_can_seek_ns_from_origin(
884+
bt_self_message_iterator *self_message_iterator, int64_t ns_from_origin,
885+
bt_bool *can_seek)
886+
{
887+
struct ftrace_in_message_iterator *ftrace_in_iter =
888+
bt_self_message_iterator_get_data(self_message_iterator);
889+
/* we can only seek forward */
890+
if (ns_from_origin < 0 ||
891+
ftrace_in_iter->last_rec_ts > (uint64_t)ns_from_origin) {
892+
BT_FTRACE_LOG_DEBUG(ftrace_in_iter->ftrace_in->log_level,
893+
"cannot seek backwards");
894+
*can_seek = BT_FALSE;
895+
} else {
896+
*can_seek = BT_TRUE;
897+
}
898+
return BT_MESSAGE_ITERATOR_CLASS_CAN_SEEK_NS_FROM_ORIGIN_METHOD_STATUS_OK;
899+
}
900+
810901
bt_component_class_get_supported_mip_versions_method_status
811902
ftrace_get_supported_mip_versions(
812903
bt_self_component_class_source *const self_component_class,

src/bt-ftrace-source.h

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,22 @@ ftrace_in_message_iterator_next(bt_self_message_iterator *self_message_iterator,
2626
bt_message_array_const messages,
2727
uint64_t capacity, uint64_t *count);
2828

29+
/* seek interface */
30+
bt_message_iterator_class_seek_beginning_method_status
31+
ftrace_in_message_iterator_seek_beginning(
32+
bt_self_message_iterator *self_message_iterator);
33+
34+
bt_message_iterator_class_can_seek_beginning_method_status
35+
ftrace_in_message_iterator_can_seek_beginning(
36+
bt_self_message_iterator *self_message_iterator, bt_bool *can_seek);
37+
bt_message_iterator_class_seek_ns_from_origin_method_status
38+
ftrace_in_message_iterator_seek_ns_from_origin(
39+
bt_self_message_iterator *self_message_iterator, int64_t ns_from_origin);
40+
bt_message_iterator_class_can_seek_ns_from_origin_method_status
41+
ftrace_in_message_iterator_can_seek_ns_from_origin(
42+
bt_self_message_iterator *self_message_iterator, int64_t ns_from_origin,
43+
bt_bool *can_seek);
44+
2945
bt_component_class_get_supported_mip_versions_method_status
3046
ftrace_get_supported_mip_versions(
3147
bt_self_component_class_source *const self_component_class,

0 commit comments

Comments
 (0)