Skip to content

Commit adf1028

Browse files
committed
Make self.server_name available for synapse/storage/database.py
1 parent 99b862e commit adf1028

9 files changed

Lines changed: 145 additions & 31 deletions

File tree

synapse/_scripts/review_recent_signups.py

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,19 +29,21 @@
2929

3030
from synapse.config._base import (
3131
Config,
32+
ConfigError,
3233
RootConfig,
3334
find_config_files,
3435
read_config_files,
3536
)
3637
from synapse.config.database import DatabaseConfig
38+
from synapse.config.server import ServerConfig
3739
from synapse.storage.database import DatabasePool, LoggingTransaction, make_conn
3840
from synapse.storage.engines import create_engine
3941

4042

4143
class ReviewConfig(RootConfig):
42-
"A config class that just pulls out the database config"
44+
"A config class that just pulls out the server and database config"
4345

44-
config_classes = [DatabaseConfig]
46+
config_classes = [ServerConfig, DatabaseConfig]
4547

4648

4749
@attr.s(auto_attribs=True)
@@ -148,6 +150,10 @@ def main() -> None:
148150
config_dict = read_config_files(config_files)
149151
config.parse_config_dict(config_dict, "", "")
150152

153+
server_name = config.server.server_name
154+
if not isinstance(server_name, str):
155+
raise ConfigError("Must be a string", ("server_name",))
156+
151157
since_ms = time.time() * 1000 - Config.parse_duration(config_args.since)
152158
exclude_users_with_email = config_args.exclude_emails
153159
exclude_users_with_appservice = config_args.exclude_app_service
@@ -159,7 +165,12 @@ def main() -> None:
159165

160166
engine = create_engine(database_config.config)
161167

162-
with make_conn(database_config, engine, "review_recent_signups") as db_conn:
168+
with make_conn(
169+
db_config=database_config,
170+
engine=engine,
171+
default_txn_name="review_recent_signups",
172+
server_name=server_name,
173+
) as db_conn:
163174
# This generates a type of Cursor, not LoggingTransaction.
164175
user_infos = get_recent_users(
165176
db_conn.cursor(),

synapse/_scripts/synapse_port_db.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -672,8 +672,14 @@ def build_db_store(
672672
engine = create_engine(db_config.config)
673673

674674
hs = MockHomeserver(self.hs_config)
675-
676-
with make_conn(db_config, engine, "portdb") as db_conn:
675+
server_name = hs.hostname
676+
677+
with make_conn(
678+
db_config=db_config,
679+
engine=engine,
680+
default_txn_name="portdb",
681+
server_name=server_name,
682+
) as db_conn:
677683
engine.check_database(
678684
db_conn, allow_outdated_version=allow_outdated_version
679685
)

synapse/storage/database.py

Lines changed: 34 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -122,9 +122,11 @@ def reconnect(self) -> None: ...
122122

123123

124124
def make_pool(
125+
*,
125126
reactor: IReactorCore,
126127
db_config: DatabaseConnectionConfig,
127128
engine: BaseDatabaseEngine,
129+
server_name: str,
128130
) -> adbapi.ConnectionPool:
129131
"""Get the connection pool for the database."""
130132

@@ -138,7 +140,12 @@ def _on_new_connection(conn: Connection) -> None:
138140
# etc.
139141
with LoggingContext("db.on_new_connection"):
140142
engine.on_new_connection(
141-
LoggingDatabaseConnection(conn, engine, "on_new_connection")
143+
LoggingDatabaseConnection(
144+
conn=conn,
145+
engine=engine,
146+
default_txn_name="on_new_connection",
147+
server_name=server_name,
148+
)
142149
)
143150

144151
connection_pool = adbapi.ConnectionPool(
@@ -154,9 +161,11 @@ def _on_new_connection(conn: Connection) -> None:
154161

155162

156163
def make_conn(
164+
*,
157165
db_config: DatabaseConnectionConfig,
158166
engine: BaseDatabaseEngine,
159167
default_txn_name: str,
168+
server_name: str,
160169
) -> "LoggingDatabaseConnection":
161170
"""Make a new connection to the database and return it.
162171
@@ -170,13 +179,18 @@ def make_conn(
170179
if not k.startswith("cp_")
171180
}
172181
native_db_conn = engine.module.connect(**db_params)
173-
db_conn = LoggingDatabaseConnection(native_db_conn, engine, default_txn_name)
182+
db_conn = LoggingDatabaseConnection(
183+
conn=native_db_conn,
184+
engine=engine,
185+
default_txn_name=default_txn_name,
186+
server_name=server_name,
187+
)
174188

175189
engine.on_new_connection(db_conn)
176190
return db_conn
177191

178192

179-
@attr.s(slots=True, auto_attribs=True)
193+
@attr.s(slots=True, auto_attribs=True, kw_only=True)
180194
class LoggingDatabaseConnection:
181195
"""A wrapper around a database connection that returns `LoggingTransaction`
182196
as its cursor class.
@@ -187,6 +201,7 @@ class LoggingDatabaseConnection:
187201
conn: Connection
188202
engine: BaseDatabaseEngine
189203
default_txn_name: str
204+
server_name: str
190205

191206
def cursor(
192207
self,
@@ -200,8 +215,9 @@ def cursor(
200215
txn_name = self.default_txn_name
201216

202217
return LoggingTransaction(
203-
self.conn.cursor(),
218+
txn=self.conn.cursor(),
204219
name=txn_name,
220+
server_name=self.server_name,
205221
database_engine=self.engine,
206222
after_callbacks=after_callbacks,
207223
async_after_callbacks=async_after_callbacks,
@@ -270,6 +286,7 @@ class LoggingTransaction:
270286
__slots__ = [
271287
"txn",
272288
"name",
289+
"server_name",
273290
"database_engine",
274291
"after_callbacks",
275292
"async_after_callbacks",
@@ -278,15 +295,18 @@ class LoggingTransaction:
278295

279296
def __init__(
280297
self,
298+
*,
281299
txn: Cursor,
282300
name: str,
301+
server_name: str,
283302
database_engine: BaseDatabaseEngine,
284303
after_callbacks: Optional[List[_CallbackListEntry]] = None,
285304
async_after_callbacks: Optional[List[_AsyncCallbackListEntry]] = None,
286305
exception_callbacks: Optional[List[_CallbackListEntry]] = None,
287306
):
288307
self.txn = txn
289308
self.name = name
309+
self.server_name = server_name
290310
self.database_engine = database_engine
291311
self.after_callbacks = after_callbacks
292312
self.async_after_callbacks = async_after_callbacks
@@ -571,7 +591,12 @@ def __init__(
571591
self._clock = hs.get_clock()
572592
self._txn_limit = database_config.config.get("txn_limit", 0)
573593
self._database_config = database_config
574-
self._db_pool = make_pool(hs.get_reactor(), database_config, engine)
594+
self._db_pool = make_pool(
595+
reactor=hs.get_reactor(),
596+
db_config=database_config,
597+
engine=engine,
598+
server_name=self.server_name,
599+
)
575600

576601
self.updates = BackgroundUpdater(hs, self)
577602
LaterGauge(
@@ -1047,7 +1072,10 @@ def inner_func(conn: _PoolConnection, *args: P.args, **kwargs: P.kwargs) -> R:
10471072
)
10481073

10491074
db_conn = LoggingDatabaseConnection(
1050-
conn, self.engine, "runWithConnection"
1075+
conn=conn,
1076+
engine=self.engine,
1077+
default_txn_name="runWithConnection",
1078+
server_name=self.server_name,
10511079
)
10521080
return func(db_conn, *args, **kwargs)
10531081
finally:

synapse/storage/databases/__init__.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,11 +69,18 @@ def __init__(self, main_store_class: Type[DataStoreT], hs: "HomeServer"):
6969
state_deletion: Optional[StateDeletionDataStore] = None
7070
persist_events: Optional[PersistEventsStore] = None
7171

72+
server_name = hs.hostname
73+
7274
for database_config in hs.config.database.databases:
7375
db_name = database_config.name
7476
engine = create_engine(database_config.config)
7577

76-
with make_conn(database_config, engine, "startup") as db_conn:
78+
with make_conn(
79+
db_config=database_config,
80+
engine=engine,
81+
default_txn_name="startup",
82+
server_name=server_name,
83+
) as db_conn:
7784
logger.info("[database config %r]: Checking database server", db_name)
7885
engine.check_database(db_conn)
7986

tests/server.py

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@
9797
load_legacy_third_party_event_rules,
9898
)
9999
from synapse.server import HomeServer
100+
from synapse.server_notices.consent_server_notices import ConfigError
100101
from synapse.storage import DataStore
101102
from synapse.storage.database import LoggingDatabaseConnection, make_pool
102103
from synapse.storage.engines import BaseDatabaseEngine, create_engine
@@ -710,7 +711,9 @@ def make_fake_db_pool(
710711
is a drop-in replacement for the normal `make_pool` which builds such a connection
711712
pool.
712713
"""
713-
pool = make_pool(reactor, db_config, engine)
714+
pool = make_pool(
715+
reactor=reactor, db_config=db_config, engine=engine, server_name="test_server"
716+
)
714717

715718
def runWithConnection(
716719
func: Callable[..., R], *args: Any, **kwargs: Any
@@ -1084,12 +1087,19 @@ def setup_test_homeserver(
10841087
"args": {"database": test_db_location, "cp_min": 1, "cp_max": 1},
10851088
}
10861089

1090+
server_name = config.server.server_name
1091+
if not isinstance(server_name, str):
1092+
raise ConfigError("Must be a string", ("server_name",))
1093+
10871094
# Check if we have set up a DB that we can use as a template.
10881095
global PREPPED_SQLITE_DB_CONN
10891096
if PREPPED_SQLITE_DB_CONN is None:
10901097
temp_engine = create_engine(database_config)
10911098
PREPPED_SQLITE_DB_CONN = LoggingDatabaseConnection(
1092-
sqlite3.connect(":memory:"), temp_engine, "PREPPED_CONN"
1099+
conn=sqlite3.connect(":memory:"),
1100+
engine=temp_engine,
1101+
default_txn_name="PREPPED_CONN",
1102+
server_name=server_name,
10931103
)
10941104

10951105
database = DatabaseConnectionConfig("master", database_config)

tests/storage/test_appservice.py

Lines changed: 37 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -63,9 +63,15 @@ def setUp(self) -> None:
6363
self._add_appservice("token3", "as3", "some_url", "some_hs_token", "bob")
6464
# must be done after inserts
6565
database = self.hs.get_datastores().databases[0]
66+
self.server_name = self.hs.hostname
6667
self.store = ApplicationServiceStore(
6768
database,
68-
make_conn(database._database_config, database.engine, "test"),
69+
make_conn(
70+
db_config=database._database_config,
71+
engine=database.engine,
72+
default_txn_name="test",
73+
server_name=self.server_name,
74+
),
6975
self.hs,
7076
)
7177

@@ -138,9 +144,17 @@ def setUp(self) -> None:
138144
self.db_pool = database._db_pool
139145
self.engine = database.engine
140146

147+
server_name = self.hs.hostname
141148
db_config = self.hs.config.database.get_single_database()
142149
self.store = TestTransactionStore(
143-
database, make_conn(db_config, self.engine, "test"), self.hs
150+
database,
151+
make_conn(
152+
db_config=db_config,
153+
engine=self.engine,
154+
default_txn_name="test",
155+
server_name=server_name,
156+
),
157+
self.hs,
144158
)
145159

146160
def _add_service(self, url: str, as_token: str, id: str) -> None:
@@ -488,10 +502,16 @@ def test_unique_works(self) -> None:
488502
self.hs.config.appservice.app_service_config_files = [f1, f2]
489503
self.hs.config.caches.event_cache_size = 1
490504

505+
server_name = self.hs.hostname
491506
database = self.hs.get_datastores().databases[0]
492507
ApplicationServiceStore(
493508
database,
494-
make_conn(database._database_config, database.engine, "test"),
509+
make_conn(
510+
db_config=database._database_config,
511+
engine=database.engine,
512+
default_txn_name="test",
513+
server_name=server_name,
514+
),
495515
self.hs,
496516
)
497517

@@ -503,10 +523,16 @@ def test_duplicate_ids(self) -> None:
503523
self.hs.config.caches.event_cache_size = 1
504524

505525
with self.assertRaises(ConfigError) as cm:
526+
server_name = self.hs.hostname
506527
database = self.hs.get_datastores().databases[0]
507528
ApplicationServiceStore(
508529
database,
509-
make_conn(database._database_config, database.engine, "test"),
530+
make_conn(
531+
db_config=database._database_config,
532+
engine=database.engine,
533+
default_txn_name="test",
534+
server_name=server_name,
535+
),
510536
self.hs,
511537
)
512538

@@ -523,10 +549,16 @@ def test_duplicate_as_tokens(self) -> None:
523549
self.hs.config.caches.event_cache_size = 1
524550

525551
with self.assertRaises(ConfigError) as cm:
552+
server_name = self.hs.hostname
526553
database = self.hs.get_datastores().databases[0]
527554
ApplicationServiceStore(
528555
database,
529-
make_conn(database._database_config, database.engine, "test"),
556+
make_conn(
557+
db_config=database._database_config,
558+
engine=database.engine,
559+
default_txn_name="test",
560+
server_name=server_name,
561+
),
530562
self.hs,
531563
)
532564

tests/storage/test_rollback_worker.py

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -69,9 +69,10 @@ def test_rolling_back(self) -> None:
6969

7070
db_pool = self.hs.get_datastores().main.db_pool
7171
db_conn = LoggingDatabaseConnection(
72-
db_pool._db_pool.connect(),
73-
db_pool.engine,
74-
"tests",
72+
conn=db_pool._db_pool.connect(),
73+
engine=db_pool.engine,
74+
default_txn_name="tests",
75+
server_name="test_server",
7576
)
7677

7778
cur = db_conn.cursor()
@@ -85,9 +86,10 @@ def test_not_upgraded_old_schema_version(self) -> None:
8586
"""Test that workers don't start if the DB has an older schema version"""
8687
db_pool = self.hs.get_datastores().main.db_pool
8788
db_conn = LoggingDatabaseConnection(
88-
db_pool._db_pool.connect(),
89-
db_pool.engine,
90-
"tests",
89+
conn=db_pool._db_pool.connect(),
90+
engine=db_pool.engine,
91+
default_txn_name="tests",
92+
server_name="test_server",
9193
)
9294

9395
cur = db_conn.cursor()
@@ -105,9 +107,10 @@ def test_not_upgraded_current_schema_version_with_outstanding_deltas(self) -> No
105107
"""
106108
db_pool = self.hs.get_datastores().main.db_pool
107109
db_conn = LoggingDatabaseConnection(
108-
db_pool._db_pool.connect(),
109-
db_pool.engine,
110-
"tests",
110+
conn=db_pool._db_pool.connect(),
111+
engine=db_pool.engine,
112+
default_txn_name="tests",
113+
server_name="test_server",
111114
)
112115

113116
# Set the schema version of the database to the current version

0 commit comments

Comments
 (0)