From 246d9d48a775ca82f78afa04cca6864319b23893 Mon Sep 17 00:00:00 2001 From: Cheena Malhotra Date: Fri, 15 Nov 2019 11:57:15 -0800 Subject: [PATCH] [release/2.1] Fixes driver behavior of sending Attention signal for successful Bulk Copy operation --- .../src/System/Data/SqlClient/SqlBulkCopy.cs | 18 +++++++++--------- .../SQL/SqlBulkCopyTest/CopyAllFromReader.cs | 2 +- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/System.Data.SqlClient/src/System/Data/SqlClient/SqlBulkCopy.cs b/src/System.Data.SqlClient/src/System/Data/SqlClient/SqlBulkCopy.cs index 09a61eaf52ba..816552b06bd1 100644 --- a/src/System.Data.SqlClient/src/System/Data/SqlClient/SqlBulkCopy.cs +++ b/src/System.Data.SqlClient/src/System/Data/SqlClient/SqlBulkCopy.cs @@ -2566,7 +2566,7 @@ private void CopyBatchesAsyncContinuedOnError(bool cleanupParser) if (_stateObj != null) { - CleanUpStateObjectOnError(); + CleanUpStateObject(); } } catch (OutOfMemoryException) @@ -2589,7 +2589,7 @@ private void CopyBatchesAsyncContinuedOnError(bool cleanupParser) } // Cleans the stateobj. Used in a number of places, specially in exceptions. - private void CleanUpStateObjectOnError() + private void CleanUpStateObject(bool isCancelRequested = true) { if (_stateObj != null) { @@ -2599,7 +2599,7 @@ private void CleanUpStateObjectOnError() _stateObj.ResetBuffer(); _stateObj._outputPacketNumber = 1; // If _parser is closed, sending attention will raise debug assertion, so we avoid it (but not calling CancelRequest). - if (_parser.State == TdsParserState.OpenNotLoggedIn || _parser.State == TdsParserState.OpenLoggedIn) + if (isCancelRequested && (_parser.State == TdsParserState.OpenNotLoggedIn || _parser.State == TdsParserState.OpenLoggedIn)) { _stateObj.CancelRequest(); } @@ -2659,7 +2659,7 @@ private void WriteToServerInternalRestContinuedAsync(BulkCopySimpleResultSet int _localColumnMappings = null; try { - CleanUpStateObjectOnError(); + CleanUpStateObject(); } finally { @@ -2675,7 +2675,7 @@ private void WriteToServerInternalRestContinuedAsync(BulkCopySimpleResultSet int _localColumnMappings = null; try { - CleanUpStateObjectOnError(); + CleanUpStateObject(isCancelRequested: false); } finally { @@ -2701,11 +2701,11 @@ private void WriteToServerInternalRestContinuedAsync(BulkCopySimpleResultSet int try { - CleanUpStateObjectOnError(); + CleanUpStateObject(isCancelRequested: false); } catch (Exception cleanupEx) { - Debug.Fail("Unexpected exception during CleanUpstateObjectOnError (ignored)", cleanupEx.ToString()); + Debug.Fail($"Unexpected exception during {nameof(CleanUpStateObject)} (ignored)", cleanupEx.ToString()); } if (source != null) @@ -2720,11 +2720,11 @@ private void WriteToServerInternalRestContinuedAsync(BulkCopySimpleResultSet int try { - CleanUpStateObjectOnError(); + CleanUpStateObject(); } catch (Exception cleanupEx) { - Debug.Fail("Unexpected exception during CleanUpstateObjectOnError (ignored)", cleanupEx.ToString()); + Debug.Fail($"Unexpected exception during {nameof(CleanUpStateObject)} (ignored)", cleanupEx.ToString()); } if (source != null) diff --git a/src/System.Data.SqlClient/tests/ManualTests/SQL/SqlBulkCopyTest/CopyAllFromReader.cs b/src/System.Data.SqlClient/tests/ManualTests/SQL/SqlBulkCopyTest/CopyAllFromReader.cs index e4457430eeca..3a221f9f7cb9 100644 --- a/src/System.Data.SqlClient/tests/ManualTests/SQL/SqlBulkCopyTest/CopyAllFromReader.cs +++ b/src/System.Data.SqlClient/tests/ManualTests/SQL/SqlBulkCopyTest/CopyAllFromReader.cs @@ -62,7 +62,7 @@ public static void Test(string srcConstr, string dstConstr, string dstTable) DataTestUtility.AssertEqualsWithDescription((long)0, (long)stats["CursorOpens"], "Non-zero CursorOpens value: " + (long)stats["CursorOpens"]); DataTestUtility.AssertEqualsWithDescription((long)0, (long)stats["IduRows"], "Non-zero IduRows value: " + (long)stats["IduRows"]); - DataTestUtility.AssertEqualsWithDescription((long)4, stats["BuffersReceived"], "Unexpected BuffersReceived value."); + DataTestUtility.AssertEqualsWithDescription((long)3, stats["BuffersReceived"], "Unexpected BuffersReceived value."); DataTestUtility.AssertEqualsWithDescription((long)3, stats["BuffersSent"], "Unexpected BuffersSent value."); DataTestUtility.AssertEqualsWithDescription((long)0, stats["IduCount"], "Unexpected IduCount value."); DataTestUtility.AssertEqualsWithDescription((long)3, stats["SelectCount"], "Unexpected SelectCount value.");