From d927ef08c1abe129dea95d930327af97e3b803ec Mon Sep 17 00:00:00 2001 From: Fantix King Date: Wed, 5 Feb 2025 19:46:19 -0500 Subject: [PATCH] Fix default_transaction_isolation on system/database level --- edb/edgeql/compiler/config.py | 19 ++++++++++++++++++- edb/server/bootstrap.py | 6 ++++++ edb/server/pgcluster.py | 8 +++++--- 3 files changed, 29 insertions(+), 4 deletions(-) diff --git a/edb/edgeql/compiler/config.py b/edb/edgeql/compiler/config.py index bbaf7ed24a6..ea54b210554 100644 --- a/edb/edgeql/compiler/config.py +++ b/edb/edgeql/compiler/config.py @@ -146,7 +146,24 @@ def compile_ConfigReset( span=expr.span, ) - elif isinstance(info.param_type, s_objtypes.ObjectType): + if ( + expr.scope == qltypes.ConfigScope.INSTANCE and + info.backend_setting == 'default_transaction_isolation' + ): + # Special case for default_transaction_isolation: + # Gel default is `serializable`, while PG default is `read committed`. + default = info.ptr.get_default(ctx.env.schema) + if default is not None: + return compile_ConfigSet( + qlast.ConfigSet( + name=expr.name, + scope=expr.scope, + expr=default.parse(), + ), + ctx=ctx, + ) + + if isinstance(info.param_type, s_objtypes.ObjectType): param_type_name = info.param_type.get_name(ctx.env.schema) param_type_ref = qlast.ObjectRef( name=param_type_name.name, diff --git a/edb/server/bootstrap.py b/edb/server/bootstrap.py index d580ac36239..ab4c6b88402 100644 --- a/edb/server/bootstrap.py +++ b/edb/server/bootstrap.py @@ -1974,6 +1974,7 @@ async def _configure( await _execute_block(ctx.conn, block) backend_params = ctx.cluster.get_runtime_params() + need_reload = False for setname in config_spec: setting = config_spec[setname] if ( @@ -1984,9 +1985,12 @@ async def _configure( # backends that don't support it. # TODO: this should be replaced by instance-wide # emulation at backend connection time. + # fantix: +1 to the above, also needed by + # `default_transaction_isolation=serializable` backend_params.has_configfile_access ) ): + need_reload = True script = qlcodegen.generate_source( qlast.ConfigSet( name=qlast.ObjectRef(name=setting.name), @@ -1996,6 +2000,8 @@ async def _configure( ) schema, sql = compile_bootstrap_script(compiler, schema, script) await _execute(ctx.conn, sql) + if need_reload: + await _execute(ctx.conn, 'SELECT pg_reload_conf()') def compile_sys_queries( diff --git a/edb/server/pgcluster.py b/edb/server/pgcluster.py index b745173ec9e..4ec9a6de4b3 100644 --- a/edb/server/pgcluster.py +++ b/edb/server/pgcluster.py @@ -87,7 +87,6 @@ 'timezone': 'UTC', 'intervalstyle': 'iso_8601', 'jit': 'off', - 'default_transaction_isolation': 'serializable', } @@ -497,6 +496,7 @@ async def ensure_initialized(self, **settings: Any) -> bool: have_c_utf8 = self.get_runtime_params().has_c_utf8_locale await self.init( + "default_transaction_isolation='serializable'", username='postgres', locale='C.UTF-8' if have_c_utf8 else 'en_US.UTF-8', lc_collate='C', @@ -513,16 +513,18 @@ async def ensure_initialized(self, **settings: Any) -> bool: else: return False - async def init(self, **settings: str) -> None: + async def init(self, *server_config: str, **settings: str) -> None: """Initialize cluster.""" if await self.get_status() != 'not-initialized': raise ClusterError( 'cluster in {!r} has already been initialized'.format( self._data_dir)) - if settings: + if settings or server_config: settings_args = ['--{}={}'.format(k.replace('_', '-'), v) for k, v in settings.items()] + for conf in server_config: + settings_args.append('-c {}'.format(conf)) extra_args = ['-o'] + [' '.join(settings_args)] else: extra_args = []