Skip to content

Commit 9381163

Browse files
committed
Implement WORKER directive.
1 parent 009c5b8 commit 9381163

6 files changed

Lines changed: 58 additions & 35 deletions

File tree

PSql.Deploy.Engine.Tests/Seeds/LoadedSeedTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ public void Seed_Get()
2929
public void Modules_Get()
3030
{
3131
var seed = new Seed("a", "b");
32-
var modules = ImmutableArray.Create(new SeedModule("c", false, default, default, default));
32+
var modules = ImmutableArray.Create(new SeedModule("c", 0, default, default, default));
3333

3434
var loadedSeed = new LoadedSeed(seed, modules);
3535

PSql.Deploy.Engine.Tests/Seeds/SeedApplicatorTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -251,7 +251,7 @@ private static SeedModule MakeModule(
251251

252252
return new(
253253
name,
254-
allWorkers,
254+
allWorkers ? -1 : 0, // workerId
255255
batches .ToImmutableArray(),
256256
provides.ToImmutableArray(),
257257
requires.ToImmutableArray()

PSql.Deploy.Engine.Tests/Seeds/SeedModuleTests.cs

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -11,34 +11,32 @@ public void Construct_NullName()
1111
{
1212
Should.Throw<ArgumentNullException>(() =>
1313
{
14-
_ = new SeedModule(null!, false, default, default, default);
14+
_ = new SeedModule(null!, 0, default, default, default);
1515
});
1616
}
1717

1818
[Test]
1919
public void Name_Get()
2020
{
21-
var module = new SeedModule("a", false, default, default, default);
21+
var module = new SeedModule("a", 0, default, default, default);
2222

2323
module.Name.ShouldBe("a");
2424
}
2525

2626
[Test]
27-
[TestCase(false)]
28-
[TestCase(true )]
29-
public void AllWorkers_Get(bool value)
27+
public void WorkerId_Get()
3028
{
31-
var module = new SeedModule("a", value, default, default, default);
29+
var module = new SeedModule("a", 3, default, default, default);
3230

33-
module.AllWorkers.ShouldBe(value);
31+
module.WorkerId.ShouldBe(3);
3432
}
3533

3634
[Test]
3735
public void Batches_Get()
3836
{
3937
var items = ImmutableArray.Create("b");
4038

41-
var module = new SeedModule("a", false, items, default, default);
39+
var module = new SeedModule("a", 0, items, default, default);
4240

4341
module.Batches.ShouldBe(items);
4442
}
@@ -48,7 +46,7 @@ public void Provides_Get()
4846
{
4947
var items = ImmutableArray.Create("b");
5048

51-
var module = new SeedModule("a", false, default, items, default);
49+
var module = new SeedModule("a", 0, default, items, default);
5250

5351
module.Provides.ShouldBe(items);
5452
}
@@ -58,7 +56,7 @@ public void Requires_Get()
5856
{
5957
var items = ImmutableArray.Create("b");
6058

61-
var module = new SeedModule("a", false, default, default, items);
59+
var module = new SeedModule("a", 0, default, default, items);
6260

6361
module.Requires.ShouldBe(items);
6462
}

PSql.Deploy.Engine/Seeds/SeedApplicator.cs

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -161,14 +161,28 @@ private void Populate(DependencyQueue<SeedModule> queue)
161161

162162
foreach (var module in Seed.Modules)
163163
{
164-
builder
165-
.NewEntry(module.Name, module)
166-
.AddProvides(module.Provides)
167-
.AddRequires(module.Requires)
168-
.Enqueue();
164+
if (module.WorkerId is -1)
165+
for (var i = 1; i <= MaxParallelism; i++)
166+
Populate(builder, Clone(module, workerId: i));
167+
else
168+
Populate(builder, module);
169169
}
170170
}
171171

172+
private static void Populate(DependencyQueueEntryBuilder<SeedModule> builder, SeedModule module)
173+
{
174+
builder
175+
.NewEntry(module.Name, module)
176+
.AddProvides(module.Provides)
177+
.AddRequires(module.Requires)
178+
.Enqueue();
179+
}
180+
181+
private static SeedModule Clone(SeedModule module, int workerId)
182+
{
183+
return new(module.Name, workerId, module.Batches, module.Provides, module.Requires);
184+
}
185+
172186
private void Validate(DependencyQueue<SeedModule> queue)
173187
{
174188
var errors = queue.Validate();
@@ -185,7 +199,11 @@ private async Task SeedWorkerMainAsync(QueueContext context)
185199

186200
await PrepareAsync(connection, context);
187201

188-
while (await context.GetNextEntryAsync() is { Value: var module })
202+
bool CanTake(SeedModule module)
203+
=> module.WorkerId == 0
204+
|| module.WorkerId == context.WorkerId;
205+
206+
while (await context.GetNextEntryAsync(CanTake) is { Value: var module })
189207
await ExecuteAsync(module, connection, context);
190208
}
191209

PSql.Deploy.Engine/Seeds/SeedLoader.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -205,7 +205,7 @@ private void EndModule()
205205
{
206206
_modules.Add(new(
207207
_moduleName,
208-
_allWorkers,
208+
_allWorkers ? -1 : 0, // workerId // TODO: constants or a custom struct
209209
_batches .ToImmutable(),
210210
_provides.ToImmutableArray(),
211211
_requires.ToImmutableArray()

PSql.Deploy.Engine/Seeds/SeedModule.cs

Lines changed: 23 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,12 @@ public class SeedModule
1414
/// <param name="name">
1515
/// The name of the module.
1616
/// </param>
17-
/// <param name="allWorkers">
18-
/// Whether the module should run on every worker thread in a seed
19-
/// application (<see langword="true"/>) or singly on any one available
20-
/// worker thread (<see langword="false"/>). The usual case is
21-
/// <see langword="false"/>.
17+
/// <param name="workerId">
18+
/// A value that determines which worker threads can apply the module.
19+
/// A positive value nominates a specific worker by that worker's ordinal
20+
/// ID. The default value, <c>0</c>, indicates that any worker can apply
21+
/// the module. The special value <c>-1</c> indicates that <b>every</b>
22+
/// worker must apply the module.
2223
/// </param>
2324
/// <param name="batches">
2425
/// The SQL batches to be executed when the module runs.
@@ -34,21 +35,26 @@ public class SeedModule
3435
/// <exception cref="ArgumentNullException">
3536
/// <paramref name="name"/> is <see langword="null"/>.
3637
/// </exception>
38+
/// <exception cref="ArgumentOutOfRangeException">
39+
/// <paramref name="workerId"/> is less than <c>-1</c>.
40+
/// </exception>
3741
public SeedModule(
3842
string name,
39-
bool allWorkers,
43+
int workerId,
4044
ImmutableArray<string> batches,
4145
ImmutableArray<string> provides,
4246
ImmutableArray<string> requires)
4347
{
4448
if (name is null)
4549
throw new ArgumentNullException(nameof(name));
50+
if (workerId < -1)
51+
throw new ArgumentOutOfRangeException(nameof(workerId));
4652

47-
Name = name;
48-
AllWorkers = allWorkers;
49-
Batches = batches;
50-
Provides = provides;
51-
Requires = requires;
53+
Name = name;
54+
WorkerId = workerId;
55+
Batches = batches;
56+
Provides = provides;
57+
Requires = requires;
5258
}
5359

5460
/// <summary>
@@ -57,12 +63,13 @@ public SeedModule(
5763
public string Name { get; }
5864

5965
/// <summary>
60-
/// Gets whether the module must run for each worker thread in a a seed
61-
/// application (<see langword="true"/>) or singly on any one available
62-
/// worker thread (<see langword="false"/>). The usual case is
63-
/// <see langword="false"/>.
66+
/// Gets a value that determines which worker threads can apply the
67+
/// module. A positive value nominates a specific worker by that
68+
/// worker's ordinal ID. The default value, <c>0</c>, indicates that any
69+
/// worker can apply the module. The special value <c>-1</c> indicates
70+
/// that <b>every</b> worker must apply the module.
6471
/// </summary>
65-
public bool AllWorkers { get; }
72+
public int WorkerId { get; }
6673

6774
/// <summary>
6875
/// Gets the SQL batches to be executed when the module runs.

0 commit comments

Comments
 (0)