Add experimental support for PyPy. (#9123)

* Adds proper dependencies.
* Minor fixes in database layer.
This commit is contained in:
Jonathan de Jong 2021-02-04 14:29:47 +01:00 committed by GitHub
parent b0f4119b8b
commit 2814028ce5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 15 additions and 8 deletions

1
changelog.d/9123.misc Normal file
View File

@ -0,0 +1 @@
Add experimental support for running Synapse with PyPy.

View File

@ -86,8 +86,12 @@ REQUIREMENTS = [
CONDITIONAL_REQUIREMENTS = { CONDITIONAL_REQUIREMENTS = {
"matrix-synapse-ldap3": ["matrix-synapse-ldap3>=0.1"], "matrix-synapse-ldap3": ["matrix-synapse-ldap3>=0.1"],
"postgres": [
# we use execute_values with the fetch param, which arrived in psycopg 2.8. # we use execute_values with the fetch param, which arrived in psycopg 2.8.
"postgres": ["psycopg2>=2.8"], "psycopg2>=2.8 ; platform_python_implementation != 'PyPy'",
"psycopg2cffi>=2.8 ; platform_python_implementation == 'PyPy'",
"psycopg2cffi-compat==1.1 ; platform_python_implementation == 'PyPy'",
],
# ACME support is required to provision TLS certificates from authorities # ACME support is required to provision TLS certificates from authorities
# that use the protocol, such as Let's Encrypt. # that use the protocol, such as Let's Encrypt.
"acme": [ "acme": [

View File

@ -12,7 +12,6 @@
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and # See the License for the specific language governing permissions and
# limitations under the License. # limitations under the License.
import platform
from ._base import BaseDatabaseEngine, IncorrectDatabaseSetup from ._base import BaseDatabaseEngine, IncorrectDatabaseSetup
from .postgres import PostgresEngine from .postgres import PostgresEngine
@ -28,10 +27,7 @@ def create_engine(database_config) -> BaseDatabaseEngine:
return Sqlite3Engine(sqlite3, database_config) return Sqlite3Engine(sqlite3, database_config)
if name == "psycopg2": if name == "psycopg2":
# pypy requires psycopg2cffi rather than psycopg2 # Note that psycopg2cffi-compat provides the psycopg2 module on pypy.
if platform.python_implementation() == "PyPy":
import psycopg2cffi as psycopg2 # type: ignore
else:
import psycopg2 # type: ignore import psycopg2 # type: ignore
return PostgresEngine(psycopg2, database_config) return PostgresEngine(psycopg2, database_config)

View File

@ -12,6 +12,7 @@
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and # See the License for the specific language governing permissions and
# limitations under the License. # limitations under the License.
import platform
import struct import struct
import threading import threading
import typing import typing
@ -30,6 +31,11 @@ class Sqlite3Engine(BaseDatabaseEngine["sqlite3.Connection"]):
database = database_config.get("args", {}).get("database") database = database_config.get("args", {}).get("database")
self._is_in_memory = database in (None, ":memory:",) self._is_in_memory = database in (None, ":memory:",)
if platform.python_implementation() == "PyPy":
# pypy's sqlite3 module doesn't handle bytearrays, convert them
# back to bytes.
database_module.register_adapter(bytearray, lambda array: bytes(array))
# The current max state_group, or None if we haven't looked # The current max state_group, or None if we haven't looked
# in the DB yet. # in the DB yet.
self._current_state_group_id = None self._current_state_group_id = None