• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

lucaslorentz / durabletask-extensions / 5836038789

pending completion
5836038789

push

github

lucaslorentz
Add husky and apply some code fixes

2502 of 2502 new or added lines in 91 files covered. (100.0%)

2295 of 2792 relevant lines covered (82.2%)

143.82 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

84.06
/src/LLL.DurableTask.EFCore.SqlServer/SqlServerOrchestrationDbContextExtensions.cs
1
using System;
2
using System.Data;
3
using System.Linq;
4
using System.Threading.Tasks;
5
using LLL.DurableTask.EFCore.Entities;
6
using Microsoft.EntityFrameworkCore;
7

8
namespace LLL.DurableTask.EFCore.SqlServer;
9

10
public class SqlServerOrchestrationDbContextExtensions : OrchestrationDbContextExtensions
11
{
12
    private const IsolationLevel TransactionIsolationLevel = IsolationLevel.ReadCommitted;
13

14
    public override async Task Migrate(OrchestrationDbContext dbContext)
15
    {
16
        await dbContext.Database.MigrateAsync();
17✔
17
    }
18

19
    public override async Task WithinTransaction(OrchestrationDbContext dbContext, Func<Task> action)
20
    {
21
        using var transaction = dbContext.Database.BeginTransaction(TransactionIsolationLevel);
250✔
22
        await action();
250✔
23

24
        await transaction.CommitAsync();
250✔
25
    }
26

27
    public override async Task<Instance> LockInstanceForUpdate(OrchestrationDbContext dbContext, string instanceId)
28
    {
29
        return (await dbContext.Instances.FromSqlRaw(@"
31✔
30
                SELECT * FROM Instances WITH (UPDLOCK)
31✔
31
                WHERE InstanceId = {0}
31✔
32
            ", instanceId).ToArrayAsync()).FirstOrDefault();
31✔
33
    }
34

35
    public override async Task<Instance> TryLockNextInstanceAsync(
36
        OrchestrationDbContext dbContext,
37
        TimeSpan lockTimeout)
38
    {
39
        var instance = (await dbContext.Instances.FromSqlRaw(@"
5✔
40
                    SELECT TOP 1 Instances.*
5✔
41
                    FROM OrchestrationMessages WITH (INDEX(IX_OrchestrationMessages_AvailableAt_Queue_InstanceId))
5✔
42
                        INNER JOIN Instances WITH (UPDLOCK, READPAST, INDEX(IX_Instances_InstanceId_LockedUntil))
5✔
43
                            ON OrchestrationMessages.InstanceId = Instances.InstanceId
5✔
44
                    WHERE
5✔
45
                        OrchestrationMessages.AvailableAt <= {0}
5✔
46
                        AND Instances.LockedUntil <= {0}
5✔
47
                ", DateTime.UtcNow).ToArrayAsync()).FirstOrDefault();
5✔
48

49
        if (instance == null)
5✔
50
            return null;
1✔
51

52
        instance.LockId = Guid.NewGuid().ToString();
4✔
53
        instance.LockedUntil = DateTime.UtcNow.Add(lockTimeout);
4✔
54
        await dbContext.SaveChangesAsync();
4✔
55

56
        return instance;
4✔
57
    }
58

59
    public override async Task<Instance> TryLockNextInstanceAsync(
60
        OrchestrationDbContext dbContext,
61
        string[] queues,
62
        TimeSpan lockTimeout)
63
    {
64
        var queuesParams = string.Join(",", queues.Select((_, i) => $"{{{i}}}"));
853✔
65
        var utcNowParam = $"{{{queues.Length}}}";
107✔
66
        var parameters = queues.Cast<object>().Concat(new object[] { DateTime.UtcNow }).ToArray();
107✔
67

68
        var instance = (await dbContext.Instances.FromSqlRaw($@"
107✔
69
                    SELECT TOP 1 Instances.*
107✔
70
                    FROM OrchestrationMessages WITH (INDEX(IX_OrchestrationMessages_AvailableAt_Queue_InstanceId))
107✔
71
                        INNER JOIN Instances WITH (UPDLOCK, READPAST, INDEX(IX_Instances_InstanceId_LockedUntil))
107✔
72
                            ON OrchestrationMessages.InstanceId = Instances.InstanceId
107✔
73
                    WHERE
107✔
74
                        OrchestrationMessages.AvailableAt <= {utcNowParam}
107✔
75
                        AND OrchestrationMessages.Queue IN ({queuesParams})
107✔
76
                        AND Instances.LockedUntil <= {utcNowParam}
107✔
77
                ", parameters).ToArrayAsync()).FirstOrDefault();
107✔
78

79
        if (instance == null)
107✔
80
            return null;
75✔
81

82
        instance.LockId = Guid.NewGuid().ToString();
32✔
83
        instance.LockedUntil = DateTime.UtcNow.Add(lockTimeout);
32✔
84
        await dbContext.SaveChangesAsync();
32✔
85

86
        return instance;
32✔
87
    }
88

89
    public override async Task<ActivityMessage> TryLockNextActivityMessageAsync(
90
        OrchestrationDbContext dbContext,
91
        TimeSpan lockTimeout)
92
    {
93
        var instance = (await dbContext.ActivityMessages.FromSqlRaw(@"
×
94
                    SELECT TOP 1 *
×
95
                    FROM ActivityMessages WITH (UPDLOCK, READPAST, INDEX(IX_ActivityMessages_LockedUntil_Queue))
×
96
                    WHERE LockedUntil <= {0}
×
97
                ", DateTime.UtcNow).ToArrayAsync()).FirstOrDefault();
×
98

99
        if (instance == null)
×
100
            return null;
×
101

102
        instance.LockId = Guid.NewGuid().ToString();
×
103
        instance.LockedUntil = DateTime.UtcNow.Add(lockTimeout);
×
104
        await dbContext.SaveChangesAsync();
×
105

106
        return instance;
×
107
    }
108

109
    public override async Task<ActivityMessage> TryLockNextActivityMessageAsync(
110
        OrchestrationDbContext dbContext,
111
        string[] queues,
112
        TimeSpan lockTimeout)
113
    {
114
        var queuesParams = string.Join(",", queues.Select((_, i) => $"{{{i}}}"));
364✔
115
        var utcNowParam = $"{{{queues.Length}}}";
91✔
116
        var parameters = queues.Cast<object>().Concat(new object[] { DateTime.UtcNow }).ToArray();
91✔
117

118
        var instance = (await dbContext.ActivityMessages.FromSqlRaw($@"
91✔
119
                SELECT TOP 1 *
91✔
120
                FROM ActivityMessages
91✔
121
                WITH (UPDLOCK, READPAST, INDEX(IX_ActivityMessages_LockedUntil_Queue))
91✔
122
                WHERE Queue IN ({queuesParams})
91✔
123
                    AND LockedUntil <= {utcNowParam}
91✔
124
            ", parameters).ToArrayAsync()).FirstOrDefault();
91✔
125

126
        if (instance == null)
91✔
127
            return null;
73✔
128

129
        instance.LockId = Guid.NewGuid().ToString();
18✔
130
        instance.LockedUntil = DateTime.UtcNow.Add(lockTimeout);
18✔
131
        await dbContext.SaveChangesAsync();
18✔
132

133
        return instance;
18✔
134
    }
135
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc