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

Mongodb implementation #4127

Merged
merged 31 commits into from
Jun 28, 2023
Merged

Mongodb implementation #4127

merged 31 commits into from
Jun 28, 2023

Conversation

gurkanguran
Copy link
Contributor

No description provided.

src/bundles/Elsa.WorkflowServer.Web/appsettings.json Outdated Show resolved Hide resolved
src/bundles/Elsa.WorkflowServer.Web/Program.cs Outdated Show resolved Hide resolved
src/modules/Elsa.MongoDB/Common/MongoStore.cs Outdated Show resolved Hide resolved
src/modules/Elsa.MongoDB/Common/PersistenceFeatureBase.cs Outdated Show resolved Hide resolved
src/modules/Elsa.MongoDB/Features/MongoDbFeature.cs Outdated Show resolved Hide resolved
src/modules/Elsa.MongoDB/Features/MongoDbFeature.cs Outdated Show resolved Hide resolved
src/modules/Elsa.MongoDB/Features/MongoDbFeature.cs Outdated Show resolved Hide resolved
src/modules/Elsa.MongoDB/Features/MongoDbFeature.cs Outdated Show resolved Hide resolved
src/modules/Elsa.MongoDB/Features/MongoDbFeature.cs Outdated Show resolved Hide resolved
src/modules/Elsa.MongoDB/HostedServices/CreateIndices.cs Outdated Show resolved Hide resolved
@sfmskywalker
Copy link
Member

When I try and create a workflow and add a variable, an exception occurs:

System.FormatException: An error occurred while deserializing the Variables property of class Elsa.Workflows.Management.Entities.WorkflowDefinition: An error occurred while deserializing the StorageDriverType property of class Elsa.Workflows.Core.Models.Variable: Exception has been thrown by the target of an invocation.
       ---> System.FormatException: An error occurred while deserializing the StorageDriverType property of class Elsa.Workflows.Core.Models.Variable: Exception has been thrown by the target of an invocation.
       ---> System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation.
       ---> System.NotSupportedException: Specified method is not supported.
         at System.RuntimeType..ctor()
         at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor)
         at System.Reflection.ConstructorInvoker.Invoke(Object obj, IntPtr* args, BindingFlags invokeAttr)
         --- End of inner exception stack trace ---
         at System.Reflection.ConstructorInvoker.Invoke(Object obj, IntPtr* args, BindingFlags invokeAttr)
         at System.Reflection.RuntimeConstructorInfo.Invoke(BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
         at MongoDB.Bson.Serialization.BsonClassMap.<>c__DisplayClass118_0.<GetCreator>b__1()
         at MongoDB.Bson.Serialization.BsonClassMap.CreateInstance()
         at MongoDB.Bson.Serialization.BsonClassMapSerializer`1.DeserializeClass(BsonDeserializationContext context)
         at MongoDB.Bson.Serialization.BsonClassMapSerializer`1.Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args)
         at MongoDB.Bson.Serialization.Serializers.SerializerBase`1.MongoDB.Bson.Serialization.IBsonSerializer.Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args)
         at MongoDB.Bson.Serialization.IBsonSerializerExtensions.Deserialize(IBsonSerializer serializer, BsonDeserializationContext context)
         at MongoDB.Bson.Serialization.BsonClassMapSerializer`1.Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args)
         at MongoDB.Bson.Serialization.Serializers.SerializerBase`1.MongoDB.Bson.Serialization.IBsonSerializer.Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args)
         at MongoDB.Bson.Serialization.IBsonSerializerExtensions.Deserialize(IBsonSerializer serializer, BsonDeserializationContext context)
         at MongoDB.Bson.Serialization.BsonClassMapSerializer`1.DeserializeMemberValue(BsonDeserializationContext context, BsonMemberMap memberMap)
         --- End of inner exception stack trace ---
         at MongoDB.Bson.Serialization.BsonClassMapSerializer`1.DeserializeMemberValue(BsonDeserializationContext context, BsonMemberMap memberMap)
         at MongoDB.Bson.Serialization.BsonClassMapSerializer`1.DeserializeClass(BsonDeserializationContext context)
         at MongoDB.Bson.Serialization.BsonClassMapSerializer`1.Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args)
         at MongoDB.Bson.Serialization.Serializers.SerializerBase`1.MongoDB.Bson.Serialization.IBsonSerializer.Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args)
         at MongoDB.Bson.Serialization.IBsonSerializerExtensions.Deserialize(IBsonSerializer serializer, BsonDeserializationContext context)
         at MongoDB.Bson.Serialization.BsonClassMapSerializer`1.Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args)
         at MongoDB.Bson.Serialization.IBsonSerializerExtensions.Deserialize[TValue](IBsonSerializer`1 serializer, BsonDeserializationContext context)
         at MongoDB.Bson.Serialization.Serializers.IEnumerableDeserializingAsCollectionSerializer`3.Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args)
         at MongoDB.Bson.Serialization.Serializers.SerializerBase`1.MongoDB.Bson.Serialization.IBsonSerializer.Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args)
         at MongoDB.Bson.Serialization.IBsonSerializerExtensions.Deserialize(IBsonSerializer serializer, BsonDeserializationContext context)
         at MongoDB.Bson.Serialization.BsonClassMapSerializer`1.DeserializeMemberValue(BsonDeserializationContext context, BsonMemberMap memberMap)
         --- End of inner exception stack trace ---
         at MongoDB.Bson.Serialization.BsonClassMapSerializer`1.DeserializeMemberValue(BsonDeserializationContext context, BsonMemberMap memberMap)
         at MongoDB.Bson.Serialization.BsonClassMapSerializer`1.DeserializeClass(BsonDeserializationContext context)
         at MongoDB.Bson.Serialization.BsonClassMapSerializer`1.Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args)
         at MongoDB.Bson.Serialization.IBsonSerializerExtensions.Deserialize[TValue](IBsonSerializer`1 serializer, BsonDeserializationContext context)
         at MongoDB.Driver.Core.Operations.ElementDeserializer`1.Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args)
         at MongoDB.Bson.Serialization.IBsonSerializerExtensions.Deserialize[TValue](IBsonSerializer`1 serializer, BsonDeserializationContext context)
         at MongoDB.Driver.Core.Operations.FindAndModifyValueDeserializer`1.Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args)
         at MongoDB.Bson.Serialization.IBsonSerializerExtensions.Deserialize[TValue](IBsonSerializer`1 serializer, BsonDeserializationContext context)
         at MongoDB.Driver.Core.Operations.FindAndModifyOperationBase`1.ProcessCommandResult(ConnectionId connectionId, RawBsonDocument rawBsonDocument)
         at MongoDB.Driver.Core.Operations.FindAndModifyOperationBase`1.ExecuteAttemptAsync(RetryableWriteContext context, Int32 attempt, Nullable`1 transactionNumber, CancellationToken cancellationToken)
         at MongoDB.Driver.Core.Operations.RetryableWriteOperationExecutor.ExecuteAsync[TResult](IRetryableWriteOperation`1 operation, RetryableWriteContext context, CancellationToken cancellationToken)
         at MongoDB.Driver.Core.Operations.RetryableWriteOperationExecutor.ExecuteAsync[TResult](IRetryableWriteOperation`1 operation, IWriteBinding binding, Boolean retryRequested, CancellationToken cancellationToken)
         at MongoDB.Driver.OperationExecutor.ExecuteWriteOperationAsync[TResult](IWriteBinding binding, IWriteOperation`1 operation, CancellationToken cancellationToken)
         at MongoDB.Driver.MongoCollectionImpl`1.ExecuteWriteOperationAsync[TResult](IClientSessionHandle session, IWriteOperation`1 operation, CancellationToken cancellationToken)
         at MongoDB.Driver.MongoCollectionImpl`1.UsingImplicitSessionAsync[TResult](Func`2 funcAsync, CancellationToken cancellationToken)
         at Elsa.MongoDB.Common.MongoStore`1.SaveAsync(TDocument document, CancellationToken cancellationToken) in /Users/sipke/Projects/Elsa/elsa-core/v3/src/modules/Elsa.MongoDB/Common/MongoStore.cs:line 57
         at Elsa.MongoDB.Modules.Management.MongoWorkflowDefinitionStore.SaveAsync(WorkflowDefinition definition, CancellationToken cancellationToken) in /Users/sipke/Projects/Elsa/elsa-core/v3/src/modules/Elsa.MongoDB/Modules/Management/WorkflowDefinitionStore.cs:line 110
         at Elsa.Workflows.Management.Services.WorkflowDefinitionPublisher.SaveDraftAsync(WorkflowDefinition definition, CancellationToken cancellationToken) in /Users/sipke/Projects/Elsa/elsa-core/v3/src/modules/Elsa.Workflows.Management/Services/WorkflowDefinitionPublisher.cs:line 164
         at Elsa.Workflows.Api.Endpoints.WorkflowDefinitions.Post.Post.HandleAsync(SaveWorkflowDefinitionRequest request, CancellationToken cancellationToken) in /Users/sipke/Projects/Elsa/elsa-core/v3/src/modules/Elsa.Workflows.Api/Endpoints/WorkflowDefinitions/Post/Endpoint.cs:line 93
         at Elsa.Workflows.Api.Endpoints.WorkflowDefinitions.Post.Post.HandleAsync(SaveWorkflowDefinitionRequest request, CancellationToken cancellationToken) in /Users/sipke/Projects/Elsa/elsa-core/v3/src/modules/Elsa.Workflows.Api/Endpoints/WorkflowDefinitions/Post/Endpoint.cs:line 102
         at FastEndpoints.Endpoint`2.ExecAsync(CancellationToken ct)
         at FastEndpoints.Endpoint`2.ExecAsync(CancellationToken ct)
         at Microsoft.AspNetCore.Routing.EndpointMiddleware.<Invoke>g__AwaitRequestTask|6_0(Endpoint endpoint, Task requestTask, ILogger logger)
         at Elsa.Http.Middleware.WorkflowsMiddleware.InvokeAsync(HttpContext httpContext) in /Users/sipke/Projects/Elsa/elsa-core/v3/src/modules/Elsa.Http/Middleware/WorkflowsMiddleware.cs:line 83
         at Elsa.Workflows.Api.Middleware.JsonSerializationErrorHandlerMiddleware.InvokeAsync(HttpContext httpContext) in /Users/sipke/Projects/Elsa/elsa-core/v3/src/modules/Elsa.Workflows.Api/Middleware/JsonSerializationErrorHandlerMiddleware.cs:line 27
         at Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext context)
         at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context)
         at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddlewareImpl.Invoke(HttpContext context)

image

Steps to reproduce:

  1. Create a new workflow using the designer.
  2. Add a variable.

After a second or so, the designer will make an API call to the backend to persist the changes, after which the error occurs.

@sfmskywalker
Copy link
Member

When I update the Elsa.WorkflowServer.Web reference app to use EntityFrameworkCore instead of MongoDB, I get the following exception when the app starts:

System.InvalidOperationException: The property 'Bookmark.Payload' could not be mapped because it is of type 'object', which is not a supported primitive type or a valid entity type. Either explicitly map this property, or ignore it using the '[NotMapped]' attribute or by using 'EntityTypeBuilder.Ignore' in 'OnModelCreating'.
   at Microsoft.EntityFrameworkCore.Infrastructure.ModelValidator.ValidatePropertyMapping(IModel model, IDiagnosticsLogger`1 logger)
   at Microsoft.EntityFrameworkCore.Infrastructure.ModelValidator.Validate(IModel model, IDiagnosticsLogger`1 logger)
   at Microsoft.EntityFrameworkCore.Infrastructure.RelationalModelValidator.Validate(IModel model, IDiagnosticsLogger`1 logger)
   at Microsoft.EntityFrameworkCore.Sqlite.Infrastructure.Internal.SqliteModelValidator.Validate(IModel model, IDiagnosticsLogger`1 logger)
   at Microsoft.EntityFrameworkCore.Infrastructure.ModelRuntimeInitializer.Initialize(IModel model, Boolean designTime, IDiagnosticsLogger`1 validationLogger)
   at Microsoft.EntityFrameworkCore.Infrastructure.ModelSource.GetModel(DbContext context, ModelCreationDependencies modelCreationDependencies, Boolean designTime)
   at Microsoft.EntityFrameworkCore.Internal.DbContextServices.CreateModel(Boolean designTime)
   at Microsoft.EntityFrameworkCore.Internal.DbContextServices.get_Model()
   at Microsoft.EntityFrameworkCore.Infrastructure.EntityFrameworkServicesBuilder.<>c.<TryAddCoreServices>b__8_4(IServiceProvider p)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSiteMain(ServiceCallSite callSite, TArgument argument)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitCache(ServiceCallSite callSite, RuntimeResolverContext context, ServiceProviderEngineScope serviceProviderEngine, RuntimeResolverLock lockType)

image

This doesn't happen when I am on the v3 branch, so it looks like something got broken.

@sfmskywalker
Copy link
Member

There seems to be an issue with with saving a workflow definition under certain circumstances. When I follow thesesteps, an exception occurs:

  1. Using the designer, create a new workflow definition
  2. Add a variable and click Save
  3. Edit the variable and change its Type, then click Save.

Wait for the designer to save this change and notice that an exception occurs on the server:

image

@sfmskywalker sfmskywalker merged commit bc2b4e8 into v3 Jun 28, 2023
1 check passed
@sfmskywalker sfmskywalker deleted the mongodb branch June 28, 2023 20:44
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

2 participants