summaryrefslogtreecommitdiffstats
path: root/debian/patches/bugfix/all/perf-script-python-Add-Python3-support-to-export-to-.patch
diff options
context:
space:
mode:
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-.patch214
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)