Skip to content

Commit 32204bb

Browse files
committed
Debug
1 parent 5236dfa commit 32204bb

File tree

6 files changed

+191
-3
lines changed

6 files changed

+191
-3
lines changed

.github/workflows/debug.yml

Lines changed: 146 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,146 @@
1+
name: Debug
2+
3+
on:
4+
push:
5+
branches:
6+
- "debug"
7+
8+
jobs:
9+
build-wheels:
10+
runs-on: ${{ matrix.os }}
11+
strategy:
12+
matrix:
13+
python-version: [3.5, 3.6, 3.7, 3.8, 3.9]
14+
os: [ubuntu-20.04]
15+
arch: [aarch64]
16+
exclude:
17+
# Python 3.5 is unable to properly
18+
# find the recent VS tooling
19+
# https://bugs.python.org/issue30389
20+
- os: windows-latest
21+
python-version: 3.5
22+
- os: windows-latest
23+
arch: aarch64
24+
- os: macos-latest
25+
arch: aarch64
26+
27+
defaults:
28+
run:
29+
shell: bash
30+
31+
steps:
32+
- uses: actions/checkout@v1
33+
with:
34+
fetch-depth: 50
35+
submodules: true
36+
37+
- name: Set up QEMU
38+
if: matrix.arch == 'aarch64'
39+
uses: docker/setup-qemu-action@v1
40+
41+
- name: Set up Python ${{ matrix.python-version }}
42+
uses: actions/setup-python@v1
43+
with:
44+
python-version: ${{ matrix.python-version }}
45+
46+
- name: Install Python Deps
47+
run: |
48+
python -m pip install --upgrade setuptools pip wheel
49+
50+
- name: Build Wheels (linux)
51+
if: startsWith(matrix.os, 'ubuntu')
52+
env:
53+
PYTHON_VERSION: ${{ matrix.python-version }}
54+
ARCH: ${{ matrix.arch }}
55+
run: |
56+
case "${ARCH}" in
57+
x86_64)
58+
mlimg=manylinux1_x86_64
59+
;;
60+
aarch64)
61+
mlimg=manylinux2014_aarch64
62+
;;
63+
*)
64+
echo "Unsupported wheel arch: ${ARCH}" >&2
65+
exit 1
66+
;;
67+
esac
68+
69+
docker run --rm \
70+
-v "${GITHUB_WORKSPACE}":/github/workspace:rw \
71+
--workdir=/github/workspace \
72+
-e GITHUB_WORKSPACE=/github/workspace \
73+
-e PYTHON_VERSION="${PYTHON_VERSION}" \
74+
--entrypoint=/github/workspace/.github/workflows/build-manylinux-wheels.sh \
75+
quay.io/pypa/${mlimg}
76+
77+
- name: Build Wheels (non-linux)
78+
if: "!startsWith(matrix.os, 'ubuntu')"
79+
run: |
80+
make clean
81+
python setup.py bdist_wheel
82+
83+
- name: Test Wheels (native)
84+
if: |
85+
!contains(github.event.pull_request.labels.*.name, 'skip wheel tests')
86+
&& matrix.arch == 'x86_64'
87+
env:
88+
OS: ${{ matrix.os }}
89+
run: |
90+
if [ "${OS}" = "windows-latest" ]; then
91+
export PGINSTALLATION="${PGBIN}"
92+
fi
93+
"${GITHUB_WORKSPACE}/.github/workflows/test-wheels.sh"
94+
95+
- name: Test Wheels (emulated)
96+
if: |
97+
!contains(github.event.pull_request.labels.*.name, 'skip wheel tests')
98+
&& matrix.arch != 'x86_64'
99+
env:
100+
PYTHON_VERSION: ${{ matrix.python-version }}
101+
PGVERSION: 13
102+
DISTRO_NAME: focal
103+
ARCH: ${{ matrix.arch }}
104+
run: |
105+
sudo env DISTRO_NAME="${DISTRO_NAME}" PGVERSION="${PGVERSION}" \
106+
.github/workflows/install-postgres.sh
107+
# Allow docker guest to connect to the database
108+
echo "port = 5433" | \
109+
sudo tee --append /etc/postgresql/${PGVERSION}/main/postgresql.conf
110+
echo "listen_addresses = '*'" | \
111+
sudo tee --append /etc/postgresql/${PGVERSION}/main/postgresql.conf
112+
echo "host all all 172.17.0.0/16 trust" | \
113+
sudo tee --append /etc/postgresql/${PGVERSION}/main/pg_hba.conf
114+
if [ "${PGVERSION}" -ge "11" ]; then
115+
# Disable JIT to avoid unpredictable timings in tests.
116+
echo "jit = off" | \
117+
sudo tee --append /etc/postgresql/${PGVERSION}/main/postgresql.conf
118+
fi
119+
sudo pg_ctlcluster ${PGVERSION} main restart
120+
121+
case "${ARCH}" in
122+
aarch64)
123+
img="docker.io/arm64v8/python:${PYTHON_VERSION}-buster"
124+
;;
125+
*)
126+
echo "Unsupported wheel arch: ${ARCH}" >&2
127+
exit 1
128+
;;
129+
esac
130+
131+
docker run --rm \
132+
-v "${GITHUB_WORKSPACE}":/github/workspace:rw \
133+
-e GITHUB_WORKSPACE=/github/workspace \
134+
-e PYTHON_VERSION="${PYTHON_VERSION}" \
135+
--workdir=/github/workspace/ \
136+
${img} \
137+
/bin/bash -ex -c ' \
138+
echo GITHUB_WORKSPACE=${GITHUB_WORKSPACE} >> /etc/environment \
139+
&& echo PGHOST=$(ip route | grep default | cut -f3 -d" " | uniq) \
140+
>> /etc/environment \
141+
&& echo PGPORT=5433 >> /etc/environment \
142+
&& echo PGUSER=postgres >> /etc/environment \
143+
&& echo ENVIRON_FILE /etc/environment >> /etc/login.defs \
144+
&& useradd -m -s /bin/bash test \
145+
&& su -l test /github/workspace/.github/workflows/test-wheels.sh \
146+
'

asyncpg/_testbase/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -425,6 +425,7 @@ def setUp(self):
425425
test_func = getattr(self, self._testMethodName).__func__
426426
opts = getattr(test_func, '__connect_options__', {})
427427
self.con = self.loop.run_until_complete(self.connect(**opts))
428+
self.con._protocol._test = str(self.id())
428429
self.server_version = self.con.get_server_version()
429430

430431
def tearDown(self):

asyncpg/protocol/coreproto.pxd

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,8 @@ cdef class CoreProtocol:
153153

154154
cdef _push_result(self)
155155
cdef _reset_result(self)
156+
cdef _get_result(self)
157+
cdef _restore_result(self, tuple result)
156158
cdef _set_state(self, ProtocolState new_state)
157159

158160
cdef _ensure_connected(self)

asyncpg/protocol/coreproto.pyx

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -724,6 +724,26 @@ cdef class CoreProtocol:
724724
self._execute_portal_name = None
725725
self._execute_stmt_name = None
726726

727+
cdef _get_result(self):
728+
return (
729+
self.result_type,
730+
self.result,
731+
self.result_param_desc,
732+
self.result_row_desc,
733+
self.result_status_msg,
734+
self.result_execute_completed,
735+
)
736+
737+
cdef _restore_result(self, tuple result):
738+
(
739+
self.result_type,
740+
self.result,
741+
self.result_param_desc,
742+
self.result_row_desc,
743+
self.result_status_msg,
744+
self.result_execute_completed,
745+
) = result
746+
727747
cdef _set_state(self, ProtocolState new_state):
728748
if new_state == PROTOCOL_IDLE:
729749
if self.state == PROTOCOL_FAILED:

asyncpg/protocol/protocol.pyx

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,9 @@ cdef class BaseProtocol(CoreProtocol):
102102
self.completed_callback = self._on_waiter_completed
103103

104104
self.queries_count = 0
105+
self.pending_results = collections.deque()
106+
107+
self._test = 'N/A'
105108

106109
try:
107110
self.create_future = loop.create_future
@@ -360,6 +363,7 @@ cdef class BaseProtocol(CoreProtocol):
360363

361364
with timer:
362365
buffer, done, status_msg = await waiter
366+
print(f'{self._test} copy_out() got result {len(buffer)} {done} {status_msg}')
363367

364368
# buffer will be empty if CopyDone was received apart from
365369
# the last CopyData message.
@@ -585,6 +589,7 @@ cdef class BaseProtocol(CoreProtocol):
585589
# a ConnectionResetError will be thrown into the task.
586590
pass
587591
finally:
592+
print(f'{self._test} close() waiter=None')
588593
self.waiter = None
589594
self.transport.abort()
590595

@@ -643,6 +648,7 @@ cdef class BaseProtocol(CoreProtocol):
643648
if cause is not None:
644649
exc.__cause__ = cause
645650
self.waiter.set_exception(exc)
651+
print(f'{self._test} connection_lost() waiter=None')
646652
self.waiter = None
647653

648654
cdef _set_server_parameter(self, name, val):
@@ -705,6 +711,8 @@ cdef class BaseProtocol(CoreProtocol):
705711
raise apg_exc.InternalClientError(
706712
'waiter is not done while handling critical '
707713
'protocol error')
714+
715+
print(f'{self._test} coreproto_error() waiter=None')
708716
self.waiter = None
709717
finally:
710718
self.abort()
@@ -713,12 +721,15 @@ cdef class BaseProtocol(CoreProtocol):
713721
if self.waiter is not None:
714722
raise apg_exc.InterfaceError(
715723
'cannot perform operation: another operation is in progress')
716-
self.waiter = self.create_future()
724+
self.waiter = waiter = self.create_future()
717725
if timeout is not None:
718726
self.timeout_handle = self.loop.call_later(
719727
timeout, self.timeout_callback, self.waiter)
720728
self.waiter.add_done_callback(self.completed_callback)
721-
return self.waiter
729+
if self.pending_results:
730+
self._restore_result(self.pending_results.popleft())
731+
self._on_result()
732+
return waiter
722733

723734
cdef _on_result__connect(self, object waiter):
724735
waiter.set_result(True)
@@ -780,6 +791,11 @@ cdef class BaseProtocol(CoreProtocol):
780791

781792
cdef _dispatch_result(self):
782793
waiter = self.waiter
794+
795+
if waiter is None:
796+
self.pending_results.append(self._get_result())
797+
return
798+
783799
self.waiter = None
784800

785801
if PG_DEBUG:
@@ -859,6 +875,7 @@ cdef class BaseProtocol(CoreProtocol):
859875
self.cancel_waiter.set_result(None)
860876
self.cancel_waiter = None
861877
if self.waiter is not None and self.waiter.done():
878+
print(f'{self._test} on_result() with cancel_waiter waiter=None')
862879
self.waiter = None
863880
if self.waiter is None:
864881
return
@@ -889,6 +906,7 @@ cdef class BaseProtocol(CoreProtocol):
889906
self.waiter.set_result(None)
890907
else:
891908
self.waiter.set_exception(exc)
909+
print(f'{self._test} on_connection_lost() closing waiter=None')
892910
self.waiter = None
893911
else:
894912
# The connection was lost because it was
@@ -911,6 +929,7 @@ cdef class BaseProtocol(CoreProtocol):
911929
# asyncio callbacks:
912930

913931
def data_received(self, data):
932+
print(f'{self._test} data received', len(data))
914933
self.buffer.feed_data(data)
915934
self._read_server_messages()
916935

tests/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,6 @@ def suite():
1818

1919

2020
if __name__ == '__main__':
21-
runner = unittest.runner.TextTestRunner()
21+
runner = unittest.runner.TextTestRunner(verbosity=2)
2222
result = runner.run(suite())
2323
sys.exit(not result.wasSuccessful())

0 commit comments

Comments
 (0)