pg-lock-tracer 0.6.2__py3-none-any.whl → 0.7.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- __version__ = "0.6.2"
1
+ __version__ = "0.7.1"
@@ -0,0 +1,57 @@
1
+ #include <uapi/linux/ptrace.h>
2
+
3
+ #define MAX_STR_LEN 128
4
+
5
+ typedef struct SpinDelayStatus_t {
6
+ int spins;
7
+ int delays;
8
+ int cur_delay;
9
+ const char *file;
10
+ int line;
11
+ const char *func;
12
+ } SpinDelayStatus;
13
+
14
+ typedef struct SpinDelayEvent_t {
15
+ u32 pid;
16
+ u64 timestamp;
17
+ int spins;
18
+ int delays;
19
+ int cur_delay;
20
+ int line;
21
+ char file[MAX_STR_LEN];
22
+ char func[MAX_STR_LEN];
23
+ } SpinDelayEvent;
24
+
25
+ BPF_PERF_OUTPUT(lockevents);
26
+
27
+ int spin_delay(struct pt_regs *ctx) {
28
+ SpinDelayEvent event = {};
29
+ SpinDelayStatus status = {};
30
+ SpinDelayStatus *status_ptr = (SpinDelayStatus *)PT_REGS_PARM1(ctx);
31
+
32
+ event.pid = bpf_get_current_pid_tgid();
33
+ event.timestamp = bpf_ktime_get_ns();
34
+
35
+ if (!status_ptr) {
36
+ lockevents.perf_submit(ctx, &event, sizeof(SpinDelayEvent));
37
+ return 0;
38
+ }
39
+
40
+ bpf_probe_read_user(&status, sizeof(status), status_ptr);
41
+
42
+ event.spins = status.spins;
43
+ event.delays = status.delays;
44
+ event.cur_delay = status.cur_delay;
45
+ event.line = status.line;
46
+
47
+ if (status.file) {
48
+ bpf_probe_read_user_str(&event.file, sizeof(event.file), status.file);
49
+ }
50
+
51
+ if (status.func) {
52
+ bpf_probe_read_user_str(&event.func, sizeof(event.func), status.func);
53
+ }
54
+
55
+ lockevents.perf_submit(ctx, &event, sizeof(SpinDelayEvent));
56
+ return 0;
57
+ }
@@ -34,7 +34,7 @@ class OIDResolver:
34
34
  host=hostname,
35
35
  port=port,
36
36
  )
37
-
37
+ self.connection.set_session(autocommit=True)
38
38
  self.cur = self.connection.cursor()
39
39
 
40
40
  # Warmup cache
@@ -470,7 +470,8 @@ class PGLockTraceOutputHuman(PGLockTraceOutput):
470
470
  )
471
471
  line = line.decode("utf-8")
472
472
  # Get line with: 'gdb info line *(symbol+0x1111)'
473
- print(f"\t{line}")
473
+ line = f"\t{line}"
474
+ self.handle_output_line(line)
474
475
 
475
476
 
476
477
  class PGLockTraceOutputJSON(PGLockTraceOutput):
@@ -0,0 +1,159 @@
1
+ #!/usr/bin/env python3
2
+ #
3
+ # PostgreSQL spinlock delay tracer.
4
+ #
5
+ ###############################################
6
+
7
+ import sys
8
+ import argparse
9
+
10
+ from bcc import BPF
11
+
12
+ from pg_lock_tracer import __version__
13
+ from pg_lock_tracer.helper import BPFHelper
14
+
15
+ EXAMPLES = """examples:
16
+ # Trace spin delays of the given PostgreSQL binary
17
+ pg_spinlock_delay_tracer -x /home/jan/postgresql-sandbox/bin/REL_14_9_DEBUG/bin/postgres
18
+
19
+ # Trace spin delays of the PID 1234
20
+ pg_spinlock_delay_tracer -p 1234 -x /home/jan/postgresql-sandbox/bin/REL_14_9_DEBUG/bin/postgres
21
+
22
+ # Trace spin delays of the PID 1234 and 5678
23
+ pg_spinlock_delay_tracer -p 1234 -p 5678 -x /home/jan/postgresql-sandbox/bin/REL_14_9_DEBUG/bin/postgres
24
+
25
+ # Trace spin delays of the PID 1234 and be verbose
26
+ pg_spinlock_delay_tracer -p 1234 -x /home/jan/postgresql-sandbox/bin/REL_14_9_DEBUG/bin/postgres -v
27
+ """
28
+
29
+ parser = argparse.ArgumentParser(
30
+ description="",
31
+ formatter_class=argparse.RawDescriptionHelpFormatter,
32
+ epilog=EXAMPLES,
33
+ )
34
+ parser.add_argument(
35
+ "-V",
36
+ "--version",
37
+ action="version",
38
+ version=f"{parser.prog} ({__version__})",
39
+ )
40
+ parser.add_argument("-v", "--verbose", action="store_true", help="Be verbose")
41
+ parser.add_argument(
42
+ "-p",
43
+ "--pid",
44
+ type=int,
45
+ nargs="+",
46
+ dest="pids",
47
+ metavar="PID",
48
+ help="the pid(s) to trace",
49
+ )
50
+ parser.add_argument(
51
+ "-x",
52
+ "--exe",
53
+ type=str,
54
+ required=True,
55
+ dest="path",
56
+ metavar="PATH",
57
+ help="path to binary",
58
+ )
59
+ parser.add_argument(
60
+ "-d",
61
+ "--dry-run",
62
+ action="store_true",
63
+ help="compile and load the BPF program but exit afterward",
64
+ )
65
+
66
+
67
+ class PGSpinDelayTracer:
68
+ def __init__(self, prog_args):
69
+ self.bpf_instance = None
70
+ self.args = prog_args
71
+
72
+ # Belong the processes to the binary?
73
+ BPFHelper.check_pid_exe(self.args.pids, self.args.path)
74
+
75
+ @staticmethod
76
+ def _decode_field(value):
77
+ return value.decode("utf-8", "replace").rstrip("\x00")
78
+
79
+ def print_lock_event(self, _cpu, data, _size):
80
+ """
81
+ Print a new spin delay event.
82
+ """
83
+ event = self.bpf_instance["lockevents"].event(data)
84
+
85
+ if self.args.pids and event.pid not in self.args.pids:
86
+ return
87
+
88
+ file_name = self._decode_field(event.file) or "(unknown)"
89
+ func_name = self._decode_field(event.func) or "(unknown)"
90
+
91
+ print(
92
+ f"{event.timestamp} [Pid {event.pid}] SpinDelay "
93
+ f"spins={event.spins} delays={event.delays} "
94
+ f"cur_delay={event.cur_delay} at {func_name}, {file_name}:{event.line}"
95
+ )
96
+
97
+ def init(self):
98
+ """
99
+ Init the PostgreSQL spin delay tracer
100
+ """
101
+ bpf_program = BPFHelper.read_bpf_program("pg_spinlock_delay_tracer.c")
102
+
103
+ if self.args.verbose:
104
+ print(bpf_program)
105
+
106
+ # Disable warnings like
107
+ # 'warning: '__HAVE_BUILTIN_BSWAP32__' macro redefined [-Wmacro-redefined]'
108
+ bpf_cflags = ["-Wno-macro-redefined"] if not self.args.verbose else []
109
+
110
+ print("===> Compiling BPF program")
111
+ self.bpf_instance = BPF(text=bpf_program, cflags=bpf_cflags)
112
+
113
+ print("===> Attaching BPF probes")
114
+ self.attach_probes()
115
+
116
+ # Open the event queue
117
+ self.bpf_instance["lockevents"].open_perf_buffer(
118
+ self.print_lock_event, page_cnt=BPFHelper.page_cnt
119
+ )
120
+
121
+ def attach_probes(self):
122
+ """
123
+ Attach BPF probes
124
+ """
125
+ BPFHelper.register_ebpf_probe(
126
+ self.args.path,
127
+ self.bpf_instance,
128
+ "^perform_spin_delay$",
129
+ "spin_delay",
130
+ self.args.verbose,
131
+ )
132
+
133
+ def run(self):
134
+ """
135
+ Run the BPF program and read results
136
+ """
137
+ print("===> Ready to trace")
138
+ while True:
139
+ try:
140
+ self.bpf_instance.perf_buffer_poll()
141
+ except KeyboardInterrupt:
142
+ sys.exit(0)
143
+
144
+
145
+ def main():
146
+ """
147
+ Entry point for the BPF based PostgreSQL spin delay tracer.
148
+ """
149
+ args = parser.parse_args()
150
+
151
+ pg_spin_delay_tracer = PGSpinDelayTracer(args)
152
+ pg_spin_delay_tracer.init()
153
+
154
+ if not args.dry_run:
155
+ pg_spin_delay_tracer.run()
156
+
157
+
158
+ if __name__ == "__main__":
159
+ main()
@@ -1,24 +1,25 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.4
2
2
  Name: pg_lock_tracer
3
- Version: 0.6.2
4
- Summary: A BPF based lock tracer for the PostgreSQL database
5
- Home-page: https://github.com/jnidzwetzki/pg-lock-tracer
6
- Author: Jan Nidzwetzki
3
+ Version: 0.7.1
4
+ Summary: An eBPF based lock tracer for PostgreSQL
5
+ Author-email: Jan Nidzwetzki <jnidzwetzki@gmx.de>
6
+ License-Expression: Apache-2.0
7
+ Project-URL: Homepage, https://github.com/jnidzwetzki/pg-lock-tracer
7
8
  Project-URL: Bug Tracker, https://github.com/jnidzwetzki/pg-lock-tracer/issues
8
- Keywords: postgresql bpf lock locktracer
9
+ Keywords: postgresql,postgres,ebpf,locktracer
9
10
  Classifier: Development Status :: 4 - Beta
10
11
  Classifier: Intended Audience :: Developers
11
12
  Classifier: Operating System :: POSIX :: Linux
12
13
  Classifier: Programming Language :: Python
13
14
  Classifier: Topic :: Software Development :: Debuggers
14
- Classifier: License :: OSI Approved :: Apache Software License
15
- Requires-Python: >=3.6
15
+ Requires-Python: >=3.10
16
16
  Description-Content-Type: text/markdown
17
17
  License-File: LICENSE
18
18
  Requires-Dist: graphviz
19
19
  Requires-Dist: igraph
20
20
  Requires-Dist: prettytable
21
21
  Requires-Dist: psycopg2
22
+ Dynamic: license-file
22
23
 
23
24
  # Lock tracing tools for PostgreSQL
24
25
  [![Make a PR](https://img.shields.io/badge/PRs-welcome-brightgreen.svg)](http://makeapullrequest.com)
@@ -33,9 +34,10 @@ This project provides tools that allow you to gain deep insights into PostgreSQL
33
34
  * `pg_lock_tracer` - is a PostgreSQL table level lock tracer.
34
35
  * `pg_lw_lock_tracer` - is a tracer for PostgreSQL lightweight locks (LWLocks).
35
36
  * `pg_row_lock_tracer` - is a tracer for PostgreSQL row locks.
37
+ * `pg_spinlock_delay_tracer` - is a tracer for PostgreSQL spinlock delays.
36
38
  * `animate_lock_graph` - creates animated locks graphs based on the `pg_lock_tracer` output.
37
39
 
38
- __Note:__ These tools employ the [eBPF](https://ebpf.io/) (_Extended Berkeley Packet Filter_) technology. At the moment, PostgreSQL 12, 13, 14, 15, and 16 are supported (see additional information below).
40
+ __Note:__ These tools employ the [eBPF](https://ebpf.io/) (_Extended Berkeley Packet Filter_) technology. At the moment, PostgreSQL 14, 15, 16, 17, and 18 are supported (see additional information below).
39
41
 
40
42
  # pg_lock_tracer
41
43
  `pg_lock_tracer` observes the locking activity of a running PostgreSQL process (using _eBPF_ and _UProbes_). In contrast to the information that is present in the table `pg_locks` (which provides information about which locks are _currently_ requested), `pg_lock_tracer` gives you a continuous view of the locking activity and collects statistics and timings.
@@ -880,6 +882,53 @@ Lock results:
880
882
  +---------+-------+--------------+-----------------+------------+------------+------------------+---------------+
881
883
  ```
882
884
 
885
+ # pg_spinlock_delay_tracer
886
+ `pg_spinlock_delay_tracer` allows tracing spinlock delays in a PostgreSQL process. Spin locks are used in PostgreSQL to protect short critical sections in the code. If another process already holds a spinlock, the requesting process will repeatedly check (i.e., "spin") until the lock becomes available. If the lock is held for a longer period, PostgreSQL performs a ["spin delay"](https://github.com/postgres/postgres/blob/0c8e082fba8d36434552d3d7800abda54acafd57/src/backend/storage/lmgr/s_lock.c#L106) and yields the CPU for a short time to avoid busy-waiting. Such delays are reported via the `pg_spinlock_delay_tracer`. For each delay, it prints the content of the `SpinDelayStatus` structure, which contains information about the number of spins, delays, and the current delay time. Additionally, the function name and source code location where the spin delay occurred are reported.
887
+
888
+ ## Usage Examples
889
+ ```
890
+ # Trace the spinlock delays of the given PostgreSQL binary
891
+ pg_spinlock_delay_tracer -x /home/jan/postgresql-sandbox/bin/REL_17_1_DEBUG/bin/postgres
892
+
893
+ # Trace the spinlock delays of the PID 1234
894
+ pg_spinlock_delay_tracer -p 1234 -x /home/jan/postgresql-sandbox/bin/REL_17_1_DEBUG/bin/postgres
895
+ ```
896
+
897
+ ## Example output
898
+ To reproduce a spinlock delay, follow these steps to simulate a delay at the WAL insert position. First, start two different sessions connected to the same database. Then, create two tables:
899
+
900
+ ```sql
901
+ CREATE TABLE mydata1 (id INT);
902
+ CREATE TABLE mydata2 (id INT);
903
+ ```
904
+
905
+ Next, open a debugger and set a breakpoint in the function `ReserveXLogInsertLocation` after the spin lock `SpinLockAcquire(&Insert->insertpos_lck);` is acquired. Afterward, start the `pg_spinlock_delay_tracer` and perform two inserts in the two different sessions:
906
+
907
+ ```
908
+ # Session 1
909
+ INSERT INTO mydata1 VALUES(1);
910
+ # Session 2
911
+ INSERT INTO mydata2 VALUES(2);
912
+ ```
913
+
914
+ Note: Two different tables are used to prevent both sessions from trying to lock the same buffer and waiting for each other on a different lock.
915
+
916
+ The debugger should stop in the first session at the breakpoint. Furthermore, the pg_spinlock_delay_tracer should report spinlock delays in the second session, as the first session holds the spinlock for a longer period.
917
+
918
+ ```
919
+ pg_spinlock_delay_tracer -x /home/jan/postgresql-sandbox/bin/REL_17_1_DEBUG/bin/postgres
920
+ [...]
921
+ 13180680737869452 [Pid 1864403] SpinDelay spins=996 delays=939 cur_delay=566086 at ReserveXLogInsertLocation, xlog.c:1132
922
+ 13180680737874986 [Pid 1864403] SpinDelay spins=997 delays=939 cur_delay=566086 at ReserveXLogInsertLocation, xlog.c:1132
923
+ 13180680737880522 [Pid 1864403] SpinDelay spins=998 delays=939 cur_delay=566086 at ReserveXLogInsertLocation, xlog.c:1132
924
+ 13180680737886009 [Pid 1864403] SpinDelay spins=999 delays=939 cur_delay=566086 at ReserveXLogInsertLocation, xlog.c:1132
925
+ 13180681304189362 [Pid 1864403] SpinDelay spins=0 delays=940 cur_delay=661655 at ReserveXLogInsertLocation, xlog.c:1132
926
+ 13180681304227806 [Pid 1864403] SpinDelay spins=1 delays=940 cur_delay=661655 at ReserveXLogInsertLocation, xlog.c:1132
927
+ 13180681304241759 [Pid 1864403] SpinDelay spins=2 delays=940 cur_delay=661655 at ReserveXLogInsertLocation, xlog.c:1132
928
+ 13180681304255150 [Pid 1864403] SpinDelay spins=3 delays=940 cur_delay=661655 at ReserveXLogInsertLocation, xlog.c:1132
929
+ [...]
930
+ ```
931
+
883
932
  # Additional Information
884
933
 
885
934
  ## Installation
@@ -917,8 +966,8 @@ pip install git+https://github.com/jnidzwetzki/pg-lock-tracer
917
966
  ```
918
967
 
919
968
  ## PostgreSQL Build
920
- The software is tested with PostgreSQL versions 12, 13, 14, and 15. In order to be able to attach the _uprobes_ to the functions, they should not to be optimized away (e.g., inlined) during the compilation of PostgreSQL. Otherwise errors like `Unable to locate function XXX` will occur when `pg_lock_tracer` is started.
969
+ The software is tested with PostgreSQL versions 14, 15, 16, 17, and 18. In order to be able to attach the _uprobes_ to the functions, they should not to be optimized away (e.g., inlined) during the compilation of PostgreSQL. Otherwise errors like `Unable to locate function XXX` will occur when `pg_lock_tracer` is started.
921
970
 
922
- It is recommended to compile PostgreSQL with following CFLAGS: `CFLAGS="-ggdb -Og -g3 -fno-omit-frame-pointer"`.
971
+ It is recommended to compile PostgreSQL with the following CFLAGS: `CFLAGS="-ggdb -Og -g3 -fno-omit-frame-pointer"`.
923
972
 
924
973
  `pg_lw_lock_trace` uses [USDT probes](https://www.postgresql.org/docs/current/dynamic-trace.html). Therefore, PostgreSQL has to be compiled with `--enable-dtrace` to use this script.
@@ -0,0 +1,19 @@
1
+ pg_lock_tracer/__init__.py,sha256=2KJZDSMOG7KS82AxYOrZ4ZihYxX0wjfUjDsIZh3L024,22
2
+ pg_lock_tracer/animate_lock_graph.py,sha256=J8b57ySVq_6QeL6_IJyycYzQK0CBkOcdGdicdJOa3Mc,12296
3
+ pg_lock_tracer/helper.py,sha256=1RnApDu4u3tzyy2fh3aIfNTPToZTUOVZvzpYvNFGvvA,5270
4
+ pg_lock_tracer/oid_resolver.py,sha256=ryNmoHphrHCcnv8RauhikPUvTseBSuCOOk_sI950GiM,3591
5
+ pg_lock_tracer/pg_lock_tracer.py,sha256=Y6Fs1PFKJdd7MCzq2AeoQtqGuspiMi8Pl9yF7sCZHgM,30168
6
+ pg_lock_tracer/pg_lw_lock_tracer.py,sha256=Jgsr9ArWQigj-ndeAKEObVIYyNIaTKNGIkDrtA8sj9w,13204
7
+ pg_lock_tracer/pg_row_lock_tracer.py,sha256=duQalO2vf-QX4WRFd6K0WRunFlZbTHZeVkeWkr35zbo,10405
8
+ pg_lock_tracer/pg_spinlock_delay_tracer.py,sha256=Y7jmWvQBUfsOGnC73VSzEKh0piB9Pb_2t9b_bpdfliw,4227
9
+ pg_lock_tracer/bpf/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10
+ pg_lock_tracer/bpf/pg_lock_tracer.c,sha256=EM9gFZtkeBROIM692s-DrD-xlW0khFRNLXPN5_nBFBg,14003
11
+ pg_lock_tracer/bpf/pg_lw_lock_tracer.c,sha256=BxEpEOCo7hLJSOjcsKkng3kZhYJ80A_6k-9nxaJ6e2A,4916
12
+ pg_lock_tracer/bpf/pg_row_lock_tracer.c,sha256=U2Uqtv68qi72bJCVNHdpO68QTVJzhUFRATHX4hCWzDY,3344
13
+ pg_lock_tracer/bpf/pg_spinlock_delay_tracer.c,sha256=2jnGd4cd-98L4F4Xmq20OgzUR-EtcJ6AS-pdZ3uCfcU,1254
14
+ pg_lock_tracer-0.7.1.dist-info/licenses/LICENSE,sha256=opL3U54Vdmg02lhP1XzHATC9Fyy393DcZBi-HqotSlQ,11348
15
+ pg_lock_tracer-0.7.1.dist-info/METADATA,sha256=4tSjM_f3jM0uDqrhvGAfN6rzF6B6Ii-fcQvvAeH-7_0,76948
16
+ pg_lock_tracer-0.7.1.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
17
+ pg_lock_tracer-0.7.1.dist-info/entry_points.txt,sha256=2INTMo_Wcg6yPd559KVI44CWNifXRG7j_WVJNN6xZCg,320
18
+ pg_lock_tracer-0.7.1.dist-info/top_level.txt,sha256=nRoLeqWT0GSR4-JDcVRuI5ltF69rs7ftfkvImNbiR1Q,15
19
+ pg_lock_tracer-0.7.1.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: bdist_wheel (0.42.0)
2
+ Generator: setuptools (80.10.2)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
@@ -3,3 +3,4 @@ animate_lock_graph = pg_lock_tracer.animate_lock_graph:main
3
3
  pg_lock_tracer = pg_lock_tracer.pg_lock_tracer:main
4
4
  pg_lw_lock_tracer = pg_lock_tracer.pg_lw_lock_tracer:main
5
5
  pg_row_lock_tracer = pg_lock_tracer.pg_row_lock_tracer:main
6
+ pg_spinlock_delay_tracer = pg_lock_tracer.pg_spinlock_delay_tracer:main
@@ -1,17 +0,0 @@
1
- pg_lock_tracer/__init__.py,sha256=jFlbxEJFS0G44LE-yXXVSwXACA1J_NyYDk5E20_2zpc,22
2
- pg_lock_tracer/animate_lock_graph.py,sha256=J8b57ySVq_6QeL6_IJyycYzQK0CBkOcdGdicdJOa3Mc,12296
3
- pg_lock_tracer/helper.py,sha256=1RnApDu4u3tzyy2fh3aIfNTPToZTUOVZvzpYvNFGvvA,5270
4
- pg_lock_tracer/oid_resolver.py,sha256=B9kAqNzrFPP3UdstpUXkKR_No9EKLD_5nsd9ERH8vKI,3535
5
- pg_lock_tracer/pg_lock_tracer.py,sha256=VnhM_XMYJu6-3D8ileMiWAaFezNRpkYll_x_DL1f6jE,30122
6
- pg_lock_tracer/pg_lw_lock_tracer.py,sha256=Jgsr9ArWQigj-ndeAKEObVIYyNIaTKNGIkDrtA8sj9w,13204
7
- pg_lock_tracer/pg_row_lock_tracer.py,sha256=duQalO2vf-QX4WRFd6K0WRunFlZbTHZeVkeWkr35zbo,10405
8
- pg_lock_tracer/bpf/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
9
- pg_lock_tracer/bpf/pg_lock_tracer.c,sha256=EM9gFZtkeBROIM692s-DrD-xlW0khFRNLXPN5_nBFBg,14003
10
- pg_lock_tracer/bpf/pg_lw_lock_tracer.c,sha256=BxEpEOCo7hLJSOjcsKkng3kZhYJ80A_6k-9nxaJ6e2A,4916
11
- pg_lock_tracer/bpf/pg_row_lock_tracer.c,sha256=U2Uqtv68qi72bJCVNHdpO68QTVJzhUFRATHX4hCWzDY,3344
12
- pg_lock_tracer-0.6.2.dist-info/LICENSE,sha256=opL3U54Vdmg02lhP1XzHATC9Fyy393DcZBi-HqotSlQ,11348
13
- pg_lock_tracer-0.6.2.dist-info/METADATA,sha256=ek8e1a6N2wJf_IqFI5OL8YCGRgDyNdqOHDnbHyXf_5Y,73514
14
- pg_lock_tracer-0.6.2.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92
15
- pg_lock_tracer-0.6.2.dist-info/entry_points.txt,sha256=kCKw8Zbn3YXKdu8mBeVzIzOmGoLjD-5D40CZg8-_W9c,248
16
- pg_lock_tracer-0.6.2.dist-info/top_level.txt,sha256=nRoLeqWT0GSR4-JDcVRuI5ltF69rs7ftfkvImNbiR1Q,15
17
- pg_lock_tracer-0.6.2.dist-info/RECORD,,