From 0f2e4d484615368cb4f9450cc9548cc609ad7c38 Mon Sep 17 00:00:00 2001 From: Karen Chen <64801825+karenc-bq@users.noreply.github.com> Date: Tue, 10 Mar 2026 22:57:59 -0700 Subject: [PATCH 1/3] feat: gdb rw splitting plugin --- common/lib/connection_plugin_chain_builder.ts | 3 + .../abstract_read_write_splitting_plugin.ts | 7 +- ...gdb_read_write_splitting_plugin_factory.ts | 37 +++++++ .../gdb_read_writer_splitting_plugin.ts | 102 ++++++++++++++++++ .../read_write_splitting_plugin.ts | 12 +-- .../read_write_splitting_plugin_factory.ts | 6 +- common/lib/utils/errors.ts | 2 + common/lib/utils/messages.ts | 9 +- common/lib/wrapper_property.ts | 18 ++++ 9 files changed, 184 insertions(+), 12 deletions(-) create mode 100644 common/lib/plugins/read_write_splitting/gdb_read_write_splitting_plugin_factory.ts create mode 100644 common/lib/plugins/read_write_splitting/gdb_read_writer_splitting_plugin.ts diff --git a/common/lib/connection_plugin_chain_builder.ts b/common/lib/connection_plugin_chain_builder.ts index 1cad14c7..38ec0a4f 100644 --- a/common/lib/connection_plugin_chain_builder.ts +++ b/common/lib/connection_plugin_chain_builder.ts @@ -45,6 +45,7 @@ import { HostMonitoring2PluginFactory } from "./plugins/efm2/host_monitoring2_pl import { BlueGreenPluginFactory } from "./plugins/bluegreen/blue_green_plugin_factory"; import { GlobalDbFailoverPluginFactory } from "./plugins/gdb_failover/global_db_failover_plugin_factory"; import { FullServicesContainer } from "./utils/full_services_container"; +import { GdbReadWriteSplittingPluginFactory } from "./plugins/read_write_splitting/gdb_read_write_splitting_plugin_factory"; /* Type alias used for plugin factory sorting. It holds a reference to a plugin @@ -65,6 +66,7 @@ export class ConnectionPluginChainBuilder { ["staleDns", { factory: StaleDnsPluginFactory, weight: 500 }], ["bg", { factory: BlueGreenPluginFactory, weight: 550 }], ["readWriteSplitting", { factory: ReadWriteSplittingPluginFactory, weight: 600 }], + ["gdbReadWriteSplitting", { factory: GdbReadWriteSplittingPluginFactory, weight: 610 }], ["failover", { factory: FailoverPluginFactory, weight: 700 }], ["failover2", { factory: Failover2PluginFactory, weight: 710 }], ["gdbFailover", { factory: GlobalDbFailoverPluginFactory, weight: 720 }], @@ -87,6 +89,7 @@ export class ConnectionPluginChainBuilder { [StaleDnsPluginFactory, 500], [BlueGreenPluginFactory, 550], [ReadWriteSplittingPluginFactory, 600], + [GdbReadWriteSplittingPluginFactory, 610], [FailoverPluginFactory, 700], [Failover2PluginFactory, 710], [GlobalDbFailoverPluginFactory, 720], diff --git a/common/lib/plugins/read_write_splitting/abstract_read_write_splitting_plugin.ts b/common/lib/plugins/read_write_splitting/abstract_read_write_splitting_plugin.ts index 65482211..ede96c54 100644 --- a/common/lib/plugins/read_write_splitting/abstract_read_write_splitting_plugin.ts +++ b/common/lib/plugins/read_write_splitting/abstract_read_write_splitting_plugin.ts @@ -30,11 +30,13 @@ import { FailoverError } from "../../utils/errors"; import { WrapperProperties } from "../../wrapper_property"; import { convertMsToNanos, getTimeInNanos, logAndThrowError } from "../../utils/utils"; import { CacheItem } from "../../utils/cache_map"; +import { FullServicesContainer } from "../../utils/full_services_container"; export abstract class AbstractReadWriteSplittingPlugin extends AbstractConnectionPlugin implements CanReleaseResources { private static readonly subscribedMethods: Set = new Set(["initHostProvider", "connect", "notifyConnectionChanged", "query"]); protected _hostListProviderService: HostListProviderService | undefined; + protected servicesContainer: FullServicesContainer; protected pluginService: PluginService; protected readonly _properties: Map; protected readerHostInfo?: HostInfo = undefined; @@ -48,9 +50,10 @@ export abstract class AbstractReadWriteSplittingPlugin extends AbstractConnectio private _inReadWriteSplit = false; - protected constructor(pluginService: PluginService, properties: Map) { + protected constructor(serviceContainer: FullServicesContainer, properties: Map) { super(); - this.pluginService = pluginService; + this.servicesContainer = serviceContainer; + this.pluginService = this.servicesContainer.getPluginService(); this._properties = properties; this.readerSelectorStrategy = WrapperProperties.READER_HOST_SELECTOR_STRATEGY.get(properties); } diff --git a/common/lib/plugins/read_write_splitting/gdb_read_write_splitting_plugin_factory.ts b/common/lib/plugins/read_write_splitting/gdb_read_write_splitting_plugin_factory.ts new file mode 100644 index 00000000..a34de01e --- /dev/null +++ b/common/lib/plugins/read_write_splitting/gdb_read_write_splitting_plugin_factory.ts @@ -0,0 +1,37 @@ +/* + Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + + Licensed under the Apache License, Version 2.0 (the "License"). + You may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + 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 { ConnectionPluginFactory } from "../../plugin_factory"; +import { PluginService } from "../../plugin_service"; +import { ConnectionPlugin } from "../../connection_plugin"; +import { AwsWrapperError } from "../../utils/errors"; +import { Messages } from "../../utils/messages"; +import { FullServicesContainer } from "../../utils/full_services_container"; + +export class GdbReadWriteSplittingPluginFactory extends ConnectionPluginFactory { + private static gdbReadWriteSplittingPlugin: any; + + async getInstance(servicesContainer: FullServicesContainer, properties: Map): Promise { + try { + if (!GdbReadWriteSplittingPluginFactory.gdbReadWriteSplittingPlugin) { + GdbReadWriteSplittingPluginFactory.gdbReadWriteSplittingPlugin = await import("./gdb_read_writer_splitting_plugin"); + } + return new GdbReadWriteSplittingPluginFactory.gdbReadWriteSplittingPlugin.GdbReadWriteSplittingPlugin(servicesContainer, properties); + } catch (error: any) { + throw new AwsWrapperError(Messages.get("ConnectionPluginChainBuilder.errorImportingPlugin", error.message, "gdbReadWriteSplittingPlugin")); + } + } +} diff --git a/common/lib/plugins/read_write_splitting/gdb_read_writer_splitting_plugin.ts b/common/lib/plugins/read_write_splitting/gdb_read_writer_splitting_plugin.ts new file mode 100644 index 00000000..27e71f20 --- /dev/null +++ b/common/lib/plugins/read_write_splitting/gdb_read_writer_splitting_plugin.ts @@ -0,0 +1,102 @@ +/* + Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + + Licensed under the Apache License, Version 2.0 (the "License"). + You may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + 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 { ReadWriteSplittingPlugin } from "./read_write_splitting_plugin"; +import { PluginService } from "../../plugin_service"; +import { WrapperProperties } from "../../wrapper_property"; +import { HostInfo } from "../../host_info"; +import { RdsUtils } from "../../utils/rds_utils"; +import { ReadWriteSplittingError } from "../../utils/errors"; +import { Messages } from "../../utils/messages"; +import { logger } from "../../../logutils"; +import { ClientWrapper } from "../../client_wrapper"; +import { equalsIgnoreCase } from "../../utils/utils"; +import { FullServicesContainer } from "../../utils/full_services_container"; + +export class GdbReadWriteSplittingPlugin extends ReadWriteSplittingPlugin { + protected readonly rdsUtils: RdsUtils = new RdsUtils(); + + protected readonly restrictWriterToHomeRegion: boolean; + protected readonly restrictReaderToHomeRegion: boolean; + + protected isInitialized: boolean = false; + protected homeRegion: string; + + constructor(serviceContainer: FullServicesContainer, properties: Map) { + super(serviceContainer, properties); + this.restrictWriterToHomeRegion = WrapperProperties.GDB_RW_RESTRICT_WRITER_TO_HOME_REGION.get(properties); + this.restrictReaderToHomeRegion = WrapperProperties.GDB_RW_RESTRICT_READER_TO_HOME_REGION.get(properties); + } + + protected initSettings(initHostInfo: HostInfo, properties: Map): void { + if (this.isInitialized) { + return; + } + + this.isInitialized = true; + + this.homeRegion = WrapperProperties.GDB_RW_HOME_REGION.get(properties); + if (!this.homeRegion) { + const rdsUrlType = this.rdsUtils.identifyRdsType(initHostInfo.host); + if (rdsUrlType.hasRegion) { + this.homeRegion = this.rdsUtils.getRdsRegion(initHostInfo.host); + } + } + + if (!this.homeRegion) { + throw new ReadWriteSplittingError(Messages.get("GdbReadWriteSplittingPlugin.missingHomeRegion", initHostInfo.host)); + } + + logger.debug(Messages.get("GdbReadWriteSplittingPlugin.parameterValue", "gdbRwHomeRegion", this.homeRegion)); + } + + override async connect( + hostInfo: HostInfo, + props: Map, + isInitialConnection: boolean, + connectFunc: () => Promise + ): Promise { + this.initSettings(hostInfo, props); + return super.connect(hostInfo, props, isInitialConnection, connectFunc); + } + + override setWriterClient(writerTargetClient: ClientWrapper | undefined, writerHostInfo: HostInfo) { + if ( + this.restrictWriterToHomeRegion && + this.writerHostInfo != null && + !equalsIgnoreCase(this.rdsUtils.getRdsRegion(this.writerHostInfo.host), this.homeRegion) + ) { + throw new ReadWriteSplittingError( + Messages.get("GdbReadWriteSplittingPlugin.cantConnectWriterOutOfHomeRegion", writerHostInfo.host, this.homeRegion) + ); + } + super.setWriterClient(writerTargetClient, writerHostInfo); + } + + protected getReaderHostCandidates(): HostInfo[] { + if (this.restrictReaderToHomeRegion) { + const hostsInRegion: HostInfo[] = this.pluginService + .getHosts() + .filter((x) => equalsIgnoreCase(this.rdsUtils.getRdsRegion(x.host), this.homeRegion)); + + if (hostsInRegion.length === 0) { + throw new ReadWriteSplittingError(Messages.get("GdbReadWriteSplittingPlugin.noAvailableReadersInHomeRegion", this.homeRegion)); + } + return hostsInRegion; + } + return super.getReaderHostCandidates(); + } +} diff --git a/common/lib/plugins/read_write_splitting/read_write_splitting_plugin.ts b/common/lib/plugins/read_write_splitting/read_write_splitting_plugin.ts index c807f29a..fc7dc7d0 100644 --- a/common/lib/plugins/read_write_splitting/read_write_splitting_plugin.ts +++ b/common/lib/plugins/read_write_splitting/read_write_splitting_plugin.ts @@ -14,8 +14,7 @@ limitations under the License. */ -import { AbstractConnectionPlugin } from "../../abstract_connection_plugin"; -import { HostInfo, FailoverError, HostRole } from "../../index"; +import { HostInfo, HostRole } from "../../index"; import { PluginService } from "../../plugin_service"; import { HostListProviderService } from "../../host_list_provider_service"; import { Messages } from "../../utils/messages"; @@ -25,26 +24,27 @@ import { AbstractReadWriteSplittingPlugin } from "./abstract_read_write_splittin import { WrapperProperties } from "../../wrapper_property"; import { logger } from "../../../logutils"; import { CacheItem } from "../../utils/cache_map"; +import { FullServicesContainer } from "../../utils/full_services_container"; export class ReadWriteSplittingPlugin extends AbstractReadWriteSplittingPlugin { protected hosts: HostInfo[] = []; - constructor(pluginService: PluginService, properties: Map); + constructor(serviceContainer: FullServicesContainer, properties: Map); constructor( - pluginService: PluginService, + serviceContainer: FullServicesContainer, properties: Map, hostListProviderService: HostListProviderService, writerClient: ClientWrapper, readerClient: ClientWrapper ); constructor( - pluginService: PluginService, + serviceContainer: FullServicesContainer, properties: Map, hostListProviderService?: HostListProviderService, writerClient?: ClientWrapper, readerClient?: ClientWrapper ) { - super(pluginService, properties); + super(serviceContainer, properties); this._hostListProviderService = hostListProviderService; this.writerTargetClient = writerClient; this.readerCacheItem = new CacheItem(readerClient, BigInt(0)); diff --git a/common/lib/plugins/read_write_splitting/read_write_splitting_plugin_factory.ts b/common/lib/plugins/read_write_splitting/read_write_splitting_plugin_factory.ts index 19f60f6c..664a6e83 100644 --- a/common/lib/plugins/read_write_splitting/read_write_splitting_plugin_factory.ts +++ b/common/lib/plugins/read_write_splitting/read_write_splitting_plugin_factory.ts @@ -1,12 +1,12 @@ /* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - + Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance with the License. You may obtain a copy of the License at - + http://www.apache.org/licenses/LICENSE-2.0 - + Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. diff --git a/common/lib/utils/errors.ts b/common/lib/utils/errors.ts index 247bbba0..58e37aec 100644 --- a/common/lib/utils/errors.ts +++ b/common/lib/utils/errors.ts @@ -48,6 +48,8 @@ export class FailoverFailedError extends FailoverError {} export class TransactionResolutionUnknownError extends FailoverError {} +export class ReadWriteSplittingError extends AwsWrapperError {} + export class LoginError extends AwsWrapperError {} export class AwsTimeoutError extends AwsWrapperError {} diff --git a/common/lib/utils/messages.ts b/common/lib/utils/messages.ts index 875c9da0..571d7b21 100644 --- a/common/lib/utils/messages.ts +++ b/common/lib/utils/messages.ts @@ -417,7 +417,14 @@ const MESSAGES: Record = { "GlobalDbFailoverPlugin.currentFailoverMode": "Current Global DB failover mode: %s", "GlobalDbFailoverPlugin.failoverElapsed": "Global DB failover elapsed time: %s ms", "GlobalDbFailoverPlugin.candidateNull": "Candidate host is null for role: %s", - "GlobalDbFailoverPlugin.unableToConnect": "Unable to establish a connection during Global DB failover." + "GlobalDbFailoverPlugin.unableToConnect": "Unable to establish a connection during Global DB failover.", + "GlobalDbFailoverPlugin.unableToConnect": "Unable to establish a connection during failover.", + "GdbReadWriteSplittingPlugin.missingHomeRegion": + "Unable to parse home region from endpoint '%s'. Please ensure you have set the 'gdbRwHomeRegion' connection parameter.", + "GdbReadWriteSplittingPlugin.cantConnectWriterOutOfHomeRegion": + "Writer connection to '%s' is not allowed since it is out of home region '%s'.", + "GdbReadWriteSplittingPlugin.noAvailableReadersInHomeRegion": "No available reader nodes in home region '%s'.", + "GdbReadWriteSplittingPlugin.parameterValue": "%s=%s" }; export class Messages { diff --git a/common/lib/wrapper_property.ts b/common/lib/wrapper_property.ts index ad9d2589..3f1e8811 100644 --- a/common/lib/wrapper_property.ts +++ b/common/lib/wrapper_property.ts @@ -564,6 +564,24 @@ export class WrapperProperties { ["writer", "none"] ); + static readonly GDB_RW_HOME_REGION = new WrapperProperty( + "gdbRwHomeRegion", + "Specifies the home region for read/write splitting.", + null + ); + + static readonly GDB_RW_RESTRICT_WRITER_TO_HOME_REGION = new WrapperProperty( + "gdbRwRestrictWriterToHomeRegion", + "Prevents connections to a writer node outside of the defined home region.", + true + ); + + static readonly GDB_RW_RESTRICT_READER_TO_HOME_REGION = new WrapperProperty( + "gdbRwRestrictReaderToHomeRegion", + "Prevents connections to a reader node outside of the defined home region.", + true + ); + private static readonly PREFIXES = [ WrapperProperties.MONITORING_PROPERTY_PREFIX, ClusterTopologyMonitorImpl.MONITORING_PROPERTY_PREFIX, From 9d18c0c6934ca999b579e5a198a71ae8e163be4b Mon Sep 17 00:00:00 2001 From: Karen Chen <64801825+karenc-bq@users.noreply.github.com> Date: Mon, 16 Mar 2026 21:13:10 -0700 Subject: [PATCH 2/3] chore: update fake timers --- tests/integration/container/tests/iam_authentication.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/integration/container/tests/iam_authentication.test.ts b/tests/integration/container/tests/iam_authentication.test.ts index 5b516c52..5b736611 100644 --- a/tests/integration/container/tests/iam_authentication.test.ts +++ b/tests/integration/container/tests/iam_authentication.test.ts @@ -73,7 +73,7 @@ describe("iam authentication", () => { beforeEach(async () => { logger.info(`Test started: ${expect.getState().currentTestName}`); jest.useFakeTimers({ - doNotFake: ["nextTick"] + doNotFake: ["nextTick", "setTimeout", "setInterval", "clearTimeout", "clearInterval", "setImmediate", "clearImmediate"] }); client = null; env = await TestEnvironment.getCurrent(); From dc5e10099c6f22b1cb3479054999b855b87ceca8 Mon Sep 17 00:00:00 2001 From: Karen Chen <64801825+karenc-bq@users.noreply.github.com> Date: Mon, 16 Mar 2026 21:31:30 -0700 Subject: [PATCH 3/3] chore: address review comments --- .../abstract_read_write_splitting_plugin.ts | 7 ++---- ....ts => gdb_read_write_splitting_plugin.ts} | 22 +++++++------------ ...gdb_read_write_splitting_plugin_factory.ts | 7 ++++-- .../read_write_splitting_plugin.ts | 13 +++++------ common/lib/utils/messages.ts | 1 - 5 files changed, 21 insertions(+), 29 deletions(-) rename common/lib/plugins/read_write_splitting/{gdb_read_writer_splitting_plugin.ts => gdb_read_write_splitting_plugin.ts} (87%) diff --git a/common/lib/plugins/read_write_splitting/abstract_read_write_splitting_plugin.ts b/common/lib/plugins/read_write_splitting/abstract_read_write_splitting_plugin.ts index ede96c54..65482211 100644 --- a/common/lib/plugins/read_write_splitting/abstract_read_write_splitting_plugin.ts +++ b/common/lib/plugins/read_write_splitting/abstract_read_write_splitting_plugin.ts @@ -30,13 +30,11 @@ import { FailoverError } from "../../utils/errors"; import { WrapperProperties } from "../../wrapper_property"; import { convertMsToNanos, getTimeInNanos, logAndThrowError } from "../../utils/utils"; import { CacheItem } from "../../utils/cache_map"; -import { FullServicesContainer } from "../../utils/full_services_container"; export abstract class AbstractReadWriteSplittingPlugin extends AbstractConnectionPlugin implements CanReleaseResources { private static readonly subscribedMethods: Set = new Set(["initHostProvider", "connect", "notifyConnectionChanged", "query"]); protected _hostListProviderService: HostListProviderService | undefined; - protected servicesContainer: FullServicesContainer; protected pluginService: PluginService; protected readonly _properties: Map; protected readerHostInfo?: HostInfo = undefined; @@ -50,10 +48,9 @@ export abstract class AbstractReadWriteSplittingPlugin extends AbstractConnectio private _inReadWriteSplit = false; - protected constructor(serviceContainer: FullServicesContainer, properties: Map) { + protected constructor(pluginService: PluginService, properties: Map) { super(); - this.servicesContainer = serviceContainer; - this.pluginService = this.servicesContainer.getPluginService(); + this.pluginService = pluginService; this._properties = properties; this.readerSelectorStrategy = WrapperProperties.READER_HOST_SELECTOR_STRATEGY.get(properties); } diff --git a/common/lib/plugins/read_write_splitting/gdb_read_writer_splitting_plugin.ts b/common/lib/plugins/read_write_splitting/gdb_read_write_splitting_plugin.ts similarity index 87% rename from common/lib/plugins/read_write_splitting/gdb_read_writer_splitting_plugin.ts rename to common/lib/plugins/read_write_splitting/gdb_read_write_splitting_plugin.ts index 27e71f20..b9f4d94f 100644 --- a/common/lib/plugins/read_write_splitting/gdb_read_writer_splitting_plugin.ts +++ b/common/lib/plugins/read_write_splitting/gdb_read_write_splitting_plugin.ts @@ -15,7 +15,6 @@ */ import { ReadWriteSplittingPlugin } from "./read_write_splitting_plugin"; -import { PluginService } from "../../plugin_service"; import { WrapperProperties } from "../../wrapper_property"; import { HostInfo } from "../../host_info"; import { RdsUtils } from "../../utils/rds_utils"; @@ -24,29 +23,22 @@ import { Messages } from "../../utils/messages"; import { logger } from "../../../logutils"; import { ClientWrapper } from "../../client_wrapper"; import { equalsIgnoreCase } from "../../utils/utils"; -import { FullServicesContainer } from "../../utils/full_services_container"; export class GdbReadWriteSplittingPlugin extends ReadWriteSplittingPlugin { protected readonly rdsUtils: RdsUtils = new RdsUtils(); - protected readonly restrictWriterToHomeRegion: boolean; - protected readonly restrictReaderToHomeRegion: boolean; + protected restrictWriterToHomeRegion: boolean; + protected restrictReaderToHomeRegion: boolean; protected isInitialized: boolean = false; protected homeRegion: string; - constructor(serviceContainer: FullServicesContainer, properties: Map) { - super(serviceContainer, properties); - this.restrictWriterToHomeRegion = WrapperProperties.GDB_RW_RESTRICT_WRITER_TO_HOME_REGION.get(properties); - this.restrictReaderToHomeRegion = WrapperProperties.GDB_RW_RESTRICT_READER_TO_HOME_REGION.get(properties); - } - protected initSettings(initHostInfo: HostInfo, properties: Map): void { if (this.isInitialized) { return; } - - this.isInitialized = true; + this.restrictWriterToHomeRegion = WrapperProperties.GDB_RW_RESTRICT_WRITER_TO_HOME_REGION.get(properties); + this.restrictReaderToHomeRegion = WrapperProperties.GDB_RW_RESTRICT_READER_TO_HOME_REGION.get(properties); this.homeRegion = WrapperProperties.GDB_RW_HOME_REGION.get(properties); if (!this.homeRegion) { @@ -61,6 +53,8 @@ export class GdbReadWriteSplittingPlugin extends ReadWriteSplittingPlugin { } logger.debug(Messages.get("GdbReadWriteSplittingPlugin.parameterValue", "gdbRwHomeRegion", this.homeRegion)); + + this.isInitialized = true; } override async connect( @@ -76,8 +70,8 @@ export class GdbReadWriteSplittingPlugin extends ReadWriteSplittingPlugin { override setWriterClient(writerTargetClient: ClientWrapper | undefined, writerHostInfo: HostInfo) { if ( this.restrictWriterToHomeRegion && - this.writerHostInfo != null && - !equalsIgnoreCase(this.rdsUtils.getRdsRegion(this.writerHostInfo.host), this.homeRegion) + writerHostInfo != null && + !equalsIgnoreCase(this.rdsUtils.getRdsRegion(writerHostInfo.host), this.homeRegion) ) { throw new ReadWriteSplittingError( Messages.get("GdbReadWriteSplittingPlugin.cantConnectWriterOutOfHomeRegion", writerHostInfo.host, this.homeRegion) diff --git a/common/lib/plugins/read_write_splitting/gdb_read_write_splitting_plugin_factory.ts b/common/lib/plugins/read_write_splitting/gdb_read_write_splitting_plugin_factory.ts index a34de01e..6160ac7b 100644 --- a/common/lib/plugins/read_write_splitting/gdb_read_write_splitting_plugin_factory.ts +++ b/common/lib/plugins/read_write_splitting/gdb_read_write_splitting_plugin_factory.ts @@ -27,9 +27,12 @@ export class GdbReadWriteSplittingPluginFactory extends ConnectionPluginFactory async getInstance(servicesContainer: FullServicesContainer, properties: Map): Promise { try { if (!GdbReadWriteSplittingPluginFactory.gdbReadWriteSplittingPlugin) { - GdbReadWriteSplittingPluginFactory.gdbReadWriteSplittingPlugin = await import("./gdb_read_writer_splitting_plugin"); + GdbReadWriteSplittingPluginFactory.gdbReadWriteSplittingPlugin = await import("./gdb_read_write_splitting_plugin"); } - return new GdbReadWriteSplittingPluginFactory.gdbReadWriteSplittingPlugin.GdbReadWriteSplittingPlugin(servicesContainer, properties); + return new GdbReadWriteSplittingPluginFactory.gdbReadWriteSplittingPlugin.GdbReadWriteSplittingPlugin( + servicesContainer.getPluginService(), + properties + ); } catch (error: any) { throw new AwsWrapperError(Messages.get("ConnectionPluginChainBuilder.errorImportingPlugin", error.message, "gdbReadWriteSplittingPlugin")); } diff --git a/common/lib/plugins/read_write_splitting/read_write_splitting_plugin.ts b/common/lib/plugins/read_write_splitting/read_write_splitting_plugin.ts index fc7dc7d0..38e6fc32 100644 --- a/common/lib/plugins/read_write_splitting/read_write_splitting_plugin.ts +++ b/common/lib/plugins/read_write_splitting/read_write_splitting_plugin.ts @@ -24,27 +24,26 @@ import { AbstractReadWriteSplittingPlugin } from "./abstract_read_write_splittin import { WrapperProperties } from "../../wrapper_property"; import { logger } from "../../../logutils"; import { CacheItem } from "../../utils/cache_map"; -import { FullServicesContainer } from "../../utils/full_services_container"; export class ReadWriteSplittingPlugin extends AbstractReadWriteSplittingPlugin { protected hosts: HostInfo[] = []; - constructor(serviceContainer: FullServicesContainer, properties: Map); + constructor(pluginService: PluginService, properties: Map); constructor( - serviceContainer: FullServicesContainer, + pluginService: PluginService, properties: Map, hostListProviderService: HostListProviderService, writerClient: ClientWrapper, readerClient: ClientWrapper ); constructor( - serviceContainer: FullServicesContainer, + pluginService: PluginService, properties: Map, hostListProviderService?: HostListProviderService, writerClient?: ClientWrapper, readerClient?: ClientWrapper ) { - super(serviceContainer, properties); + super(pluginService, properties); this._hostListProviderService = hostListProviderService; this.writerTargetClient = writerClient; this.readerCacheItem = new CacheItem(readerClient, BigInt(0)); @@ -65,7 +64,7 @@ export class ReadWriteSplittingPlugin extends AbstractReadWriteSplittingPlugin { if (!isInitialConnection || this._hostListProviderService?.isStaticHostListProvider()) { return result; } - const currentRole = this.pluginService.getCurrentHostInfo()?.role; + const currentRole = await this.pluginService.getHostRole(result); if (currentRole == HostRole.UNKNOWN) { logAndThrowError(Messages.get("ReadWriteSplittingPlugin.errorVerifyingInitialHostRole")); @@ -182,7 +181,7 @@ export class ReadWriteSplittingPlugin extends AbstractReadWriteSplittingPlugin { } } - protected getReaderHostCandidates(): HostInfo[] | undefined { + protected getReaderHostCandidates(): HostInfo[] { return this.pluginService.getHosts(); } } diff --git a/common/lib/utils/messages.ts b/common/lib/utils/messages.ts index 571d7b21..84cb26ce 100644 --- a/common/lib/utils/messages.ts +++ b/common/lib/utils/messages.ts @@ -418,7 +418,6 @@ const MESSAGES: Record = { "GlobalDbFailoverPlugin.failoverElapsed": "Global DB failover elapsed time: %s ms", "GlobalDbFailoverPlugin.candidateNull": "Candidate host is null for role: %s", "GlobalDbFailoverPlugin.unableToConnect": "Unable to establish a connection during Global DB failover.", - "GlobalDbFailoverPlugin.unableToConnect": "Unable to establish a connection during failover.", "GdbReadWriteSplittingPlugin.missingHomeRegion": "Unable to parse home region from endpoint '%s'. Please ensure you have set the 'gdbRwHomeRegion' connection parameter.", "GdbReadWriteSplittingPlugin.cantConnectWriterOutOfHomeRegion":