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.Contracts;
using Microsoft.SqlTools.ServiceLayer.Connection;
using Microsoft.SqlTools.ServiceLayer.Connection.Contracts;
using Microsoft.SqlTools.ServiceLayer.DisasterRecovery.Contracts;
using Microsoft.SqlTools.ServiceLayer.DisasterRecovery.RestoreOperation;
using Microsoft.SqlTools.ServiceLayer.FileBrowser;
@@ -202,7 +201,7 @@ namespace Microsoft.SqlTools.ServiceLayer.DisasterRecovery
{
ConnectionInfo connInfo;
bool supported = IsBackupRestoreOperationSupported(restoreParams.OwnerUri, out connInfo);
if (restoreParams.OverwriteTargetDatabase)
{
restoreParams.TargetDatabaseName = restoreParams.SourceDatabaseName;
@@ -277,7 +276,7 @@ namespace Microsoft.SqlTools.ServiceLayer.DisasterRecovery
{
try
{
RestoreDatabaseTaskDataObject restoreDataObject = this.restoreDatabaseService.CreateRestoreDatabaseTaskDataObject(restoreParams, connInfo);
if (restoreDataObject != null)
@@ -332,17 +331,33 @@ namespace Microsoft.SqlTools.ServiceLayer.DisasterRecovery
if (supported && connInfo != null)
{
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");
// Connection gets discounnected when backup is done
try
{
BackupOperation backupOperation = CreateBackupOperation(helper.DataContainer, sqlConn, backupParams.BackupInfo);
BackupOperation backupOperation = CreateBackupOperation(helper.DataContainer, sqlConn, backupParams.BackupInfo);
SqlTask sqlTask = null;
// create task metadata
TaskMetadata metadata = TaskMetadata.Create(backupParams, SR.BackupTaskName, backupOperation, ConnectionServiceInstance);
SqlTask sqlTask = SqlTaskManagerInstance.CreateAndRun<SqlTask>(metadata);
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;
}
// create task metadata
TaskMetadata metadata = TaskMetadata.Create(backupParams, SR.BackupTaskName, backupOperation, ConnectionServiceInstance);
sqlTask = SqlTaskManagerInstance.CreateAndRun<SqlTask>(metadata);
sqlTask.StatusChanged += CloseConnection;
}
else
{
@@ -381,7 +396,7 @@ namespace Microsoft.SqlTools.ServiceLayer.DisasterRecovery
}
catch
{
if(sqlConn != null && sqlConn.State == System.Data.ConnectionState.Open)
if (sqlConn != null && sqlConn.State == System.Data.ConnectionState.Open)
{
sqlConn.Close();
}
@@ -390,18 +405,6 @@ namespace Microsoft.SqlTools.ServiceLayer.DisasterRecovery
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)
{
BackupOperation backupOperation = new BackupOperation();