Skip to content

Commit f719e4e

Browse files
committed
Reduce most Debug logging to Trace level.
Signed-off-by: Bradley Grainger <[email protected]>
1 parent 23714d7 commit f719e4e

8 files changed

+52
-52
lines changed

src/MySqlConnector/Core/BackgroundConnectionResetHelper.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,13 @@ public static void AddSession(ServerSession session, MySqlConnection? owningConn
1515
lock (s_lock)
1616
s_resetTasks.Add(resetTask);
1717

18-
if (Log.IsDebugEnabled())
19-
Log.Debug("Started Session{0} reset in background; waiting TaskCount: {1}.", session.Id, s_resetTasks.Count);
18+
if (Log.IsTraceEnabled())
19+
Log.Trace("Started Session{0} reset in background; waiting TaskCount: {1}.", session.Id, s_resetTasks.Count);
2020

2121
// release only if it is likely to succeed
2222
if (s_semaphore.CurrentCount == 0)
2323
{
24-
Log.Debug("Releasing semaphore.");
24+
Log.Trace("Releasing semaphore.");
2525
try
2626
{
2727
s_semaphore.Release();
@@ -76,7 +76,7 @@ public static async Task ReturnSessionsAsync()
7676
try
7777
{
7878
// block until AddSession releases the semaphore
79-
Log.Debug("Waiting for semaphore.");
79+
Log.Trace("Waiting for semaphore.");
8080
await s_semaphore.WaitAsync(s_cancellationTokenSource.Token).ConfigureAwait(false);
8181

8282
// process all sessions that have started being returned
@@ -91,8 +91,8 @@ public static async Task ReturnSessionsAsync()
9191
if (localTasks.Count == 0)
9292
break;
9393

94-
if (Log.IsDebugEnabled())
95-
Log.Debug("Found TaskCount {0} task(s) to process.", localTasks.Count);
94+
if (Log.IsTraceEnabled())
95+
Log.Trace("Found TaskCount {0} task(s) to process.", localTasks.Count);
9696

9797
await Task.WhenAll(localTasks);
9898
localTasks.Clear();

src/MySqlConnector/Core/CommandExecutor.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,8 @@ public static async Task<MySqlDataReader> ExecuteReaderAsync(IReadOnlyList<IMySq
2323
// pre-requisite: Connection is non-null must be checked before calling this method
2424
var connection = command.Connection!;
2525

26-
if (Log.IsDebugEnabled())
27-
Log.Debug("Session{0} ExecuteReader {1} CommandCount: {2}", connection.Session.Id, ioBehavior, commands.Count);
26+
if (Log.IsTraceEnabled())
27+
Log.Trace("Session{0} ExecuteReader {1} CommandCount: {2}", connection.Session.Id, ioBehavior, commands.Count);
2828

2929
Dictionary<string, CachedProcedure?>? cachedProcedures = null;
3030
foreach (var command2 in commands)

src/MySqlConnector/Core/ConcatenatedCommandPayloadCreator.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@ public bool WriteQueryCommand(ref CommandListPosition commandListPosition, IDict
1919
do
2020
{
2121
var command = commandListPosition.Commands[commandListPosition.CommandIndex];
22-
if (Log.IsDebugEnabled())
23-
Log.Debug("Session{0} Preparing command payload; CommandText: {1}", command.Connection!.Session.Id, command.CommandText);
22+
if (Log.IsTraceEnabled())
23+
Log.Trace("Session{0} Preparing command payload; CommandText: {1}", command.Connection!.Session.Id, command.CommandText);
2424

2525
isComplete = SingleCommandPayloadCreator.WriteQueryPayload(command, cachedProcedures, writer);
2626
commandListPosition.CommandIndex++;

src/MySqlConnector/Core/ConnectionPool.cs

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ public async ValueTask<ServerSession> GetSessionAsync(MySqlConnection connection
3636
await CreateMinimumPooledSessions(ioBehavior, cancellationToken).ConfigureAwait(false);
3737

3838
// wait for an open slot (until the cancellationToken is cancelled, which is typically due to timeout)
39-
Log.Debug("Pool{0} waiting for an available session", m_logArguments);
39+
Log.Trace("Pool{0} waiting for an available session", m_logArguments);
4040
if (ioBehavior == IOBehavior.Asynchronous)
4141
await m_sessionSemaphore.WaitAsync(cancellationToken).ConfigureAwait(false);
4242
else
@@ -56,12 +56,12 @@ public async ValueTask<ServerSession> GetSessionAsync(MySqlConnection connection
5656
}
5757
if (session is not null)
5858
{
59-
Log.Debug("Pool{0} found an existing session; checking it for validity", m_logArguments);
59+
Log.Trace("Pool{0} found an existing session; checking it for validity", m_logArguments);
6060
bool reuseSession;
6161

6262
if (session.PoolGeneration != m_generation)
6363
{
64-
Log.Debug("Pool{0} discarding session due to wrong generation", m_logArguments);
64+
Log.Trace("Pool{0} discarding session due to wrong generation", m_logArguments);
6565
reuseSession = false;
6666
}
6767
else
@@ -97,8 +97,8 @@ public async ValueTask<ServerSession> GetSessionAsync(MySqlConnection connection
9797
m_leasedSessions.Add(session.Id, session);
9898
leasedSessionsCountPooled = m_leasedSessions.Count;
9999
}
100-
if (Log.IsDebugEnabled())
101-
Log.Debug("Pool{0} returning pooled Session{1} to caller; LeasedSessionsCount={2}", m_logArguments[0], session.Id, leasedSessionsCountPooled);
100+
if (Log.IsTraceEnabled())
101+
Log.Trace("Pool{0} returning pooled Session{1} to caller; LeasedSessionsCount={2}", m_logArguments[0], session.Id, leasedSessionsCountPooled);
102102
return session;
103103
}
104104
}
@@ -113,8 +113,8 @@ public async ValueTask<ServerSession> GetSessionAsync(MySqlConnection connection
113113
m_leasedSessions.Add(session.Id, session);
114114
leasedSessionsCountNew = m_leasedSessions.Count;
115115
}
116-
if (Log.IsDebugEnabled())
117-
Log.Debug("Pool{0} returning new Session{1} to caller; LeasedSessionsCount={2}", m_logArguments[0], session.Id, leasedSessionsCountNew);
116+
if (Log.IsTraceEnabled())
117+
Log.Trace("Pool{0} returning new Session{1} to caller; LeasedSessionsCount={2}", m_logArguments[0], session.Id, leasedSessionsCountNew);
118118
return session;
119119
}
120120
catch (Exception ex)
@@ -164,8 +164,8 @@ public async ValueTask<int> ReturnAsync(IOBehavior ioBehavior, ServerSession ses
164164
public async ValueTask ReturnAsync(IOBehavior ioBehavior, ServerSession session)
165165
#endif
166166
{
167-
if (Log.IsDebugEnabled())
168-
Log.Debug("Pool{0} receiving Session{1} back", m_logArguments[0], session.Id);
167+
if (Log.IsTraceEnabled())
168+
Log.Trace("Pool{0} receiving Session{1} back", m_logArguments[0], session.Id);
169169

170170
try
171171
{
@@ -210,7 +210,7 @@ public async Task ClearAsync(IOBehavior ioBehavior, CancellationToken cancellati
210210

211211
public async Task ReapAsync(IOBehavior ioBehavior, CancellationToken cancellationToken)
212212
{
213-
Log.Debug("Pool{0} reaping connection pool", m_logArguments);
213+
Log.Trace("Pool{0} reaping connection pool", m_logArguments);
214214
await RecoverLeakedSessionsAsync(ioBehavior).ConfigureAwait(false);
215215
await CleanPoolAsync(ioBehavior, session => (unchecked((uint) Environment.TickCount) - session.LastReturnedTicks) / 1000 >= ConnectionSettings.ConnectionIdleTimeout, true, cancellationToken).ConfigureAwait(false);
216216
}
@@ -250,7 +250,7 @@ private async Task RecoverLeakedSessionsAsync(IOBehavior ioBehavior)
250250
}
251251
}
252252
if (recoveredSessions.Count == 0)
253-
Log.Debug("Pool{0} recovered no sessions", m_logArguments);
253+
Log.Trace("Pool{0} recovered no sessions", m_logArguments);
254254
else
255255
Log.Warn("Pool{0}: RecoveredSessionCount={1}", m_logArguments[0], recoveredSessions.Count);
256256
foreach (var session in recoveredSessions)

src/MySqlConnector/Core/ServerSession.cs

Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ public ServerSession(ConnectionPool? pool, int poolGeneration, int id)
4646
PoolGeneration = poolGeneration;
4747
HostName = "";
4848
m_logArguments = new object?[] { "{0}".FormatInvariant(Id), null };
49-
Log.Debug("Session{0} created new session", m_logArguments);
49+
Log.Trace("Session{0} created new session", m_logArguments);
5050
}
5151

5252
public string Id { get; }
@@ -74,10 +74,10 @@ public ValueTask<int> ReturnToPoolAsync(IOBehavior ioBehavior, MySqlConnection?
7474
public ValueTask ReturnToPoolAsync(IOBehavior ioBehavior, MySqlConnection? owningConnection)
7575
#endif
7676
{
77-
if (Log.IsDebugEnabled())
77+
if (Log.IsTraceEnabled())
7878
{
7979
m_logArguments[1] = Pool?.Id;
80-
Log.Debug("Session{0} returning to Pool{1}", m_logArguments);
80+
Log.Trace("Session{0} returning to Pool{1}", m_logArguments);
8181
}
8282
LastReturnedTicks = unchecked((uint) Environment.TickCount);
8383
if (Pool is null)
@@ -296,7 +296,7 @@ public void StartQuerying(ICancellableCommand command)
296296
public void FinishQuerying()
297297
{
298298
m_logArguments[1] = m_state;
299-
Log.Debug("Session{0} entering FinishQuerying; SessionState={1}", m_logArguments);
299+
Log.Trace("Session{0} entering FinishQuerying; SessionState={1}", m_logArguments);
300300
bool clearConnection = false;
301301
lock (m_lock)
302302
{
@@ -432,7 +432,7 @@ public async Task DisposeAsync(IOBehavior ioBehavior, CancellationToken cancella
432432
else
433433
authPluginName = (initialHandshake.ProtocolCapabilities & ProtocolCapabilities.SecureConnection) == 0 ? "mysql_old_password" : "mysql_native_password";
434434
m_logArguments[1] = authPluginName;
435-
Log.Debug("Session{0} server sent AuthPluginName={1}", m_logArguments);
435+
Log.Trace("Session{0} server sent AuthPluginName={1}", m_logArguments);
436436
if (authPluginName != "mysql_native_password" && authPluginName != "sha256_password" && authPluginName != "caching_sha2_password")
437437
{
438438
Log.Error("Session{0} unsupported authentication method AuthPluginName={1}", m_logArguments);
@@ -547,7 +547,7 @@ public async Task<bool> TryResetConnectionAsync(ConnectionSettings cs, MySqlConn
547547
if (DatabaseOverride is null && (ServerVersion.Version.CompareTo(ServerVersions.SupportsResetConnection) >= 0 || ServerVersion.MariaDbVersion?.CompareTo(ServerVersions.MariaDbSupportsResetConnection) >= 0))
548548
{
549549
m_logArguments[1] = ServerVersion.OriginalString;
550-
Log.Debug("Session{0} ServerVersion={1} supports reset connection; sending reset connection request", m_logArguments);
550+
Log.Trace("Session{0} ServerVersion={1} supports reset connection; sending reset connection request", m_logArguments);
551551
await SendAsync(ResetConnectionPayload.Instance, ioBehavior, cancellationToken).ConfigureAwait(false);
552552
payload = await ReceiveReplyAsync(ioBehavior, cancellationToken).ConfigureAwait(false);
553553
OkPayload.Create(payload.Span, SupportsDeprecateEof, SupportsSessionTrack);
@@ -558,7 +558,7 @@ public async Task<bool> TryResetConnectionAsync(ConnectionSettings cs, MySqlConn
558558
if (DatabaseOverride is null)
559559
{
560560
m_logArguments[1] = ServerVersion.OriginalString;
561-
Log.Debug("Session{0} ServerVersion={1} doesn't support reset connection; sending change user request", m_logArguments);
561+
Log.Trace("Session{0} ServerVersion={1} doesn't support reset connection; sending change user request", m_logArguments);
562562
}
563563
else
564564
{
@@ -572,7 +572,7 @@ public async Task<bool> TryResetConnectionAsync(ConnectionSettings cs, MySqlConn
572572
payload = await ReceiveReplyAsync(ioBehavior, cancellationToken).ConfigureAwait(false);
573573
if (payload.HeaderByte == AuthenticationMethodSwitchRequestPayload.Signature)
574574
{
575-
Log.Debug("Session{0} optimistic reauthentication failed; logging in again", m_logArguments);
575+
Log.Trace("Session{0} optimistic reauthentication failed; logging in again", m_logArguments);
576576
payload = await SwitchAuthenticationAsync(cs, payload, ioBehavior, cancellationToken).ConfigureAwait(false);
577577
}
578578
OkPayload.Create(payload.Span, SupportsDeprecateEof, SupportsSessionTrack);
@@ -587,19 +587,19 @@ public async Task<bool> TryResetConnectionAsync(ConnectionSettings cs, MySqlConn
587587
}
588588
catch (IOException ex)
589589
{
590-
Log.Debug(ex, "Session{0} ignoring IOException in TryResetConnectionAsync", m_logArguments);
590+
Log.Trace(ex, "Session{0} ignoring IOException in TryResetConnectionAsync", m_logArguments);
591591
}
592592
catch (MySqlException ex) when (ex.ErrorCode == MySqlErrorCode.ClientInteractionTimeout)
593593
{
594-
Log.Debug(ex, "Session{0} ignoring ClientInteractionTimeout MySqlException in TryResetConnectionAsync", m_logArguments);
594+
Log.Trace(ex, "Session{0} ignoring ClientInteractionTimeout MySqlException in TryResetConnectionAsync", m_logArguments);
595595
}
596596
catch (ObjectDisposedException ex)
597597
{
598-
Log.Debug(ex, "Session{0} ignoring ObjectDisposedException in TryResetConnectionAsync", m_logArguments);
598+
Log.Trace(ex, "Session{0} ignoring ObjectDisposedException in TryResetConnectionAsync", m_logArguments);
599599
}
600600
catch (SocketException ex)
601601
{
602-
Log.Debug(ex, "Session{0} ignoring SocketException in TryResetConnectionAsync", m_logArguments);
602+
Log.Trace(ex, "Session{0} ignoring SocketException in TryResetConnectionAsync", m_logArguments);
603603
}
604604

605605
if (returnToPool && Pool is not null)
@@ -618,7 +618,7 @@ private async Task<PayloadData> SwitchAuthenticationAsync(ConnectionSettings cs,
618618
// if the server didn't support the hashed password; rehash with the new challenge
619619
var switchRequest = AuthenticationMethodSwitchRequestPayload.Create(payload.Span);
620620
m_logArguments[1] = switchRequest.Name;
621-
Log.Debug("Session{0} switching to AuthenticationMethod '{1}'", m_logArguments);
621+
Log.Trace("Session{0} switching to AuthenticationMethod '{1}'", m_logArguments);
622622
switch (switchRequest.Name)
623623
{
624624
case "mysql_native_password":
@@ -798,27 +798,27 @@ public async ValueTask<bool> TryPingAsync(bool logInfo, IOBehavior ioBehavior, C
798798
// send ping payload to verify client and server socket are still connected
799799
try
800800
{
801-
Log.Debug("Session{0} pinging server", m_logArguments);
801+
Log.Trace("Session{0} pinging server", m_logArguments);
802802
await SendAsync(PingPayload.Instance, ioBehavior, cancellationToken).ConfigureAwait(false);
803803
var payload = await ReceiveReplyAsync(ioBehavior, cancellationToken).ConfigureAwait(false);
804804
OkPayload.Create(payload.Span, SupportsDeprecateEof, SupportsSessionTrack);
805805
if (logInfo)
806806
Log.Info("Session{0} successfully pinged server", m_logArguments);
807807
else
808-
Log.Debug("Session{0} successfully pinged server", m_logArguments);
808+
Log.Trace("Session{0} successfully pinged server", m_logArguments);
809809
return true;
810810
}
811811
catch (IOException ex)
812812
{
813-
Log.Debug(ex, "Session{0} ping failed due to IOException", m_logArguments);
813+
Log.Trace(ex, "Session{0} ping failed due to IOException", m_logArguments);
814814
}
815815
catch (MySqlException ex) when (ex.ErrorCode == MySqlErrorCode.ClientInteractionTimeout)
816816
{
817-
Log.Debug(ex, "Session{0} ping failed due to ClientInteractionTimeout MySqlException", m_logArguments);
817+
Log.Trace(ex, "Session{0} ping failed due to ClientInteractionTimeout MySqlException", m_logArguments);
818818
}
819819
catch (SocketException ex)
820820
{
821-
Log.Debug(ex, "Session{0} ping failed due to SocketException", m_logArguments);
821+
Log.Trace(ex, "Session{0} ping failed due to SocketException", m_logArguments);
822822
}
823823

824824
VerifyState(State.Failed);
@@ -1037,7 +1037,7 @@ private async Task<bool> OpenTcpSocketAsync(ConnectionSettings cs, ILoadBalancer
10371037
m_socket.SetKeepAlive(cs.Keepalive);
10381038
lock (m_lock)
10391039
m_state = State.Connected;
1040-
Log.Debug("Session{0} connected to IpAddress {1} for HostName '{2}' with local Port {3}", m_logArguments[0], ipAddress, hostName, (m_socket.LocalEndPoint as IPEndPoint)?.Port);
1040+
Log.Trace("Session{0} connected to IpAddress {1} for HostName '{2}' with local Port {3}", m_logArguments[0], ipAddress, hostName, (m_socket.LocalEndPoint as IPEndPoint)?.Port);
10411041
return true;
10421042
}
10431043
}
@@ -1238,7 +1238,7 @@ private async Task InitSslAsync(ProtocolCapabilities serverCapabilities, Connect
12381238
{
12391239
// read the CA Certificate File
12401240
m_logArguments[1] = cs.CACertificateFile;
1241-
Log.Debug("Session{0} loading CA certificate(s) from CertificateFile '{1}'", m_logArguments);
1241+
Log.Trace("Session{0} loading CA certificate(s) from CertificateFile '{1}'", m_logArguments);
12421242
byte[] certificateBytes;
12431243
try
12441244
{
@@ -1258,7 +1258,7 @@ private async Task InitSslAsync(ProtocolCapabilities serverCapabilities, Connect
12581258
{
12591259
// load the certificate at this index; note that 'new X509Certificate' stops at the end of the first certificate it loads
12601260
m_logArguments[1] = index;
1261-
Log.Debug("Session{0} loading certificate at Index {1} in the CA certificate file.", m_logArguments);
1261+
Log.Trace("Session{0} loading certificate at Index {1} in the CA certificate file.", m_logArguments);
12621262
var caCertificate = new X509Certificate2(Utility.ArraySlice(certificateBytes, index, (nextIndex == -1 ? certificateBytes.Length : nextIndex) - index), default(string), X509KeyStorageFlags.MachineKeySet);
12631263
certificateChain.ChainPolicy.ExtraStore.Add(caCertificate);
12641264
}
@@ -1404,7 +1404,7 @@ X509CertificateCollection LoadCertificate(string sslKeyFile, string sslCertifica
14041404
throw new NotSupportedException("SslCert and SslKey connection string options are not supported in netstandard1.3 or netstandard2.0.");
14051405
#elif NET45 || NET461 || NET471 || NETSTANDARD2_1 || NETCOREAPP2_1 || NETCOREAPP3_1
14061406
m_logArguments[1] = sslKeyFile;
1407-
Log.Debug("Session{0} loading client key from KeyFile '{1}'", m_logArguments);
1407+
Log.Trace("Session{0} loading client key from KeyFile '{1}'", m_logArguments);
14081408
string keyPem;
14091409
try
14101410
{
@@ -1642,7 +1642,7 @@ private void VerifyState(State state1, State state2, State state3)
16421642

16431643
private byte[] CreateConnectionAttributes(string programName)
16441644
{
1645-
Log.Debug("Session{0} creating connection attributes", m_logArguments);
1645+
Log.Trace("Session{0} creating connection attributes", m_logArguments);
16461646
var attributesWriter = new ByteBufferWriter();
16471647
attributesWriter.WriteLengthEncodedString("_client_name");
16481648
attributesWriter.WriteLengthEncodedString("MySqlConnector");

src/MySqlConnector/Core/SingleCommandPayloadCreator.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@ public bool WriteQueryCommand(ref CommandListPosition commandListPosition, IDict
2525
var preparedStatements = command.TryGetPreparedStatements();
2626
if (preparedStatements is null)
2727
{
28-
if (Log.IsDebugEnabled())
29-
Log.Debug("Session{0} Preparing command payload; CommandText: {1}", command.Connection!.Session.Id, command.CommandText);
28+
if (Log.IsTraceEnabled())
29+
Log.Trace("Session{0} Preparing command payload; CommandText: {1}", command.Connection!.Session.Id, command.CommandText);
3030

3131
writer.Write((byte) CommandKind.Query);
3232
WriteQueryPayload(command, cachedProcedures, writer);
@@ -62,8 +62,8 @@ private static void WritePreparedStatement(IMySqlCommand command, PreparedStatem
6262
{
6363
var parameterCollection = command.RawParameters;
6464

65-
if (Log.IsDebugEnabled())
66-
Log.Debug("Session{0} Preparing command payload; CommandId: {1}; CommandText: {2}", command.Connection!.Session.Id, preparedStatement.StatementId, command.CommandText);
65+
if (Log.IsTraceEnabled())
66+
Log.Trace("Session{0} Preparing command payload; CommandId: {1}; CommandText: {2}", command.Connection!.Session.Id, preparedStatement.StatementId, command.CommandText);
6767

6868
writer.Write(preparedStatement.StatementId);
6969
writer.Write((byte) 0);

src/MySqlConnector/MySqlBulkCopy.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -344,7 +344,7 @@ static void AddColumnMapping(List<MySqlBulkCopyColumnMapping> columnMappings, bo
344344
}
345345
else
346346
{
347-
Log.Debug("Setting expression to map SourceOrdinal {0} to DestinationColumn {1}", columnMapping.SourceOrdinal, destinationColumn);
347+
Log.Trace("Setting expression to map SourceOrdinal {0} to DestinationColumn {1}", columnMapping.SourceOrdinal, destinationColumn);
348348
columnMappings.Remove(columnMapping);
349349
columnMappings.Add(new(columnMapping.SourceOrdinal, variableName, expression));
350350
}

src/MySqlConnector/MySqlConnection.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -730,8 +730,8 @@ internal void Cancel(ICancellableCommand command, int commandId, bool isCancel)
730730

731731
internal async Task<CachedProcedure?> GetCachedProcedure(string name, bool revalidateMissing, IOBehavior ioBehavior, CancellationToken cancellationToken)
732732
{
733-
if (Log.IsDebugEnabled())
734-
Log.Debug("Session{0} getting cached procedure Name={1}", m_session!.Id, name);
733+
if (Log.IsTraceEnabled())
734+
Log.Trace("Session{0} getting cached procedure Name={1}", m_session!.Id, name);
735735
if (State != ConnectionState.Open)
736736
throw new InvalidOperationException("Connection is not open.");
737737

@@ -778,7 +778,7 @@ internal void Cancel(ICancellableCommand command, int commandId, bool isCancel)
778778
if (cachedProcedure is null)
779779
Log.Warn("Session{0} did not find cached procedure Schema={1} Component={2}", m_session.Id, normalized.Schema, normalized.Component);
780780
else
781-
Log.Debug("Session{0} returning cached procedure Schema={1} Component={2}", m_session.Id, normalized.Schema, normalized.Component);
781+
Log.Trace("Session{0} returning cached procedure Schema={1} Component={2}", m_session.Id, normalized.Schema, normalized.Component);
782782
}
783783
return cachedProcedure;
784784
}

0 commit comments

Comments
 (0)