Skip to content

Commit 483c539

Browse files
committed
Splits generated drop queries into smaller batches
Prevents huge batches
1 parent afc0cca commit 483c539

File tree

1 file changed

+46
-28
lines changed

1 file changed

+46
-28
lines changed

Orm/Xtensive.Orm/Orm/Upgrade/Internals/SqlWorker.cs

Lines changed: 46 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
// Copyright (C) 2012 Xtensive LLC.
2-
// All rights reserved.
3-
// For conditions of distribution and use, see license.
1+
// Copyright (C) 2012-2020 Xtensive LLC.
2+
// This code is distributed under MIT license terms.
3+
// See the License.txt file in the project root for more information.
44
// Created by: Denis Krjuchkov
55
// Created: 2012.03.15
66

@@ -25,13 +25,15 @@ private static SqlWorkerResult Run(UpgradeServiceAccessor services, SqlWorkerTas
2525
{
2626
var result = new SqlWorkerResult();
2727
var executor = new SqlExecutor(services.StorageDriver, services.Connection);
28-
if ((task & SqlWorkerTask.DropSchema) > 0)
28+
if ((task & SqlWorkerTask.DropSchema) > 0) {
2929
DropSchema(services, executor);
30-
if ((task & SqlWorkerTask.ExtractSchema) > 0)
30+
}
31+
if ((task & SqlWorkerTask.ExtractSchema) > 0) {
3132
result.Schema = ExtractSchema(services, executor);
32-
if ((task & (SqlWorkerTask.ExtractMetadataTypes | SqlWorkerTask.ExtractMetadataAssemblies | SqlWorkerTask.ExtractMetadataExtension)) > 0)
33+
}
34+
if ((task & (SqlWorkerTask.ExtractMetadataTypes | SqlWorkerTask.ExtractMetadataAssemblies | SqlWorkerTask.ExtractMetadataExtension)) > 0) {
3335
ExtractMetadata(services, executor, result, task);
34-
36+
}
3537
return result;
3638
}
3739

@@ -40,15 +42,19 @@ private static void ExtractMetadata(UpgradeServiceAccessor services, SqlExecutor
4042
var set = new MetadataSet();
4143
var mapping = new MetadataMapping(services.StorageDriver, services.NameBuilder);
4244
var metadataExtractor = new MetadataExtractor(mapping, executor);
43-
foreach (var metadataTask in services.MappingResolver.GetMetadataTasks()
44-
.Where(metadataTask => !ShouldSkipMetadataExtraction(mapping, result, metadataTask))) {
45+
var metadataTasks = services.MappingResolver.GetMetadataTasks()
46+
.Where(metadataTask => !ShouldSkipMetadataExtraction(mapping, result, metadataTask));
47+
foreach (var metadataTask in metadataTasks) {
4548
try {
46-
if (task.HasFlag(SqlWorkerTask.ExtractMetadataAssemblies))
49+
if (task.HasFlag(SqlWorkerTask.ExtractMetadataAssemblies)) {
4750
metadataExtractor.ExtractAssemblies(set, metadataTask);
48-
if (task.HasFlag(SqlWorkerTask.ExtractMetadataTypes))
51+
}
52+
if (task.HasFlag(SqlWorkerTask.ExtractMetadataTypes)) {
4953
metadataExtractor.ExtractTypes(set, metadataTask);
50-
if (task.HasFlag(SqlWorkerTask.ExtractMetadataExtension))
54+
}
55+
if (task.HasFlag(SqlWorkerTask.ExtractMetadataExtension)) {
5156
metadataExtractor.ExtractExtensions(set, metadataTask);
57+
}
5258
}
5359
catch (Exception exception) {
5460
UpgradeLog.Warning(Strings.LogFailedToExtractMetadataFromXYZ, metadataTask.Catalog, metadataTask.Schema, exception);
@@ -59,11 +65,12 @@ private static void ExtractMetadata(UpgradeServiceAccessor services, SqlExecutor
5965

6066
private static bool ShouldSkipMetadataExtraction(MetadataMapping mapping, SqlWorkerResult result, SqlExtractionTask task)
6167
{
62-
if (result.Schema==null)
68+
if (result.Schema == null) {
6369
return false;
70+
}
6471

6572
var tables = GetSchemaTables(result, task);
66-
return tables[mapping.Assembly]==null && tables[mapping.Type]==null && tables[mapping.Extension]==null;
73+
return tables[mapping.Assembly] == null && tables[mapping.Type] == null && tables[mapping.Extension] == null;
6774
}
6875

6976
private static PairedNodeCollection<Schema, Table> GetSchemaTables(SqlWorkerResult result, SqlExtractionTask task)
@@ -82,9 +89,9 @@ private static Catalog GetCatalog(SqlWorkerResult result, string catalogName)
8289

8390
private static Schema GetSchema(Catalog catalog, string schemaName)
8491
{
85-
if (schemaName.IsNullOrEmpty())
86-
return catalog.Schemas.Single(s => s.Name==schemaName);
87-
return catalog.Schemas[schemaName];
92+
return schemaName.IsNullOrEmpty()
93+
? catalog.Schemas.Single(s => s.Name == schemaName)
94+
: catalog.Schemas[schemaName];
8895
}
8996

9097
private static SchemaExtractionResult ExtractSchema(UpgradeServiceAccessor services, ISqlExecutor executor)
@@ -97,8 +104,8 @@ private static void DropSchema(UpgradeServiceAccessor services, ISqlExecutor exe
97104
{
98105
var driver = services.StorageDriver;
99106
var extractionResult = ExtractSchema(services, executor);
100-
var schemas = extractionResult.Catalogs.SelectMany(c => c.Schemas).ToList();
101-
var tables = schemas.SelectMany(s => s.Tables).ToList();
107+
var schemas = extractionResult.Catalogs.SelectMany(c => c.Schemas).ToChainedBuffer();
108+
var tables = schemas.SelectMany(s => s.Tables).ToChainedBuffer();
102109
var sequences = schemas.SelectMany(s => s.Sequences);
103110

104111
DropForeignKeys(driver, tables, executor);
@@ -108,27 +115,38 @@ private static void DropSchema(UpgradeServiceAccessor services, ISqlExecutor exe
108115

109116
private static void DropSequences(StorageDriver driver, IEnumerable<Sequence> sequences, ISqlExecutor executor)
110117
{
111-
var statements = sequences
112-
.Select(s => driver.Compile(SqlDdl.Drop(s)).GetCommandText())
113-
.ToList();
118+
var statements = BreakEvery(sequences
119+
.Select(s => driver.Compile(SqlDdl.Drop(s)).GetCommandText()), 25).ToChainedBuffer();
114120
executor.ExecuteMany(statements);
115121
}
116122

117123
private static void DropTables(StorageDriver driver, IEnumerable<Table> tables, ISqlExecutor executor)
118124
{
119-
var statements = tables
120-
.Select(t => driver.Compile(SqlDdl.Drop(t)).GetCommandText())
121-
.ToList();
125+
var statements = BreakEvery(tables
126+
.Select(t => driver.Compile(SqlDdl.Drop(t)).GetCommandText()), 25);
122127
executor.ExecuteMany(statements);
123128
}
124129

125130
private static void DropForeignKeys(StorageDriver driver, IEnumerable<Table> tables, ISqlExecutor executor)
126131
{
127-
var statements = tables
132+
var statements = BreakEvery(tables
128133
.SelectMany(t => t.TableConstraints.OfType<ForeignKey>())
129-
.Select(fk => driver.Compile(SqlDdl.Alter(fk.Table, SqlDdl.DropConstraint(fk))).GetCommandText())
130-
.ToList();
134+
.Select(fk => driver.Compile(SqlDdl.Alter(fk.Table, SqlDdl.DropConstraint(fk))).GetCommandText()), 25);
131135
executor.ExecuteMany(statements);
132136
}
137+
138+
private static IEnumerable<TItem> BreakEvery<TItem>(IEnumerable<TItem> source, int breakOnCount)
139+
where TItem : class
140+
{
141+
var count = 0;
142+
foreach(var item in source) {
143+
count++;
144+
if (count == breakOnCount) {
145+
yield return default(TItem);
146+
count = 0;
147+
}
148+
yield return item;
149+
}
150+
}
133151
}
134152
}

0 commit comments

Comments
 (0)