diff options
Diffstat (limited to 'debian/patches/bugfix/all/perf-script-python-Add-Python3-support-to-export-to-.patch')
-rw-r--r-- | debian/patches/bugfix/all/perf-script-python-Add-Python3-support-to-export-to-.patch | 214 |
1 files changed, 214 insertions, 0 deletions
diff --git a/debian/patches/bugfix/all/perf-script-python-Add-Python3-support-to-export-to-.patch b/debian/patches/bugfix/all/perf-script-python-Add-Python3-support-to-export-to-.patch new file mode 100644 index 000000000..25633c098 --- /dev/null +++ b/debian/patches/bugfix/all/perf-script-python-Add-Python3-support-to-export-to-.patch @@ -0,0 +1,214 @@ +From: Tony Jones <tonyj@suse.de> +Date: Fri, 8 Mar 2019 16:05:16 -0800 +Subject: perf script python: Add Python3 support to export-to-postgresql.py +Origin: https://git.kernel.org/linus/1937b0560c3ea43b1b0f7d3617949ca50de8f8c0 +Bug-Debian: https://bugs.debian.org/944641 + +Support both Python2 and Python3 in the export-to-postgresql.py script. + +The use of 'from __future__' implies the minimum supported Python2 version +is now v2.6 + +Signed-off-by: Tony Jones <tonyj@suse.de> +Link: http://lkml.kernel.org/r/20190309000518.2438-3-tonyj@suse.de +Signed-off-by: Adrian Hunter <adrian.hunter@intel.com> +Signed-off-by: Seeteena Thoufeek <s1seetee@linux.vnet.ibm.com> +Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> +--- + tools/perf/scripts/python/export-to-postgresql.py | 58 +++++++++++++++------- + 1 file changed, 41 insertions(+), 17 deletions(-) + +--- a/tools/perf/scripts/python/export-to-postgresql.py ++++ b/tools/perf/scripts/python/export-to-postgresql.py +@@ -10,6 +10,8 @@ + # FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + # more details. + ++from __future__ import print_function ++ + import os + import sys + import struct +@@ -199,6 +201,18 @@ import datetime + + from PySide.QtSql import * + ++if sys.version_info < (3, 0): ++ def toserverstr(str): ++ return str ++ def toclientstr(str): ++ return str ++else: ++ # Assume UTF-8 server_encoding and client_encoding ++ def toserverstr(str): ++ return bytes(str, "UTF_8") ++ def toclientstr(str): ++ return bytes(str, "UTF_8") ++ + # Need to access PostgreSQL C library directly to use COPY FROM STDIN + from ctypes import * + libpq = CDLL("libpq.so.5") +@@ -234,12 +248,14 @@ perf_db_export_mode = True + perf_db_export_calls = False + perf_db_export_callchains = False + ++def printerr(*args, **kw_args): ++ print(*args, file=sys.stderr, **kw_args) + + def usage(): +- print >> sys.stderr, "Usage is: export-to-postgresql.py <database name> [<columns>] [<calls>] [<callchains>]" +- print >> sys.stderr, "where: columns 'all' or 'branches'" +- print >> sys.stderr, " calls 'calls' => create calls and call_paths table" +- print >> sys.stderr, " callchains 'callchains' => create call_paths table" ++ printerr("Usage is: export-to-postgresql.py <database name> [<columns>] [<calls>] [<callchains>]") ++ printerr("where: columns 'all' or 'branches'") ++ printerr(" calls 'calls' => create calls and call_paths table") ++ printerr(" callchains 'callchains' => create call_paths table") + raise Exception("Too few arguments") + + if (len(sys.argv) < 2): +@@ -273,7 +289,7 @@ def do_query(q, s): + return + raise Exception("Query failed: " + q.lastError().text()) + +-print datetime.datetime.today(), "Creating database..." ++print(datetime.datetime.today(), "Creating database...") + + db = QSqlDatabase.addDatabase('QPSQL') + query = QSqlQuery(db) +@@ -504,12 +520,12 @@ do_query(query, 'CREATE VIEW samples_vie + ' FROM samples') + + +-file_header = struct.pack("!11sii", "PGCOPY\n\377\r\n\0", 0, 0) +-file_trailer = "\377\377" ++file_header = struct.pack("!11sii", b"PGCOPY\n\377\r\n\0", 0, 0) ++file_trailer = b"\377\377" + + def open_output_file(file_name): + path_name = output_dir_name + "/" + file_name +- file = open(path_name, "w+") ++ file = open(path_name, "wb+") + file.write(file_header) + return file + +@@ -524,13 +540,13 @@ def copy_output_file_direct(file, table_ + + # Use COPY FROM STDIN because security may prevent postgres from accessing the files directly + def copy_output_file(file, table_name): +- conn = PQconnectdb("dbname = " + dbname) ++ conn = PQconnectdb(toclientstr("dbname = " + dbname)) + if (PQstatus(conn)): + raise Exception("COPY FROM STDIN PQconnectdb failed") + file.write(file_trailer) + file.seek(0) + sql = "COPY " + table_name + " FROM STDIN (FORMAT 'binary')" +- res = PQexec(conn, sql) ++ res = PQexec(conn, toclientstr(sql)) + if (PQresultStatus(res) != 4): + raise Exception("COPY FROM STDIN PQexec failed") + data = file.read(65536) +@@ -564,7 +580,7 @@ if perf_db_export_calls: + call_file = open_output_file("call_table.bin") + + def trace_begin(): +- print datetime.datetime.today(), "Writing to intermediate files..." ++ print(datetime.datetime.today(), "Writing to intermediate files...") + # id == 0 means unknown. It is easier to create records for them than replace the zeroes with NULLs + evsel_table(0, "unknown") + machine_table(0, 0, "unknown") +@@ -579,7 +595,7 @@ def trace_begin(): + unhandled_count = 0 + + def trace_end(): +- print datetime.datetime.today(), "Copying to database..." ++ print(datetime.datetime.today(), "Copying to database...") + copy_output_file(evsel_file, "selected_events") + copy_output_file(machine_file, "machines") + copy_output_file(thread_file, "threads") +@@ -594,7 +610,7 @@ def trace_end(): + if perf_db_export_calls: + copy_output_file(call_file, "calls") + +- print datetime.datetime.today(), "Removing intermediate files..." ++ print(datetime.datetime.today(), "Removing intermediate files...") + remove_output_file(evsel_file) + remove_output_file(machine_file) + remove_output_file(thread_file) +@@ -609,7 +625,7 @@ def trace_end(): + if perf_db_export_calls: + remove_output_file(call_file) + os.rmdir(output_dir_name) +- print datetime.datetime.today(), "Adding primary keys" ++ print(datetime.datetime.today(), "Adding primary keys") + do_query(query, 'ALTER TABLE selected_events ADD PRIMARY KEY (id)') + do_query(query, 'ALTER TABLE machines ADD PRIMARY KEY (id)') + do_query(query, 'ALTER TABLE threads ADD PRIMARY KEY (id)') +@@ -624,7 +640,7 @@ def trace_end(): + if perf_db_export_calls: + do_query(query, 'ALTER TABLE calls ADD PRIMARY KEY (id)') + +- print datetime.datetime.today(), "Adding foreign keys" ++ print(datetime.datetime.today(), "Adding foreign keys") + do_query(query, 'ALTER TABLE threads ' + 'ADD CONSTRAINT machinefk FOREIGN KEY (machine_id) REFERENCES machines (id),' + 'ADD CONSTRAINT processfk FOREIGN KEY (process_id) REFERENCES threads (id)') +@@ -659,8 +675,8 @@ def trace_end(): + do_query(query, 'CREATE INDEX pcpid_idx ON calls (parent_call_path_id)') + + if (unhandled_count): +- print datetime.datetime.today(), "Warning: ", unhandled_count, " unhandled events" +- print datetime.datetime.today(), "Done" ++ print(datetime.datetime.today(), "Warning: ", unhandled_count, " unhandled events") ++ print(datetime.datetime.today(), "Done") + + def trace_unhandled(event_name, context, event_fields_dict): + global unhandled_count +@@ -670,12 +686,14 @@ def sched__sched_switch(*x): + pass + + def evsel_table(evsel_id, evsel_name, *x): ++ evsel_name = toserverstr(evsel_name) + n = len(evsel_name) + fmt = "!hiqi" + str(n) + "s" + value = struct.pack(fmt, 2, 8, evsel_id, n, evsel_name) + evsel_file.write(value) + + def machine_table(machine_id, pid, root_dir, *x): ++ root_dir = toserverstr(root_dir) + n = len(root_dir) + fmt = "!hiqiii" + str(n) + "s" + value = struct.pack(fmt, 3, 8, machine_id, 4, pid, n, root_dir) +@@ -686,6 +704,7 @@ def thread_table(thread_id, machine_id, + thread_file.write(value) + + def comm_table(comm_id, comm_str, *x): ++ comm_str = toserverstr(comm_str) + n = len(comm_str) + fmt = "!hiqi" + str(n) + "s" + value = struct.pack(fmt, 2, 8, comm_id, n, comm_str) +@@ -697,6 +716,9 @@ def comm_thread_table(comm_thread_id, co + comm_thread_file.write(value) + + def dso_table(dso_id, machine_id, short_name, long_name, build_id, *x): ++ short_name = toserverstr(short_name) ++ long_name = toserverstr(long_name) ++ build_id = toserverstr(build_id) + n1 = len(short_name) + n2 = len(long_name) + n3 = len(build_id) +@@ -705,12 +727,14 @@ def dso_table(dso_id, machine_id, short_ + dso_file.write(value) + + def symbol_table(symbol_id, dso_id, sym_start, sym_end, binding, symbol_name, *x): ++ symbol_name = toserverstr(symbol_name) + n = len(symbol_name) + fmt = "!hiqiqiqiqiii" + str(n) + "s" + value = struct.pack(fmt, 6, 8, symbol_id, 8, dso_id, 8, sym_start, 8, sym_end, 4, binding, n, symbol_name) + symbol_file.write(value) + + def branch_type_table(branch_type, name, *x): ++ name = toserverstr(name) + n = len(name) + fmt = "!hiii" + str(n) + "s" + value = struct.pack(fmt, 2, 4, branch_type, n, name) |