Skip to content
This repository has been archived by the owner on Apr 26, 2024. It is now read-only.

Add in preliminary PyPy support #9123

Merged
merged 16 commits into from
Feb 4, 2021
Merged
1 change: 1 addition & 0 deletions changelog.d/9123.misc
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Add in preliminary PyPy support.
ShadowJonathan marked this conversation as resolved.
Show resolved Hide resolved
8 changes: 6 additions & 2 deletions synapse/python_dependencies.py
Original file line number Diff line number Diff line change
Expand Up @@ -86,8 +86,12 @@

CONDITIONAL_REQUIREMENTS = {
"matrix-synapse-ldap3": ["matrix-synapse-ldap3>=0.1"],
# we use execute_values with the fetch param, which arrived in psycopg 2.8.
"postgres": ["psycopg2>=2.8"],
"postgres": [
# we use execute_values with the fetch param, which arrived in psycopg 2.8.
"psycopg2>=2.8 ; platform_python_implementation != 'PyPy'",
"psycopg2cffi>=2.8 ; platform_python_implementation == 'PyPy'",
clokep marked this conversation as resolved.
Show resolved Hide resolved
"psycopg2cffi-compat==1.1 ; platform_python_implementation == 'PyPy'",
],
# ACME support is required to provision TLS certificates from authorities
# that use the protocol, such as Let's Encrypt.
"acme": [
Expand Down
8 changes: 2 additions & 6 deletions synapse/storage/engines/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import platform

from ._base import BaseDatabaseEngine, IncorrectDatabaseSetup
from .postgres import PostgresEngine
Expand All @@ -28,11 +27,8 @@ def create_engine(database_config) -> BaseDatabaseEngine:
return Sqlite3Engine(sqlite3, database_config)

if name == "psycopg2":
# pypy requires psycopg2cffi rather than psycopg2
if platform.python_implementation() == "PyPy":
import psycopg2cffi as psycopg2 # type: ignore
else:
import psycopg2 # type: ignore
# note: pypy is still supported by using psycopg2cffi-compat to monkey-patch imports to psycopg2
ShadowJonathan marked this conversation as resolved.
Show resolved Hide resolved
import psycopg2 # type: ignore

return PostgresEngine(psycopg2, database_config)

Expand Down
6 changes: 6 additions & 0 deletions synapse/storage/engines/sqlite.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import platform
import struct
import threading
import typing
Expand All @@ -30,6 +31,11 @@ def __init__(self, database_module, database_config):
database = database_config.get("args", {}).get("database")
self._is_in_memory = database in (None, ":memory:",)

if platform.python_implementation() == "PyPy":
# related to #6186, pypy's sqlite3 module doesn't like bytearrays,
# so here we're converting them back
ShadowJonathan marked this conversation as resolved.
Show resolved Hide resolved
database_module.register_adapter(bytearray, lambda array: bytes(array))
clokep marked this conversation as resolved.
Show resolved Hide resolved

# The current max state_group, or None if we haven't looked
# in the DB yet.
self._current_state_group_id = None
Expand Down
2 changes: 1 addition & 1 deletion tests/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,4 +21,4 @@
# attempt to do the patch before we load any synapse code
do_patch()

util.DEFAULT_TIMEOUT_DURATION = 20
util.DEFAULT_TIMEOUT_DURATION = 60.0
ShadowJonathan marked this conversation as resolved.
Show resolved Hide resolved
4 changes: 3 additions & 1 deletion tests/unittest.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
import hmac
import inspect
import logging
import platform
import time
from typing import Callable, Dict, Iterable, Optional, Tuple, Type, TypeVar, Union

Expand Down Expand Up @@ -126,7 +127,8 @@ def tearDown(orig):
ret = orig()
# force a GC to workaround problems with deferreds leaking logcontexts when
# they are GCed (see the logcontext docs)
gc.collect()
if platform.python_implementation() != "PyPy":
gc.collect()
ShadowJonathan marked this conversation as resolved.
Show resolved Hide resolved
set_current_context(SENTINEL_CONTEXT)

return ret
Expand Down