trace-cmd: Resend record --date fix
cover trace-cmd: Resend record --date fix
Resending "trace-cmd record --date" fix while keeping backward compatibility.
Ideally those two patches should land together since the second one assumes that all v3 listeners follow new behavior and don't write options in the trace file.
Slavomir Kaslev (2):
trace-cmd: Bump protocol version to v3
trace-cmd: Fix record --date flag when sending tracing data to a
listener
include/trace-cmd/trace-cmd.h | 13 ++- tracecmd/include/trace-msg.h | 6 +- tracecmd/trace-listen.c | 37 +++---- tracecmd/trace-msg.c | 187 +++++++++++++++------------------- tracecmd/trace-output.c | 26 +++-- tracecmd/trace-record.c | 78 +++++++------- 6 files changed, 176 insertions(+), 171 deletions(-)
Signature · 1 line
2.19.1
PATCH 1/2 trace-cmd: Bump protocol version to v3
This patch bumps trace-cmd protocol to v3 while keeping backward compatibility by falling back to v1.
The new protocol works similarly to v2 but allows future extension of commands by saving the command size on the wire and having the client on the other side to only read the bits it understands.
--- include/trace-cmd/trace-cmd.h | 6 +- tracecmd/include/trace-msg.h | 6 +- tracecmd/trace-listen.c | 30 +++--- tracecmd/trace-msg.c | 187 +++++++++++++++------------------- tracecmd/trace-output.c | 2 +- tracecmd/trace-record.c | 26 ++--- 6 files changed, 119 insertions(+), 138 deletions(-)
include/trace-cmd/trace-cmd.h +3 -3
@@ -316,16 +316,16 @@ void tracecmd_msg_handle_close(struct tracecmd_msg_handle *msg_handle);/* for clients */ int tracecmd_msg_send_init_data (struct tracecmd_msg_handle *msg_handle,int **client_ports); -int tracecmd_msg_metadata_send (struct tracecmd_msg_handle *msg_handle, +int tracecmd_msg_data_send (struct tracecmd_msg_handle *msg_handle,const char *buf,int size); -int tracecmd_msg_finish_sending_metadata (struct tracecmd_msg_handle *msg_handle); +int tracecmd_msg_finish_sending_data (struct tracecmd_msg_handle *msg_handle);void tracecmd_msg_send_close_msg (struct tracecmd_msg_handle *msg_handle);/* for server */ int tracecmd_msg_initial_setting (struct tracecmd_msg_handle *msg_handle);int tracecmd_msg_send_port_array (struct tracecmd_msg_handle *msg_handle,int *ports); -int tracecmd_msg_collect_metadata (struct tracecmd_msg_handle *msg_handle,int ofd); +int tracecmd_msg_collect_data (struct tracecmd_msg_handle *msg_handle,int ofd);bool tracecmd_msg_done (struct tracecmd_msg_handle *msg_handle);void tracecmd_msg_set_done (struct tracecmd_msg_handle *msg_handle);
tracecmd/include/trace-msg.h +3 -3
@@ -4,11 +4,11 @@#include <stdbool.h> #define UDP_MAX_PACKET (65536 - 20) -#define V2_MAGIC "677768\0" -#define V2_CPU "-1V2" +#define V3_MAGIC "766679\0" +#define V3_CPU "-1V3"#define V1_PROTOCOL 1 -#define V2_PROTOCOL 2 +#define V3_PROTOCOL 3extern unsigned int page_size;
tracecmd/trace-listen.c +16 -14
@@ -366,7 +366,7 @@ static int communicate_with_client(struct tracecmd_msg_handle *msg_handle)/* Is the client using the new protocol? */ if (cpus ==-1 ) { -if (memcmp (buf,V2_CPU , n) !=0 ) { +if (memcmp (buf,V3_CPU , n) !=0 ) {/* If it did not send a version, then bail */ if (memcmp (buf,"-1V" ,3 )) {plog ("Unknown string %s\n" , buf);
@@ -382,27 +382,29 @@ static int communicate_with_client(struct tracecmd_msg_handle *msg_handle) }free (last_proto); last_proto =malloc (n +1 ); -if (last_proto) { -memcpy (last_proto, buf, n); - last_proto[n] =0 ; - } +if (!last_proto) +return -ENOMEM ; + +memcpy (last_proto, buf, n); + last_proto[n] =0 ; +/* Return the highest protocol we can use */ -write (fd,"V2" ,3 ); +write (fd,"V3" ,3 ); goto try_again; } -/* Let the client know we use v2 protocol */ -write (fd,"V2" ,3 ); +/* Let the client know we use v3 protocol */ +write (fd,"V3" ,3 );/* read the rest of dummy data */ - n =read (fd, buf,sizeof (V2_MAGIC )); -if (memcmp (buf,V2_MAGIC , n) !=0 ) + n =read (fd, buf,sizeof (V3_MAGIC )); +if (memcmp (buf,V3_MAGIC , n) !=0 ) goto out;/* We're off! */ write (fd,"OK" ,2 ); - msg_handle->version =V2_PROTOCOL ; + msg_handle->version =V3_PROTOCOL ;/* read the CPU count, the page size, and options */ if ((pagesize =tracecmd_msg_initial_setting (msg_handle)) <0 )
@@ -557,7 +559,7 @@ static int *create_all_readers(const char *node, const char *port, start_port = udp_port +1 ; } -if (msg_handle->version ==V2_PROTOCOL ) { +if (msg_handle->version ==V3_PROTOCOL ) {/* send set of port numbers to the client */ if (tracecmd_msg_send_port_array (msg_handle, port_array) <0 ) {plog ("Failed sending port array\n" );
@@ -674,8 +676,8 @@ static int process_client(struct tracecmd_msg_handle *msg_handle, stop_msg_handle = msg_handle;/* Now we are ready to start reading data from the client */ -if (msg_handle->version ==V2_PROTOCOL ) -tracecmd_msg_collect_metadata (msg_handle, ofd); +if (msg_handle->version ==V3_PROTOCOL ) +tracecmd_msg_collect_data (msg_handle, ofd);else collect_metadata_from_client (msg_handle, ofd);
tracecmd/trace-msg.c +83 -104
371 lines not on this page · raw message
tracecmd/trace-output.c +1 -1
@@ -74,7 +74,7 @@ static stsize_t do_write_check(struct tracecmd_output *handle, const void *data, tsize_t size) { if (handle->msg_handle) - return tracecmd_msg_metadata_send(handle->msg_handle, data, size); + return tracecmd_msg_data_send(handle->msg_handle, data, size);return __do_write_check (handle->fd, data, size); }
tracecmd/trace-record.c +13 -13
@@ -2747,7 +2747,7 @@ static void communicate_with_listener_v1(struct tracecmd_msg_handle *msg_handle) } } -static void communicate_with_listener_v2 (struct tracecmd_msg_handle *msg_handle) +static void communicate_with_listener_v3 (struct tracecmd_msg_handle *msg_handle) {if (tracecmd_msg_send_init_data (msg_handle, &client_ports) <0 )die ("Cannot communicate with server" );
@@ -2764,8 +2764,8 @@ static void check_protocol_version(struct tracecmd_msg_handle *msg_handle)/* * Write the protocol version, the magic number, and the dummy * option(0) (in ASCII). The client understands whether the client -* uses the v2 protocol or not by checking a reply message from the -* server. If the message is "V2", the server uses v2 protocol. On the +* uses the v3 protocol or not by checking a reply message from the +* server. If the message is "V3", the server uses v3 protocol. On the * other hands, if the message is just number strings, the server * returned port numbers. So, in that time, the client understands the * server uses the v1 protocol. However, the old server tells the
@@ -2773,7 +2773,7 @@ static void check_protocol_version(struct tracecmd_msg_handle *msg_handle)* So, we add the dummy number (the magic number and 0 option) to the * first client message. */ -write (fd,V2_CPU ,sizeof (V2_CPU )); +write (fd,V3_CPU ,sizeof (V3_CPU )); buf[0 ] =0 ;
@@ -2785,10 +2785,10 @@ static void check_protocol_version(struct tracecmd_msg_handle *msg_handle) msg_handle->version =V1_PROTOCOL ;plog ("Use the v1 protocol\n" ); }else { -if (memcmp (buf,"V2" , n) !=0 ) +if (memcmp (buf,"V3" , n) !=0 )die ("Cannot handle the protocol %s" , buf); -/* OK, let's use v2 protocol */ -write (fd,V2_MAGIC ,sizeof (V2_MAGIC )); +/* OK, let's use v3 protocol */ +write (fd,V3_MAGIC ,sizeof (V3_MAGIC )); n =read (fd, buf,BUFSIZ -1 );if (n !=2 ||memcmp (buf,"OK" ,2 ) !=0 ) {
@@ -2857,20 +2857,20 @@ again:die ("Failed to allocate message handle" ); msg_handle->cpu_count = local_cpu_count; - msg_handle->version =V2_PROTOCOL ; + msg_handle->version =V3_PROTOCOL ; }if (use_tcp) msg_handle->flags |=TRACECMD_MSG_FL_USE_TCP ; -if (msg_handle->version ==V2_PROTOCOL ) { +if (msg_handle->version ==V3_PROTOCOL ) {check_protocol_version (msg_handle);if (msg_handle->version ==V1_PROTOCOL ) {/* reconnect to the server for using the v1 protocol */ close (sfd); goto again; } -communicate_with_listener_v2 (msg_handle); +communicate_with_listener_v3 (msg_handle); }if (msg_handle->version ==V1_PROTOCOL )
@@ -2888,9 +2888,9 @@ setup_connection(struct buffer_instance *instance) msg_handle =setup_network ();/* Now create the handle through this socket */ -if (msg_handle->version ==V2_PROTOCOL ) { +if (msg_handle->version ==V3_PROTOCOL ) { network_handle =tracecmd_create_init_fd_msg (msg_handle, listed_events); -tracecmd_msg_finish_sending_metadata (msg_handle); +tracecmd_msg_finish_sending_data (msg_handle); }else network_handle =tracecmd_create_init_fd_glob (msg_handle->fd, listed_events);
@@ -2903,7 +2903,7 @@ setup_connection(struct buffer_instance *instance)static void finish_network (struct tracecmd_msg_handle *msg_handle) { -if (msg_handle->version ==V2_PROTOCOL ) +if (msg_handle->version ==V3_PROTOCOL )tracecmd_msg_send_close_msg (msg_handle);tracecmd_msg_handle_close (msg_handle);free (host);
Signature · 1 line
2.19.1
Re: [PATCH 1/2] trace-cmd: Bump protocol version to v3
Quoted 7 lines · On Mon, 3 Dec 2018 18:09:36 +0200 Slavomir Kaslev <[email protected]> wrote:
This patch bumps trace-cmd protocol to v3 while keeping backward compatibility by falling back to v1.
The new protocol works similarly to v2 but allows future extension of commands by saving the command size on the wire and having the client on the other side to only read the bits it understands.
So is this a V3 that is ready for prime time?
That is, you are happy with the protocol and that old code will work with the new (as we talked about before).
-- Steve
Re: [PATCH 1/2] trace-cmd: Bump protocol version to v3
Quoted 12 lines · Steven Rostedt
Quoted 7 lines · On Mon, 3 Dec 2018 18:09:36 +0200 Slavomir Kaslev <[email protected]> wrote:
This patch bumps trace-cmd protocol to v3 while keeping backward compatibility by falling back to v1.
The new protocol works similarly to v2 but allows future extension of commands by saving the command size on the wire and having the client on the other side to only read the bits it understands.
Quoted 4 lines
So is this a V3 that is ready for prime time?
That is, you are happy with the protocol and that old code will work with the new (as we talked about before).
Yes, I'm happy it. It allows us to add fields to our current commands in the future and should be backward and forward compatible.
I will resend the vsock patch rebased after those two patches get reviewed and merged.
--
Slavi
PATCH 2/2 trace-cmd: Fix record --date flag when sending tracing data to a listener
In reply to Slavomir KaslevCurrently the trace-cmd record --date is not taken into account when tracing data is sent to a remote host with the -N flag.
This patch fixes this by the writing output buffer options from the recording side instead of on the listener side.
We also provide backward compatibility by falling back to previous behavior when we're not using protocol v3.
--- include/trace-cmd/trace-cmd.h | 7 +++-- tracecmd/trace-listen.c | 7 +++-- tracecmd/trace-output.c | 24 ++++++++++++---- tracecmd/trace-record.c | 52 +++++++++++++++++++---------------- 4 files changed, 57 insertions(+), 33 deletions(-)
include/trace-cmd/trace-cmd.h +5 -2
@@ -245,6 +245,7 @@ struct tracecmd_option *tracecmd_add_option(struct tracecmd_output *handle, const void *data);struct tracecmd_option *tracecmd_add_buffer_option (struct tracecmd_output *handle,const char *name,int cpus); +int tracecmd_write_options (struct tracecmd_output *handle,int cpus);int tracecmd_update_option (struct tracecmd_output *handle,struct tracecmd_option *option,int size,const void *data);
@@ -257,8 +258,10 @@ int tracecmd_append_cpu_data(struct tracecmd_output *handle,int tracecmd_append_buffer_cpu_data (struct tracecmd_output *handle,struct tracecmd_option *option,int cpus,char *const *cpu_data_files); -int tracecmd_attach_cpu_data (char *file,int cpus,char *const *cpu_data_files); -int tracecmd_attach_cpu_data_fd (int fd,int cpus,char *const *cpu_data_files); +int tracecmd_attach_cpu_data (char *file,int cpus,char *const *cpu_data_files, +bool write_options); +int tracecmd_attach_cpu_data_fd (int fd,int cpus,char *const *cpu_data_files, +bool write_options);/* --- Reading the Fly Recorder Trace --- */
tracecmd/trace-listen.c +4 -3
@@ -626,7 +626,7 @@ static void stop_all_readers(int cpus, int *pid_array) }static int put_together_file (int cpus,int ofd,const char *node, -const char *port) +const char *port,bool write_options) {char **temp_files;int cpu;
@@ -643,7 +643,7 @@ static int put_together_file(int cpus, int ofd, const char *node, goto out; } -tracecmd_attach_cpu_data_fd (ofd, cpus, temp_files); +tracecmd_attach_cpu_data_fd (ofd, cpus, temp_files, write_options); ret =0 ; out:for (cpu--; cpu >=0 ; cpu--) {
@@ -694,7 +694,8 @@ static int process_client(struct tracecmd_msg_handle *msg_handle,/* wait a little to have the readers clean up */ sleep (1 ); - ret =put_together_file (cpus, ofd, node, port); + ret =put_together_file (cpus, ofd, node, port, + msg_handle->version !=V3_PROTOCOL );destroy_all_readers (cpus, pid_array, node, port);
tracecmd/trace-output.c +19 -5
@@ -973,6 +973,15 @@ static int add_options(struct tracecmd_output *handle)return 0 ; } +int tracecmd_write_options (struct tracecmd_output *handle,int cpus) +{ + cpus =convert_endian_4 (handle, cpus); +if (do_write_check (handle, &cpus,4 )) +return -1 ; + +return add_options (handle); +} +int tracecmd_update_option (struct tracecmd_output *handle,struct tracecmd_option *option,int size,const void *data)
@@ -1227,7 +1236,7 @@ int tracecmd_append_buffer_cpu_data(struct tracecmd_output *handle,return __tracecmd_append_cpu_data (handle, cpus, cpu_data_files); } -int tracecmd_attach_cpu_data_fd (int fd,int cpus,char *const *cpu_data_files) +int tracecmd_attach_cpu_data_fd (int fd,int cpus,char *const *cpu_data_files,bool write_options) {struct tracecmd_input *ihandle;struct tracecmd_output *handle;
@@ -1264,8 +1273,13 @@ int tracecmd_attach_cpu_data_fd(int fd, int cpus, char * const *cpu_data_files) handle->page_size =tracecmd_page_size (ihandle);list_head_init (&handle->options); -if (tracecmd_append_cpu_data (handle, cpus, cpu_data_files) >=0 ) - ret =0 ; +if (write_options) { +if (tracecmd_append_cpu_data (handle, cpus, cpu_data_files) >=0 ) + ret =0 ; + }else { +if (__tracecmd_append_cpu_data (handle, cpus, cpu_data_files) >=0 ) + ret =0 ; + }tracecmd_output_close (handle); out_free:
@@ -1273,7 +1287,7 @@ int tracecmd_attach_cpu_data_fd(int fd, int cpus, char * const *cpu_data_files)return ret; } -int tracecmd_attach_cpu_data (char *file,int cpus,char *const *cpu_data_files) +int tracecmd_attach_cpu_data (char *file,int cpus,char *const *cpu_data_files,bool write_options) {int fd;
@@ -1281,7 +1295,7 @@ int tracecmd_attach_cpu_data(char *file, int cpus, char * const *cpu_data_files)if (fd <0 )return -1 ; -return tracecmd_attach_cpu_data_fd (fd, cpus, cpu_data_files); +return tracecmd_attach_cpu_data_fd (fd, cpus, cpu_data_files, write_options); } struct tracecmd_output *
tracecmd/trace-record.c +29 -23
101 lines not on this page · raw message
Signature · 1 line
2.19.1
Quoted 10 lines · On Mon, 3 Dec 2018 18:09:35 +0200 Slavomir Kaslev <[email protected]> wrote:
Resending "trace-cmd record --date" fix while keeping backward compatibility.
Ideally those two patches should land together since the second one assumes that all v3 listeners follow new behavior and don't write options in the trace file.
Slavomir Kaslev (2):
trace-cmd: Bump protocol version to v3
trace-cmd: Fix record --date flag when sending tracing data to a
listener
Note, both patches do not have a signed-off-by. Can you resend with that fixed.
Thanks!
-- Steve