Fix backup closing parent connection (#1530)

* Fix backup closing parent connection

* always dispose

* update comment
This commit is contained in:
Charles Gagnon
2022-06-03 17:01:42 -07:00
committed by GitHub
parent 3ff5c6c95c
commit 36d92a1cc4

View File

@@ -10,7 +10,6 @@ using Microsoft.SqlTools.Hosting.Protocol;
using Microsoft.SqlTools.ServiceLayer.Admin; using Microsoft.SqlTools.ServiceLayer.Admin;
using Microsoft.SqlTools.ServiceLayer.Admin.Contracts; using Microsoft.SqlTools.ServiceLayer.Admin.Contracts;
using Microsoft.SqlTools.ServiceLayer.Connection; using Microsoft.SqlTools.ServiceLayer.Connection;
using Microsoft.SqlTools.ServiceLayer.Connection.Contracts;
using Microsoft.SqlTools.ServiceLayer.DisasterRecovery.Contracts; using Microsoft.SqlTools.ServiceLayer.DisasterRecovery.Contracts;
using Microsoft.SqlTools.ServiceLayer.DisasterRecovery.RestoreOperation; using Microsoft.SqlTools.ServiceLayer.DisasterRecovery.RestoreOperation;
using Microsoft.SqlTools.ServiceLayer.FileBrowser; using Microsoft.SqlTools.ServiceLayer.FileBrowser;
@@ -332,17 +331,33 @@ namespace Microsoft.SqlTools.ServiceLayer.DisasterRecovery
if (supported && connInfo != null) if (supported && connInfo != null)
{ {
DatabaseTaskHelper helper = AdminService.CreateDatabaseTaskHelper(connInfo, databaseExists: true); DatabaseTaskHelper helper = AdminService.CreateDatabaseTaskHelper(connInfo, databaseExists: true);
// Open a new connection to use for the backup, which will be closed when the backup task is completed
// (or an error occurs)
SqlConnection sqlConn = ConnectionService.OpenSqlConnection(connInfo, "Backup"); SqlConnection sqlConn = ConnectionService.OpenSqlConnection(connInfo, "Backup");
// Connection gets discounnected when backup is done try
{
BackupOperation backupOperation = CreateBackupOperation(helper.DataContainer, sqlConn, backupParams.BackupInfo);
BackupOperation backupOperation = CreateBackupOperation(helper.DataContainer, sqlConn, backupParams.BackupInfo); // create task metadata
SqlTask sqlTask = null; TaskMetadata metadata = TaskMetadata.Create(backupParams, SR.BackupTaskName, backupOperation, ConnectionServiceInstance);
// create task metadata SqlTask sqlTask = SqlTaskManagerInstance.CreateAndRun<SqlTask>(metadata);
TaskMetadata metadata = TaskMetadata.Create(backupParams, SR.BackupTaskName, backupOperation, ConnectionServiceInstance); sqlTask.StatusChanged += (object sender, TaskEventArgs<SqlTaskStatus> e) =>
{
SqlTask sqlTask = e.SqlTask;
if (sqlTask != null && sqlTask.IsCompleted)
{
sqlConn.Dispose();
}
};
}
catch
{
// Ensure that the connection is closed if any error occurs while starting up the task
sqlConn.Dispose();
throw;
}
sqlTask = SqlTaskManagerInstance.CreateAndRun<SqlTask>(metadata);
sqlTask.StatusChanged += CloseConnection;
} }
else else
{ {
@@ -381,7 +396,7 @@ namespace Microsoft.SqlTools.ServiceLayer.DisasterRecovery
} }
catch catch
{ {
if(sqlConn != null && sqlConn.State == System.Data.ConnectionState.Open) if (sqlConn != null && sqlConn.State == System.Data.ConnectionState.Open)
{ {
sqlConn.Close(); sqlConn.Close();
} }
@@ -390,18 +405,6 @@ namespace Microsoft.SqlTools.ServiceLayer.DisasterRecovery
return false; return false;
} }
private void CloseConnection(object sender, TaskEventArgs<SqlTaskStatus> e)
{
SqlTask sqlTask = e.SqlTask;
if (sqlTask != null && sqlTask.IsCompleted)
{
connectionService.Disconnect(new DisconnectParams()
{
OwnerUri = sqlTask.TaskMetadata.OwnerUri
});
}
}
private BackupOperation CreateBackupOperation(CDataContainer dataContainer, SqlConnection sqlConnection) private BackupOperation CreateBackupOperation(CDataContainer dataContainer, SqlConnection sqlConnection)
{ {
BackupOperation backupOperation = new BackupOperation(); BackupOperation backupOperation = new BackupOperation();