Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Enhance pefrormance of Data Classification Cmdlets. #11629

Merged
merged 2 commits into from
Apr 20, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view

Large diffs are not rendered by default.

Large diffs are not rendered by default.

9 changes: 9 additions & 0 deletions src/Sql/Sql/ChangeLog.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,15 @@
- Additional information about change #1
-->
## Upcoming Release
* Enhance performance of:
- Set-AzSqlDatabaseSensitivityClassification.
- Set-AzSqlInstanceDatabaseSensitivityClassification.
- Remove-AzSqlDatabaseSensitivityClassification.
- Remove-AzSqlInstanceDatabaseSensitivityClassification.
- Enable-AzSqlDatabaseSensitivityRecommendation.
- Enable-AzSqlInstanceDatabaseSensitivityRecommendation.
- Disable-AzSqlDatabaseSensitivityRecommendation.
- Disable-AzSqlInstanceDatabaseSensitivityRecommendation.

## Version 2.6.0
* Added cmdlets `Get-AzSqlInstanceOperation` and `Stop-AzSqlInstanceOperation`
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ protected override ManagedDatabaseSensitivityClassificationModel GetEntity()

protected override ManagedDatabaseSensitivityClassificationModel PersistChanges(ManagedDatabaseSensitivityClassificationModel entity)
{
ModelAdapter.DisableManagedDatabaseSensitivityRecommendations(entity);
ModelAdapter.DisableSensitivityRecommendations(entity);
return null;
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ protected override ManagedDatabaseSensitivityClassificationModel GetEntity()

protected override ManagedDatabaseSensitivityClassificationModel PersistChanges(ManagedDatabaseSensitivityClassificationModel entity)
{
ModelAdapter.EnableManagedDatabaseSensitivityRecommendations(entity);
ModelAdapter.EnableSensitivityRecommendations(entity);
return null;
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ protected override ManagedDatabaseSensitivityClassificationModel GetEntity()

protected override ManagedDatabaseSensitivityClassificationModel PersistChanges(ManagedDatabaseSensitivityClassificationModel entity)
{
ModelAdapter.RemoveManagedDatabaseSensitivityLabels(entity);
ModelAdapter.RemoveSensitivityLabels(entity);
return null;
}
}
Expand Down
235 changes: 153 additions & 82 deletions src/Sql/Sql/DataClassification/Services/DataClassificationAdapter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -38,38 +38,167 @@ public DataClassificationAdapter(IAzureContext context)

internal void SetSensitivityLabels(SqlDatabaseSensitivityClassificationModel model)
{
ModifySensitivityLabels(model, sensitivityLabelModel => Communicator.SetSensitivityLabel(
SplitSensitivityLabelsIntoListsAndPatch(model.SensitivityLabels,
list => Communicator.PatchSensitivityLabels(
model.ResourceGroupName,
model.ServerName,
model.DatabaseName,
sensitivityLabelModel.SchemaName,
sensitivityLabelModel.TableName,
sensitivityLabelModel.ColumnName,
ToSensitivityLabel(sensitivityLabelModel)));
new PatchOperations
{
Operations = list.Select(sensitivityLabelModel => new PatchOperation
{
OperationKind = PatchOperationKind.Set,
Schema = sensitivityLabelModel.SchemaName,
Table = sensitivityLabelModel.TableName,
Column = sensitivityLabelModel.ColumnName,
SensitivityLabel = ToSensitivityLabel(sensitivityLabelModel)
}).ToList()
}));
}

internal void SetSensitivityLabels(ManagedDatabaseSensitivityClassificationModel model)
{
ModifySensitivityLabels(model, sensitivityLabelModel => Communicator.SetManagedDatabaseSensitivityLabel(
SplitSensitivityLabelsIntoListsAndPatch(model.SensitivityLabels,
list => Communicator.PatchManagedDatabaseSensitivityLabels(
model.ResourceGroupName,
model.InstanceName,
model.DatabaseName,
new PatchOperations
{
Operations = list.Select(sensitivityLabelModel => new PatchOperation
{
OperationKind = PatchOperationKind.Set,
Schema = sensitivityLabelModel.SchemaName,
Table = sensitivityLabelModel.TableName,
Column = sensitivityLabelModel.ColumnName,
SensitivityLabel = ToSensitivityLabel(sensitivityLabelModel)
}).ToList()
}));
}

internal void RemoveSensitivityLabels(SqlDatabaseSensitivityClassificationModel model)
{
SplitSensitivityLabelsIntoListsAndPatch(model.SensitivityLabels,
list => Communicator.PatchSensitivityLabels(
model.ResourceGroupName,
model.ServerName,
model.DatabaseName,
new PatchOperations
{
Operations = list.Select(sensitivityLabelModel => new PatchOperation
{
OperationKind = PatchOperationKind.Remove,
Schema = sensitivityLabelModel.SchemaName,
Table = sensitivityLabelModel.TableName,
Column = sensitivityLabelModel.ColumnName,
}).ToList()
}));
}

internal void RemoveSensitivityLabels(ManagedDatabaseSensitivityClassificationModel model)
{
SplitSensitivityLabelsIntoListsAndPatch(model.SensitivityLabels,
list => Communicator.PatchManagedDatabaseSensitivityLabels(
model.ResourceGroupName,
model.InstanceName,
model.DatabaseName,
new PatchOperations
{
Operations = list.Select(sensitivityLabelModel => new PatchOperation
{
OperationKind = PatchOperationKind.Remove,
Schema = sensitivityLabelModel.SchemaName,
Table = sensitivityLabelModel.TableName,
Column = sensitivityLabelModel.ColumnName,
}).ToList()
}));
}

internal void EnableSensitivityRecommendations(SqlDatabaseSensitivityClassificationModel model)
{
SplitSensitivityLabelsIntoListsAndPatch(model.SensitivityLabels,
list => Communicator.PatchSensitivityRecommendations(
model.ResourceGroupName,
model.ServerName,
model.DatabaseName,
new PatchOperations
{
Operations = list.Select(sensitivityLabelModel => new PatchOperation
{
OperationKind = PatchOperationKind.Enable,
Schema = sensitivityLabelModel.SchemaName,
Table = sensitivityLabelModel.TableName,
Column = sensitivityLabelModel.ColumnName,
}).ToList()
}));
}

internal void EnableSensitivityRecommendations(ManagedDatabaseSensitivityClassificationModel model)
{
SplitSensitivityLabelsIntoListsAndPatch(model.SensitivityLabels,
list => Communicator.PatchManagedDatabaseSensitivityRecommendations(
model.ResourceGroupName,
model.InstanceName,
model.DatabaseName,
new PatchOperations
{
Operations = list.Select(sensitivityLabelModel => new PatchOperation
{
OperationKind = PatchOperationKind.Enable,
Schema = sensitivityLabelModel.SchemaName,
Table = sensitivityLabelModel.TableName,
Column = sensitivityLabelModel.ColumnName,
}).ToList()
}));
}

internal void DisableSensitivityRecommendations(SqlDatabaseSensitivityClassificationModel model)
{
SplitSensitivityLabelsIntoListsAndPatch(model.SensitivityLabels,
list => Communicator.PatchSensitivityRecommendations(
model.ResourceGroupName,
model.ServerName,
model.DatabaseName,
new PatchOperations
{
Operations = list.Select(sensitivityLabelModel => new PatchOperation
{
OperationKind = PatchOperationKind.Disable,
Schema = sensitivityLabelModel.SchemaName,
Table = sensitivityLabelModel.TableName,
Column = sensitivityLabelModel.ColumnName,
}).ToList()
}));
}
internal void DisableSensitivityRecommendations(ManagedDatabaseSensitivityClassificationModel model)
{
SplitSensitivityLabelsIntoListsAndPatch(model.SensitivityLabels,
list => Communicator.PatchManagedDatabaseSensitivityRecommendations(
model.ResourceGroupName,
model.InstanceName,
model.DatabaseName,
sensitivityLabelModel.SchemaName,
sensitivityLabelModel.TableName,
sensitivityLabelModel.ColumnName,
ToSensitivityLabel(sensitivityLabelModel)));
new PatchOperations
{
Operations = list.Select(sensitivityLabelModel => new PatchOperation
{
OperationKind = PatchOperationKind.Disable,
Schema = sensitivityLabelModel.SchemaName,
Table = sensitivityLabelModel.TableName,
Column = sensitivityLabelModel.ColumnName,
}).ToList()
}));
}

internal void ModifySensitivityLabels(SensitivityClassificationModel model,
Action<SensitivityLabelModel> modifySensitivityLabel)
internal void SplitSensitivityLabelsIntoListsAndPatch(List<SensitivityLabelModel> sensitivityLabelsToModify,
Action<List<SensitivityLabelModel>> patchSensitivityLabels)
{
ConcurrentQueue<Exception> exceptions = new ConcurrentQueue<Exception>();
Parallel.ForEach<SensitivityLabelModel>(model.SensitivityLabels,
sensitivityLabelModel =>
Parallel.ForEach<List<SensitivityLabelModel>>(SplitList(sensitivityLabelsToModify),
sensitivityLabelsList =>
{
try
{
modifySensitivityLabel(sensitivityLabelModel);
patchSensitivityLabels(sensitivityLabelsList);
}
catch (Exception e)
{
Expand All @@ -86,28 +215,6 @@ internal void ModifySensitivityLabels(SensitivityClassificationModel model,
}
}

internal void RemoveSensitivityLabels(SqlDatabaseSensitivityClassificationModel model)
{
ModifySensitivityLabels(model, sensitivityLabelModel => Communicator.DeleteSensitivityLabel(
model.ResourceGroupName,
model.ServerName,
model.DatabaseName,
sensitivityLabelModel.SchemaName,
sensitivityLabelModel.TableName,
sensitivityLabelModel.ColumnName));
}

internal void RemoveManagedDatabaseSensitivityLabels(ManagedDatabaseSensitivityClassificationModel model)
{
ModifySensitivityLabels(model, sensitivityLabelModel => Communicator.DeleteManagedDatabaseSensitivityLabel(
model.ResourceGroupName,
model.InstanceName,
model.DatabaseName,
sensitivityLabelModel.SchemaName,
sensitivityLabelModel.TableName,
sensitivityLabelModel.ColumnName));
}

internal List<SensitivityLabelModel> GetCurrentSensitivityLabel(
string resourceGroupName, string serverName, string databaseName,
string schemaName, string tableName, string columnName)
Expand All @@ -119,7 +226,6 @@ internal List<SensitivityLabelModel> GetCurrentSensitivityLabel(
internal List<SensitivityLabelModel> GetCurrentSensitivityLabels(
string resourceGroupName, string serverName, string databaseName)
{
var n = Context.Environment.Name;
return ToSensitivityLabelModelList(Communicator.GetCurrentSensitivityLabels(resourceGroupName, serverName, databaseName));
}

Expand Down Expand Up @@ -160,50 +266,6 @@ internal async Task<InformationProtectionPolicy> RetrieveInformationProtectionPo
: InformationProtectionPolicy.DefaultInformationProtectionPolicy;
}

internal void EnableSensitivityRecommendations(SqlDatabaseSensitivityClassificationModel model)
{
ModifySensitivityLabels(model, sensitivityLabelModel => Communicator.EnableSensitivityRecommendation(
model.ResourceGroupName,
model.ServerName,
model.DatabaseName,
sensitivityLabelModel.SchemaName,
sensitivityLabelModel.TableName,
sensitivityLabelModel.ColumnName));
}

internal void DisableSensitivityRecommendations(SqlDatabaseSensitivityClassificationModel model)
{
ModifySensitivityLabels(model, sensitivityLabelModel => Communicator.DisableSensitivityRecommendation(
model.ResourceGroupName,
model.ServerName,
model.DatabaseName,
sensitivityLabelModel.SchemaName,
sensitivityLabelModel.TableName,
sensitivityLabelModel.ColumnName));
}

internal void EnableManagedDatabaseSensitivityRecommendations(ManagedDatabaseSensitivityClassificationModel model)
{
ModifySensitivityLabels(model, sensitivityLabelModel => Communicator.EnableManagedDatabaseSensitivityRecommendation(
model.ResourceGroupName,
model.InstanceName,
model.DatabaseName,
sensitivityLabelModel.SchemaName,
sensitivityLabelModel.TableName,
sensitivityLabelModel.ColumnName));
}

internal void DisableManagedDatabaseSensitivityRecommendations(ManagedDatabaseSensitivityClassificationModel model)
{
ModifySensitivityLabels(model, sensitivityLabelModel => Communicator.DisableManagedDatabaseSensitivityRecommendation(
model.ResourceGroupName,
model.InstanceName,
model.DatabaseName,
sensitivityLabelModel.SchemaName,
sensitivityLabelModel.TableName,
sensitivityLabelModel.ColumnName));
}

private List<SensitivityLabelModel> ToSensitivityLabelModelList(List<SensitivityLabel> sensitivityLabels)
{
return sensitivityLabels.Select(l => ToSensitivityLabelModel(l)).ToList();
Expand Down Expand Up @@ -297,5 +359,14 @@ private static string NullifyStringIfEmpty(string s)

return sensitivityLabelRank;
}

private static IEnumerable<List<T>> SplitList<T>(List<T> elements)
{
const int ListSize = 5000;
for (int i = 0; i < elements.Count; i += ListSize)
{
yield return elements.GetRange(i, Math.Min(ListSize, elements.Count - i));
}
}
}
}
Loading