Skip to content
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
2 changes: 1 addition & 1 deletion Cleipnir.ResilientFunctions
Submodule Cleipnir.ResilientFunctions updated 86 files
+33 −1 .claude/settings.local.json
+4 −1 .gitignore
+1 −6 Core/Cleipnir.ResilientFunctions.Tests/InMemoryTests/RFunctionTests/DelayedStartUpTests.cs
+0 −7 Core/Cleipnir.ResilientFunctions.Tests/InMemoryTests/ShutdownCoordinationTests/RFunctionsShutdownTests.cs
+4 −4 Core/Cleipnir.ResilientFunctions.Tests/InMemoryTests/StoreTests.cs
+0 −4 Core/Cleipnir.ResilientFunctions.Tests/Messaging/InMemoryTests/MessageStoreTests.cs
+6 −102 Core/Cleipnir.ResilientFunctions.Tests/Messaging/TestTemplates/MessageStoreTests.cs
+7 −8 Core/Cleipnir.ResilientFunctions.Tests/Messaging/TestTemplates/MessagesSubscriptionTests.cs
+41 −293 Core/Cleipnir.ResilientFunctions.Tests/Messaging/TestTemplates/MessagesTests.cs
+2 −2 Core/Cleipnir.ResilientFunctions.Tests/TestSetup.cs
+3 −21 Core/Cleipnir.ResilientFunctions.Tests/TestTemplates/EffectStoreTests.cs
+1 −4 Core/Cleipnir.ResilientFunctions.Tests/TestTemplates/FunctionTests/CrashedTests.cs
+0 −4 Core/Cleipnir.ResilientFunctions.Tests/TestTemplates/FunctionTests/DoubleInvocationTests.cs
+70 −21 Core/Cleipnir.ResilientFunctions.Tests/TestTemplates/FunctionTests/EffectTests.cs
+2 −8 Core/Cleipnir.ResilientFunctions.Tests/TestTemplates/FunctionTests/FailedTests.cs
+0 −12 Core/Cleipnir.ResilientFunctions.Tests/TestTemplates/FunctionTests/PostponedTests.cs
+0 −5 Core/Cleipnir.ResilientFunctions.Tests/TestTemplates/FunctionTests/ReInvocationTests.cs
+0 −2 Core/Cleipnir.ResilientFunctions.Tests/TestTemplates/FunctionTests/ScheduleReInvocationTests.cs
+5 −5 Core/Cleipnir.ResilientFunctions.Tests/TestTemplates/FunctionTests/SunshineTests.cs
+3 −26 Core/Cleipnir.ResilientFunctions.Tests/TestTemplates/StoreCrudTests.cs
+28 −157 Core/Cleipnir.ResilientFunctions.Tests/TestTemplates/StoreTests.cs
+0 −2 Core/Cleipnir.ResilientFunctions.Tests/TestTemplates/WatchDogsTests/CrashableFunctionStore.cs
+4 −8 Core/Cleipnir.ResilientFunctions.Tests/TestTemplates/WatchDogsTests/InitialInvocationFailedTests.cs
+2 −4 Core/Cleipnir.ResilientFunctions.Tests/TestTemplates/WatchDogsTests/ReplicaWatchdogTests.cs
+0 −10 Core/Cleipnir.ResilientFunctions.Tests/TestTemplates/WatchDogsTests/WatchdogCompoundTests.cs
+11 −10 Core/Cleipnir.ResilientFunctions.Tests/UtilsTests/PrintEffectsTests.cs
+40 −12 Core/Cleipnir.ResilientFunctions/CoreRuntime/FlowState.cs
+5 −41 Core/Cleipnir.ResilientFunctions/CoreRuntime/FlowTimeouts.cs
+28 −48 Core/Cleipnir.ResilientFunctions/CoreRuntime/FlowsManager.cs
+5 −6 Core/Cleipnir.ResilientFunctions/CoreRuntime/Invocation/InvocationHelper.cs
+14 −14 Core/Cleipnir.ResilientFunctions/CoreRuntime/Invocation/Invoker.cs
+0 −6 Core/Cleipnir.ResilientFunctions/CoreRuntime/Invocation/Restart.cs
+0 −6 Core/Cleipnir.ResilientFunctions/CoreRuntime/Invocation/ScheduleReInvocation.cs
+17 −14 Core/Cleipnir.ResilientFunctions/CoreRuntime/Invocation/Workflow.cs
+1 −5 Core/Cleipnir.ResilientFunctions/CoreRuntime/Serialization/DeserializationException.cs
+0 −5 Core/Cleipnir.ResilientFunctions/CoreRuntime/Serialization/TypeAndJsonElement.cs
+76 −0 Core/Cleipnir.ResilientFunctions/CoreRuntime/Watchdogs/InterruptedWatchdog.cs
+17 −3 Core/Cleipnir.ResilientFunctions/Domain/Effect.cs
+1 −1 Core/Cleipnir.ResilientFunctions/Domain/EffectPrinter.cs
+4 −1 Core/Cleipnir.ResilientFunctions/Domain/EffectResult.cs
+10 −31 Core/Cleipnir.ResilientFunctions/Domain/EffectResults.cs
+1 −1 Core/Cleipnir.ResilientFunctions/Domain/InitialState.cs
+11 −4 Core/Cleipnir.ResilientFunctions/Domain/RetryPolicy.cs
+1 −7 Core/Cleipnir.ResilientFunctions/Domain/Settings.cs
+15 −3 Core/Cleipnir.ResilientFunctions/FunctionsRegistry.cs
+0 −31 Core/Cleipnir.ResilientFunctions/Helpers/AsyncSignal.cs
+8 −0 Core/Cleipnir.ResilientFunctions/Helpers/ForeverTask.cs
+23 −8 Core/Cleipnir.ResilientFunctions/Helpers/TypeHelper.cs
+0 −2 Core/Cleipnir.ResilientFunctions/Messaging/IMessageStore.cs
+0 −1 Core/Cleipnir.ResilientFunctions/Messaging/StoredMessage.cs
+0 −264 Core/Cleipnir.ResilientFunctions/Queuing/FetchedMessages.cs
+0 −26 Core/Cleipnir.ResilientFunctions/Queuing/QueueBuilder.cs
+13 −13 Core/Cleipnir.ResilientFunctions/Queuing/QueueClient.cs
+220 −56 Core/Cleipnir.ResilientFunctions/Queuing/QueueManager.cs
+0 −16 Core/Cleipnir.ResilientFunctions/Storage/Base64.cs
+0 −18 Core/Cleipnir.ResilientFunctions/Storage/Helpers.cs
+1 −2 Core/Cleipnir.ResilientFunctions/Storage/IFunctionStore.cs
+5 −29 Core/Cleipnir.ResilientFunctions/Storage/InMemoryFunctionStore.cs
+0 −12 Core/Cleipnir.ResilientFunctions/Storage/Utils/JsonHelper.cs
+0 −0 Docs/Wip/EffectAbstractionNotes.md
+0 −1 Samples/Sample.ConsoleApp/Simple/ElevatorPitchExample.cs
+1 −1 Samples/Sample.ConsoleApp/Ticking/TickExample.cs
+0 −2 Samples/Sample.ConsoleApp/Utils/CrashableFunctionStore.cs
+2 −8 Samples/Sample.ConsoleApp/Versioning/BrandExample.cs
+2 −8 Samples/Sample.ConsoleApp/Versioning/PaymentProviderExample.cs
+1 −2 Samples/Sample.OrderProcessing/Program.cs
+0 −4 Stores/MariaDB/Cleipnir.ResilientFunctions.MariaDB.Tests/Messaging/MessageStoreTests.cs
+4 −4 Stores/MariaDB/Cleipnir.ResilientFunctions.MariaDB.Tests/StoreTests.cs
+4 −5 Stores/MariaDB/Cleipnir.ResilientFunctions.MariaDB/MariaDbFunctionStore.cs
+28 −160 Stores/MariaDB/Cleipnir.ResilientFunctions.MariaDB/MariaDbMessageStore.cs
+8 −8 Stores/MariaDB/Cleipnir.ResilientFunctions.MariaDB/SqlGenerator.cs
+0 −4 Stores/PostgreSQL/Cleipnir.ResilientFunctions.PostgreSQL.Tests/Messaging/MessageStoreTests.cs
+4 −4 Stores/PostgreSQL/Cleipnir.ResilientFunctions.PostgreSQL.Tests/StoreTests.cs
+1 −4 Stores/PostgreSQL/Cleipnir.ResilientFunctions.PostgreSQL/PostgreSqlFunctionStore.cs
+14 −96 Stores/PostgreSQL/Cleipnir.ResilientFunctions.PostgreSQL/PostgreSqlMessageStore.cs
+40 −10 Stores/PostgreSQL/Cleipnir.ResilientFunctions.PostgreSQL/SqlGenerator.cs
+0 −4 Stores/SqlServer/Cleipnir.ResilientFunctions.SqlServer.Tests/Messaging/MessageStoreTests.cs
+4 −4 Stores/SqlServer/Cleipnir.ResilientFunctions.SqlServer.Tests/StoreTests.cs
+7 −7 Stores/SqlServer/Cleipnir.ResilientFunctions.SqlServer/SqlGenerator.cs
+1 −3 Stores/SqlServer/Cleipnir.ResilientFunctions.SqlServer/SqlServerFunctionStore.cs
+8 −61 Stores/SqlServer/Cleipnir.ResilientFunctions.SqlServer/SqlServerMessageStore.cs
+0 −2 Stores/StressTests/StressTests/CrashedTest.cs
+2 −3 Stores/StressTests/StressTests/DirectInvocationTest.cs
+1 −1 Stores/StressTests/StressTests/LongRunningStressfulTest.cs
+0 −1 Stores/StressTests/StressTests/PostponedTest.cs
+1 −1 Stores/StressTests/StressTests/RestartSuspensionTest.cs
2 changes: 1 addition & 1 deletion Cleipnir.Tests/Flows/FunctionRegistrationTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ await flows.Run(
param: "SomeParam",
new InitialState(
[new MessageAndIdempotencyKey(new StringMessage("InitialMessageValue"))],
[new InitialEffect(0, "InitialEffectValue")]
[new InitialEffect(0.ToEffectId(), "InitialEffectValue")]
)
);

Expand Down
2 changes: 1 addition & 1 deletion Cleipnir.Tests/Flows/ParamlessFlowsTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -158,7 +158,7 @@ await flows.Run(
"SomeInstanceId",
new InitialState(
[new MessageAndIdempotencyKey(new StringMessage("InitialMessageValue"))],
[new InitialEffect(0, "InitialEffectValue")]
[new InitialEffect(0.ToEffectId(), "InitialEffectValue")]
)
);

Expand Down
2 changes: 1 addition & 1 deletion Cleipnir.Tests/Flows/UnitFlowsTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -265,7 +265,7 @@ await flows.Run(
param: "SomeParam",
new InitialState(
[new MessageAndIdempotencyKey(new StringMessage("InitialMessageValue"))],
[new InitialEffect(0, "InitialEffectValue")]
[new InitialEffect(0.ToEffectId(), "InitialEffectValue")]
)
);

Expand Down
21 changes: 11 additions & 10 deletions Cleipnir/FlowsContainer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -27,16 +27,17 @@ public FlowsContainer(IFunctionStore flowStore, IServiceProvider serviceProvider
var logger = serviceProvider.GetRequiredService<ILogger>();
options = new Options(
unhandledExceptionHandler: ex => logger.LogError(ex, "Unhandled exception in Cleipnir"),
options.RetentionPeriod,
options.RetentionCleanUpFrequency,
options.LeaseLength,
options.EnableWatchdogs,
options.WatchdogCheckFrequency,
options.MessagesPullFrequency,
options.MessagesDefaultMaxWaitForCompletion,
options.DelayStartup,
options.MaxParallelRetryInvocations,
options.Serializer
retentionPeriod: options.RetentionPeriod,
retentionCleanUpFrequency: options.RetentionCleanUpFrequency,
enableWatchdogs: options.EnableWatchdogs,
watchdogCheckFrequency: options.WatchdogCheckFrequency,
messagesPullFrequency: options.MessagesPullFrequency,
messagesDefaultMaxWaitForCompletion: options.MessagesDefaultMaxWaitForCompletion,
delayStartup: options.DelayStartup,
maxParallelRetryInvocations: options.MaxParallelRetryInvocations,
serializer: options.Serializer,
utcNow: options.UtcNow,
replicaHeartbeatFrequency: options.ReplicaHeartbeatFrequency
);
}

Expand Down
39 changes: 20 additions & 19 deletions Cleipnir/Options.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@ public class Options
internal Action<FrameworkException>? UnhandledExceptionHandler { get; }
internal TimeSpan? RetentionPeriod { get; }
internal TimeSpan? RetentionCleanUpFrequency { get; }
internal TimeSpan? LeaseLength { get; }
internal bool? EnableWatchdogs { get; }
internal TimeSpan? WatchdogCheckFrequency { get; }
internal TimeSpan? DelayStartup { get; }
Expand All @@ -22,14 +21,14 @@ public class Options
internal TimeSpan? MessagesDefaultMaxWaitForCompletion { get; }
internal ISerializer? Serializer { get; }
internal UtcNow? UtcNow { get; }
internal TimeSpan? ReplicaHeartbeatFrequency { get; }

/// <summary>
/// Configuration options for Cleipnir
/// </summary>
/// <param name="unhandledExceptionHandler">Callback handler for unhandled flow exceptions</param>
/// <param name="retentionPeriod">Period to keep completed flows before deletion. Default infinite.</param>
/// <param name="retentionCleanUpFrequency">Retention clean-up check frequency. Default 1 hour when retention period is not infinite.</param>
/// <param name="leaseLength">Flow lease-length. Leases are automatically renewed. Default 60 seconds.</param>
/// <param name="enableWatchdogs">Enable background crashed, interrupted and postponed flow scheduling. Default true.</param>
/// <param name="watchdogCheckFrequency">Check frequency for eligible crashed, interrupted and postponed flows. Default 1 second.</param>
/// <param name="messagesPullFrequency">Pull frequency for active/max-waiting messages. Default: 250ms</param>
Expand All @@ -38,24 +37,24 @@ public class Options
/// <param name="maxParallelRetryInvocations">Limit the number of watchdog started invocations. Default: 100.</param>
/// <param name="serializer">Specify custom serializer. Default built-in json-serializer.</param>
/// <param name="utcNow">Provide custom delegate for providing current utc datetime. Default: () => DateTime.UtcNow</param>
/// <param name="replicaHeartbeatFrequency">Heartbeat frequency for replica liveness detection. Default 1 second.</param>
public Options(
Action<FrameworkException>? unhandledExceptionHandler = null,
TimeSpan? retentionPeriod = null,
TimeSpan? retentionCleanUpFrequency = null,
TimeSpan? leaseLength = null,
bool? enableWatchdogs = null,
TimeSpan? watchdogCheckFrequency = null,
TimeSpan? messagesPullFrequency = null,
TimeSpan? messagesDefaultMaxWaitForCompletion = null,
TimeSpan? delayStartup = null,
int? maxParallelRetryInvocations = null,
ISerializer? serializer = null,
UtcNow? utcNow = null
UtcNow? utcNow = null,
TimeSpan? replicaHeartbeatFrequency = null
)
{
UnhandledExceptionHandler = unhandledExceptionHandler;
WatchdogCheckFrequency = watchdogCheckFrequency;
LeaseLength = leaseLength;
RetentionPeriod = retentionPeriod;
RetentionCleanUpFrequency = retentionCleanUpFrequency;
EnableWatchdogs = enableWatchdogs;
Expand All @@ -65,6 +64,7 @@ public Options(
MaxParallelRetryInvocations = maxParallelRetryInvocations;
Serializer = serializer;
UtcNow = utcNow;
ReplicaHeartbeatFrequency = replicaHeartbeatFrequency;
}

public Options Merge(Options options)
Expand All @@ -73,30 +73,31 @@ public Options Merge(Options options)
UnhandledExceptionHandler ?? options.UnhandledExceptionHandler,
RetentionPeriod ?? options.RetentionPeriod,
RetentionCleanUpFrequency ?? options.RetentionCleanUpFrequency,
LeaseLength ?? options.LeaseLength,
EnableWatchdogs ?? options.EnableWatchdogs,
WatchdogCheckFrequency ?? options.WatchdogCheckFrequency,
MessagesPullFrequency ?? options.MessagesPullFrequency,
MessagesDefaultMaxWaitForCompletion ?? options.MessagesDefaultMaxWaitForCompletion,
DelayStartup ?? options.DelayStartup,
MaxParallelRetryInvocations ?? options.MaxParallelRetryInvocations,
Serializer ?? options.Serializer
Serializer ?? options.Serializer,
UtcNow ?? options.UtcNow,
ReplicaHeartbeatFrequency ?? options.ReplicaHeartbeatFrequency
);
}

internal Settings MapToSettings()
=> new(
UnhandledExceptionHandler,
RetentionPeriod,
RetentionCleanUpFrequency,
LeaseLength,
EnableWatchdogs,
WatchdogCheckFrequency,
MessagesPullFrequency,
MessagesDefaultMaxWaitForCompletion,
DelayStartup,
MaxParallelRetryInvocations,
Serializer,
UtcNow
unhandledExceptionHandler: UnhandledExceptionHandler,
retentionPeriod: RetentionPeriod,
retentionCleanUpFrequency: RetentionCleanUpFrequency,
enableWatchdogs: EnableWatchdogs,
watchdogCheckFrequency: WatchdogCheckFrequency,
messagesPullFrequency: MessagesPullFrequency,
messagesDefaultMaxWaitForCompletion: MessagesDefaultMaxWaitForCompletion,
delayStartup: DelayStartup,
maxParallelRetryInvocations: MaxParallelRetryInvocations,
serializer: Serializer,
utcNow: UtcNow,
replicaHeartbeatFrequency: ReplicaHeartbeatFrequency
);
}
2 changes: 1 addition & 1 deletion Samples/Cleipnir.Sample.AspNet/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ private static async Task Main(string[] args)
await DatabaseHelper.CreateDatabaseIfNotExists(connectionString); //use to create db initially or clean existing state in database
builder.Services.AddFlows(c => c
.UsePostgresStore(connectionString)
.WithOptions(new Options(leaseLength: TimeSpan.FromSeconds(5)))
.WithOptions(new Options(replicaHeartbeatFrequency: TimeSpan.FromSeconds(5)))
.RegisterFlow<OrderFlow, Order>()
);

Expand Down
2 changes: 1 addition & 1 deletion Samples/Cleipnir.Sample.Presentation.AspNet/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ private static async Task Main(string[] args)
//await DatabaseHelper.RecreateDatabase(connectionString);
builder.Services.AddFlows(c => c
.UsePostgresStore(connectionString)
.WithOptions(new Options(leaseLength: TimeSpan.FromSeconds(5), messagesDefaultMaxWaitForCompletion: TimeSpan.MaxValue))
.WithOptions(new Options(replicaHeartbeatFrequency: TimeSpan.FromSeconds(5), messagesDefaultMaxWaitForCompletion: TimeSpan.MaxValue))
.RegisterFlow<OrderFlow, Order>()
.RegisterFlow<BatchOrderFlow, List<Order>>()
.RegisterFlow<SingleOrderFlow, Order, TransactionIdAndTrackAndTrace>()
Expand Down