temporalio / temporalite-archived

An experimental distribution of Temporal that runs as a single process
MIT License
608 stars 74 forks source link

Unable to upgrade to Temporal 1.20 due to missing Internal frontend configuration #212

Open hferentschik opened 1 year ago

hferentschik commented 1 year ago

Expected Behavior

I am trying to upgrade Temporalite to Temporal 1.20. When I update go.mod to have the following dependencies:

    go.temporal.io/api v1.18.2-0.20230324225508-f2c7ab685b44
    go.temporal.io/sdk v1.21.2
    go.temporal.io/server v1.20.2

go test should pass after the upgrade.

Actual Behavior

go test fails with the following error:

go test ./...
?       github.com/temporalio/temporalite   [no test files]
?       github.com/temporalio/temporalite/internal/copyright    [no test files]
?       github.com/temporalio/temporalite/internal/examples/helloworld  [no test files]
?       github.com/temporalio/temporalite/internal/examples/mtls    [no test files]
?       github.com/temporalio/temporalite/internal/liteconfig   [no test files]
2023/05/08 16:44:22 INFO  No logger configured for temporal client. Created default one.
[Fx] PROVIDE    *pprof.PProfInitializerImpl <= go.temporal.io/server/common/pprof.NewInitializer()
[Fx] PROVIDE    *temporal.ServerImpl <= go.temporal.io/server/temporal.NewServerFxImpl()
[Fx] PROVIDE    temporal.Server <= go.temporal.io/server/temporal.glob..func9()
[Fx] SUPPLY []temporal.ServerOption
[Fx] PROVIDE    *temporal.serverOptions <= go.temporal.io/server/temporal.ServerOptionsProvider()
[Fx] PROVIDE    chan interface {} <= go.temporal.io/server/temporal.ServerOptionsProvider()
[Fx] PROVIDE    *config.Config <= go.temporal.io/server/temporal.ServerOptionsProvider()
[Fx] PROVIDE    *config.PProf <= go.temporal.io/server/temporal.ServerOptionsProvider()
[Fx] PROVIDE    log.Config <= go.temporal.io/server/temporal.ServerOptionsProvider()
[Fx] PROVIDE    resource.ServiceNames <= go.temporal.io/server/temporal.ServerOptionsProvider()
[Fx] PROVIDE    resource.NamespaceLogger <= go.temporal.io/server/temporal.ServerOptionsProvider()
[Fx] PROVIDE    resolver.ServiceResolver <= go.temporal.io/server/temporal.ServerOptionsProvider()
[Fx] PROVIDE    client.AbstractDataStoreFactory <= go.temporal.io/server/temporal.ServerOptionsProvider()
[Fx] PROVIDE    searchattribute.Mapper <= go.temporal.io/server/temporal.ServerOptionsProvider()
[Fx] PROVIDE    []grpc.UnaryServerInterceptor <= go.temporal.io/server/temporal.ServerOptionsProvider()
[Fx] PROVIDE    authorization.Authorizer <= go.temporal.io/server/temporal.ServerOptionsProvider()
[Fx] PROVIDE    authorization.ClaimMapper <= go.temporal.io/server/temporal.ServerOptionsProvider()
[Fx] PROVIDE    authorization.JWTAudienceMapper <= go.temporal.io/server/temporal.ServerOptionsProvider()
[Fx] PROVIDE    log.Logger <= go.temporal.io/server/temporal.ServerOptionsProvider()
[Fx] PROVIDE    client.FactoryProvider <= go.temporal.io/server/temporal.ServerOptionsProvider()
[Fx] PROVIDE    dynamicconfig.Client <= go.temporal.io/server/temporal.ServerOptionsProvider()
[Fx] PROVIDE    *dynamicconfig.Collection <= go.temporal.io/server/temporal.ServerOptionsProvider()
[Fx] PROVIDE    encryption.TLSConfigProvider <= go.temporal.io/server/temporal.ServerOptionsProvider()
[Fx] PROVIDE    *client.Config <= go.temporal.io/server/temporal.ServerOptionsProvider()
[Fx] PROVIDE    client.Client <= go.temporal.io/server/temporal.ServerOptionsProvider()
[Fx] PROVIDE    metrics.Handler <= go.temporal.io/server/temporal.ServerOptionsProvider()
[Fx] PROVIDE    []trace.SpanExporter <= go.temporal.io/server/temporal.glob..func2()
[Fx] PROVIDE    client.FactoryProviderFn <= go.temporal.io/server/temporal.PersistenceFactoryProvider()
[Fx] PROVIDE    *temporal.ServicesMetadata[group = "services"] <= go.temporal.io/server/temporal.HistoryServiceProvider()
[Fx] PROVIDE    *temporal.ServicesMetadata[group = "services"] <= go.temporal.io/server/temporal.MatchingServiceProvider()
[Fx] PROVIDE    *temporal.ServicesMetadata[group = "services"] <= go.temporal.io/server/temporal.FrontendServiceProvider()
[Fx] PROVIDE    *temporal.ServicesMetadata[group = "services"] <= go.temporal.io/server/temporal.InternalFrontendServiceProvider()
[Fx] PROVIDE    *temporal.ServicesMetadata[group = "services"] <= go.temporal.io/server/temporal.WorkerServiceProvider()
[Fx] PROVIDE    *cluster.Config <= go.temporal.io/server/temporal.ApplyClusterMetadataConfigProvider()
[Fx] PROVIDE    config.Persistence <= go.temporal.io/server/temporal.ApplyClusterMetadataConfigProvider()
[Fx] PROVIDE    fx.Lifecycle <= go.uber.org/fx.New.func1()
[Fx] PROVIDE    fx.Shutdowner <= go.uber.org/fx.(*App).shutdowner-fm()
[Fx] PROVIDE    fx.DotGraph <= go.uber.org/fx.(*App).dotGraph-fm()
[Fx] ERROR      Failed to initialize custom logger: could not build arguments for function "go.uber.org/fx".(*App).constructCustomLogger.func2
    /Users/hartmut.ferentschik/go/pkg/mod/go.uber.org/fx@v1.18.2/app.go:414:
failed to build fxevent.Logger:
could not build arguments for function "go.temporal.io/server/temporal".glob..func8
    /Users/hartmut.ferentschik/go/pkg/mod/go.temporal.io/server@v1.20.2/temporal/fx.go:1025:
failed to build log.Logger:
received non-nil error from function "go.temporal.io/server/temporal".ServerOptionsProvider
    /Users/hartmut.ferentschik/go/pkg/mod/go.temporal.io/server@v1.20.2/temporal/fx.go:159:
config validation error: "internal-frontend" service is missing in config
Server closed with error: unable to instantiate server: could not build arguments for function "go.uber.org/fx".(*App).constructCustomLogger.func2 (/Users/hartmut.ferentschik/go/pkg/mod/go.uber.org/fx@v1.18.2/app.go:414): failed to build fxevent.Logger: could not build arguments for function "go.temporal.io/server/temporal".glob..func8 (/Users/hartmut.ferentschik/go/pkg/mod/go.temporal.io/server@v1.20.2/temporal/fx.go:1025): failed to build log.Logger: received non-nil error from function "go.temporal.io/server/temporal".ServerOptionsProvider (/Users/hartmut.ferentschik/go/pkg/mod/go.temporal.io/server@v1.20.2/temporal/fx.go:159): config validation error: "internal-frontend" service is missing in config
2023/05/08 16:44:22 INFO  No logger configured for temporal client. Created default one.
2023/05/08 16:44:22 INFO  No logger configured for temporal client. Created default one.
2023/05/08 16:44:23 INFO  No logger configured for temporal client. Created default one.
2023/05/08 16:44:23 INFO  No logger configured for temporal client. Created default one.
2023/05/08 16:44:23 INFO  No logger configured for temporal client. Created default one.
2023/05/08 16:44:23 INFO  No logger configured for temporal client. Created default one.
2023/05/08 16:44:23 INFO  No logger configured for temporal client. Created default one.
2023/05/08 16:44:23 INFO  No logger configured for temporal client. Created default one.
2023/05/08 16:44:23 INFO  No logger configured for temporal client. Created default one.
2023/05/08 16:44:23 INFO  No logger configured for temporal client. Created default one.
2023/05/08 16:44:23 INFO  No logger configured for temporal client. Created default one.
2023/05/08 16:44:24 INFO  No logger configured for temporal client. Created default one.
2023/05/08 16:44:24 INFO  No logger configured for temporal client. Created default one.
2023/05/08 16:44:24 INFO  No logger configured for temporal client. Created default one.
2023/05/08 16:44:24 INFO  No logger configured for temporal client. Created default one.
2023/05/08 16:44:24 INFO  No logger configured for temporal client. Created default one.
2023/05/08 16:44:24 INFO  No logger configured for temporal client. Created default one.
2023/05/08 16:44:24 INFO  No logger configured for temporal client. Created default one.
2023/05/08 16:44:24 INFO  No logger configured for temporal client. Created default one.
2023/05/08 16:44:24 INFO  No logger configured for temporal client. Created default one.
2023/05/08 16:44:24 INFO  No logger configured for temporal client. Created default one.
2023/05/08 16:44:25 INFO  No logger configured for temporal client. Created default one.
2023/05/08 16:44:25 INFO  No logger configured for temporal client. Created default one.
2023/05/08 16:44:25 INFO  No logger configured for temporal client. Created default one.
2023/05/08 16:44:25 INFO  No logger configured for temporal client. Created default one.
2023/05/08 16:44:25 INFO  No logger configured for temporal client. Created default one.
2023/05/08 16:44:25 INFO  No logger configured for temporal client. Created default one.
2023/05/08 16:44:25 INFO  No logger configured for temporal client. Created default one.
2023/05/08 16:44:25 INFO  No logger configured for temporal client. Created default one.
2023/05/08 16:44:25 INFO  No logger configured for temporal client. Created default one.
2023/05/08 16:44:26 INFO  No logger configured for temporal client. Created default one.
2023/05/08 16:44:26 INFO  No logger configured for temporal client. Created default one.
2023/05/08 16:44:26 INFO  No logger configured for temporal client. Created default one.
2023/05/08 16:44:26 INFO  No logger configured for temporal client. Created default one.
2023/05/08 16:44:26 INFO  No logger configured for temporal client. Created default one.
2023/05/08 16:44:26 INFO  No logger configured for temporal client. Created default one.
2023/05/08 16:44:26 INFO  No logger configured for temporal client. Created default one.
2023/05/08 16:44:26 INFO  No logger configured for temporal client. Created default one.
2023/05/08 16:44:26 INFO  No logger configured for temporal client. Created default one.
2023/05/08 16:44:26 INFO  No logger configured for temporal client. Created default one.
2023/05/08 16:44:27 INFO  No logger configured for temporal client. Created default one.
2023/05/08 16:44:27 INFO  No logger configured for temporal client. Created default one.
2023/05/08 16:44:27 INFO  No logger configured for temporal client. Created default one.
2023/05/08 16:44:27 INFO  No logger configured for temporal client. Created default one.
2023/05/08 16:44:27 INFO  No logger configured for temporal client. Created default one.
2023/05/08 16:44:27 INFO  No logger configured for temporal client. Created default one.
2023/05/08 16:44:27 INFO  No logger configured for temporal client. Created default one.
2023/05/08 16:44:27 INFO  No logger configured for temporal client. Created default one.
2023/05/08 16:44:27 INFO  No logger configured for temporal client. Created default one.
--- FAIL: TestCreateDataDirectory (5.28s)
    --- FAIL: TestCreateDataDirectory/default_db_path (5.27s)
        main_test.go:110: failed reaching server: last connection error: connection error: desc = "transport: Error while dialing: dial tcp [::1]:57199: connect: connection refused"
panic: runtime error: invalid memory address or nil pointer dereference [recovered]
    panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x2 addr=0x20 pc=0x1020522e4]

goroutine 11 [running]:
testing.tRunner.func1.2({0x103b501c0, 0x1051f4030})
    /opt/homebrew/Cellar/go/1.20.3/libexec/src/testing/testing.go:1526 +0x1c8
testing.tRunner.func1()
    /opt/homebrew/Cellar/go/1.20.3/libexec/src/testing/testing.go:1529 +0x384
panic({0x103b501c0, 0x1051f4030})
    /opt/homebrew/Cellar/go/1.20.3/libexec/src/runtime/panic.go:884 +0x204
github.com/temporalio/temporalite/cmd/temporalite.assertServerHealth(_, {_, _}, {{0x14000a103b0, 0xf}, {0x102073ef2, 0xf}, {0x0, 0x0}, {0x0, ...}, ...})
    /Users/hartmut.ferentschik/go/src/github.com/temporalio/temporalite/cmd/temporalite/main_test.go:113 +0x134
github.com/temporalio/temporalite/cmd/temporalite.TestCreateDataDirectory.func3(0x14000583d40)
    /Users/hartmut.ferentschik/go/src/github.com/temporalio/temporalite/cmd/temporalite/main_test.go:178 +0x1e0
testing.tRunner(0x14000583d40, 0x140009fd080)
    /opt/homebrew/Cellar/go/1.20.3/libexec/src/testing/testing.go:1576 +0x10c
created by testing.(*T).Run
    /opt/homebrew/Cellar/go/1.20.3/libexec/src/testing/testing.go:1629 +0x368
FAIL    github.com/temporalio/temporalite/cmd/temporalite   6.469s
[Fx] PROVIDE    *pprof.PProfInitializerImpl <= go.temporal.io/server/common/pprof.NewInitializer()
[Fx] PROVIDE    *temporal.ServerImpl <= go.temporal.io/server/temporal.NewServerFxImpl()
[Fx] PROVIDE    temporal.Server <= go.temporal.io/server/temporal.glob..func9()
[Fx] SUPPLY []temporal.ServerOption
[Fx] PROVIDE    *temporal.serverOptions <= go.temporal.io/server/temporal.ServerOptionsProvider()
[Fx] PROVIDE    chan interface {} <= go.temporal.io/server/temporal.ServerOptionsProvider()
[Fx] PROVIDE    *config.Config <= go.temporal.io/server/temporal.ServerOptionsProvider()
[Fx] PROVIDE    *config.PProf <= go.temporal.io/server/temporal.ServerOptionsProvider()
[Fx] PROVIDE    log.Config <= go.temporal.io/server/temporal.ServerOptionsProvider()
[Fx] PROVIDE    resource.ServiceNames <= go.temporal.io/server/temporal.ServerOptionsProvider()
[Fx] PROVIDE    resource.NamespaceLogger <= go.temporal.io/server/temporal.ServerOptionsProvider()
[Fx] PROVIDE    resolver.ServiceResolver <= go.temporal.io/server/temporal.ServerOptionsProvider()
[Fx] PROVIDE    client.AbstractDataStoreFactory <= go.temporal.io/server/temporal.ServerOptionsProvider()
[Fx] PROVIDE    searchattribute.Mapper <= go.temporal.io/server/temporal.ServerOptionsProvider()
[Fx] PROVIDE    []grpc.UnaryServerInterceptor <= go.temporal.io/server/temporal.ServerOptionsProvider()
[Fx] PROVIDE    authorization.Authorizer <= go.temporal.io/server/temporal.ServerOptionsProvider()
[Fx] PROVIDE    authorization.ClaimMapper <= go.temporal.io/server/temporal.ServerOptionsProvider()
[Fx] PROVIDE    authorization.JWTAudienceMapper <= go.temporal.io/server/temporal.ServerOptionsProvider()
[Fx] PROVIDE    log.Logger <= go.temporal.io/server/temporal.ServerOptionsProvider()
[Fx] PROVIDE    client.FactoryProvider <= go.temporal.io/server/temporal.ServerOptionsProvider()
[Fx] PROVIDE    dynamicconfig.Client <= go.temporal.io/server/temporal.ServerOptionsProvider()
[Fx] PROVIDE    *dynamicconfig.Collection <= go.temporal.io/server/temporal.ServerOptionsProvider()
[Fx] PROVIDE    encryption.TLSConfigProvider <= go.temporal.io/server/temporal.ServerOptionsProvider()
[Fx] PROVIDE    *client.Config <= go.temporal.io/server/temporal.ServerOptionsProvider()
[Fx] PROVIDE    client.Client <= go.temporal.io/server/temporal.ServerOptionsProvider()
[Fx] PROVIDE    metrics.Handler <= go.temporal.io/server/temporal.ServerOptionsProvider()
[Fx] PROVIDE    []trace.SpanExporter <= go.temporal.io/server/temporal.glob..func2()
[Fx] PROVIDE    client.FactoryProviderFn <= go.temporal.io/server/temporal.PersistenceFactoryProvider()
[Fx] PROVIDE    *temporal.ServicesMetadata[group = "services"] <= go.temporal.io/server/temporal.HistoryServiceProvider()
[Fx] PROVIDE    *temporal.ServicesMetadata[group = "services"] <= go.temporal.io/server/temporal.MatchingServiceProvider()
[Fx] PROVIDE    *temporal.ServicesMetadata[group = "services"] <= go.temporal.io/server/temporal.FrontendServiceProvider()
[Fx] PROVIDE    *temporal.ServicesMetadata[group = "services"] <= go.temporal.io/server/temporal.InternalFrontendServiceProvider()
[Fx] PROVIDE    *temporal.ServicesMetadata[group = "services"] <= go.temporal.io/server/temporal.WorkerServiceProvider()
[Fx] PROVIDE    *cluster.Config <= go.temporal.io/server/temporal.ApplyClusterMetadataConfigProvider()
[Fx] PROVIDE    config.Persistence <= go.temporal.io/server/temporal.ApplyClusterMetadataConfigProvider()
[Fx] PROVIDE    fx.Lifecycle <= go.uber.org/fx.New.func1()
[Fx] PROVIDE    fx.Shutdowner <= go.uber.org/fx.(*App).shutdowner-fm()
[Fx] PROVIDE    fx.DotGraph <= go.uber.org/fx.(*App).dotGraph-fm()
[Fx] ERROR      Failed to initialize custom logger: could not build arguments for function "go.uber.org/fx".(*App).constructCustomLogger.func2
    /Users/hartmut.ferentschik/go/pkg/mod/go.uber.org/fx@v1.18.2/app.go:414:
failed to build fxevent.Logger:
could not build arguments for function "go.temporal.io/server/temporal".glob..func8
    /Users/hartmut.ferentschik/go/pkg/mod/go.temporal.io/server@v1.20.2/temporal/fx.go:1025:
failed to build log.Logger:
received non-nil error from function "go.temporal.io/server/temporal".ServerOptionsProvider
    /Users/hartmut.ferentschik/go/pkg/mod/go.temporal.io/server@v1.20.2/temporal/fx.go:159:
config validation error: "internal-frontend" service is missing in config
--- FAIL: TestNewServer (0.01s)
    server.go:39: error creating server: unable to instantiate server: could not build arguments for function "go.uber.org/fx".(*App).constructCustomLogger.func2 (/Users/hartmut.ferentschik/go/pkg/mod/go.uber.org/fx@v1.18.2/app.go:414): failed to build fxevent.Logger: could not build arguments for function "go.temporal.io/server/temporal".glob..func8 (/Users/hartmut.ferentschik/go/pkg/mod/go.temporal.io/server@v1.20.2/temporal/fx.go:1025): failed to build log.Logger: received non-nil error from function "go.temporal.io/server/temporal".ServerOptionsProvider (/Users/hartmut.ferentschik/go/pkg/mod/go.temporal.io/server@v1.20.2/temporal/fx.go:159): config validation error: "internal-frontend" service is missing in config
panic: runtime error: invalid memory address or nil pointer dereference [recovered]
    panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x2 addr=0x10 pc=0x1027f318c]

goroutine 10 [running]:
testing.tRunner.func1.2({0x102f83b80, 0x104566f90})
    /opt/homebrew/Cellar/go/1.20.3/libexec/src/testing/testing.go:1526 +0x1c8
testing.tRunner.func1()
    /opt/homebrew/Cellar/go/1.20.3/libexec/src/testing/testing.go:1529 +0x384
panic({0x102f83b80, 0x104566f90})
    /opt/homebrew/Cellar/go/1.20.3/libexec/src/runtime/panic.go:884 +0x204
github.com/temporalio/temporalite.(*Server).Stop(0x0)
    /Users/hartmut.ferentschik/go/src/github.com/temporalio/temporalite/server.go:144 +0x1c
github.com/temporalio/temporalite/temporaltest.(*TestServer).Stop(0x1400042d080)
    /Users/hartmut.ferentschik/go/src/github.com/temporalio/temporalite/temporaltest/server.go:116 +0xbc
github.com/temporalio/temporalite/temporaltest.NewServer.func1()
    /Users/hartmut.ferentschik/go/src/github.com/temporalio/temporalite/temporaltest/server.go:142 +0x20
testing.(*common).Cleanup.func1()
    /opt/homebrew/Cellar/go/1.20.3/libexec/src/testing/testing.go:1150 +0x100
testing.(*common).runCleanup(0x140005c3040, 0x0?)
    /opt/homebrew/Cellar/go/1.20.3/libexec/src/testing/testing.go:1328 +0xd8
testing.tRunner.func2()
    /opt/homebrew/Cellar/go/1.20.3/libexec/src/testing/testing.go:1570 +0x2c
runtime.Goexit()
    /opt/homebrew/Cellar/go/1.20.3/libexec/src/runtime/panic.go:522 +0x180
testing.(*common).FailNow(0x140005c3040)
    /opt/homebrew/Cellar/go/1.20.3/libexec/src/testing/testing.go:980 +0x44
testing.(*common).Fatal(0x140005c3040, {0x14000ae5c50?, 0x14000ae5c50?, 0x1?})
    /opt/homebrew/Cellar/go/1.20.3/libexec/src/testing/testing.go:1057 +0x54
github.com/temporalio/temporalite/temporaltest.(*TestServer).fatal(...)
    /Users/hartmut.ferentschik/go/src/github.com/temporalio/temporalite/temporaltest/server.go:39
github.com/temporalio/temporalite/temporaltest.NewServer({0x14000aace18, 0x1, 0x59a00000006?})
    /Users/hartmut.ferentschik/go/src/github.com/temporalio/temporalite/temporaltest/server.go:158 +0x62c
github.com/temporalio/temporalite/temporaltest_test.TestNewServer(0x140005c3040)
    /Users/hartmut.ferentschik/go/src/github.com/temporalio/temporalite/temporaltest/server_test.go:58 +0xc8
testing.tRunner(0x140005c3040, 0x1033005c8)
    /opt/homebrew/Cellar/go/1.20.3/libexec/src/testing/testing.go:1576 +0x10c
created by testing.(*T).Run
    /opt/homebrew/Cellar/go/1.20.3/libexec/src/testing/testing.go:1629 +0x368
FAIL    github.com/temporalio/temporalite/temporaltest  0.619s
FAIL

Specifications

I believe the problem is the following code - https://github.com/temporalio/temporalite/blob/c5c2ad375e186a1eb5eb00cd04d7caae0198085c/server.go#L90:

    serverOpts := []temporal.ServerOption{
        temporal.WithConfig(cfg),
        temporal.ForServices(temporal.Services),
        temporal.WithLogger(c.Logger),
        temporal.WithAuthorizer(authorizer),
        temporal.WithClaimMapper(func(cfg *config.Config) authorization.ClaimMapper {
            return claimMapper
        }),
    }

temporal.Services is a list of all Temporal services. In Temporal 1.20 there is a new service "Internal frontend" which is added this way. However, the required configuration for internal frontend is missing. I think for Temporalite it makes sense to eventually make use of internal frontend, but a intermediate step could be the following:

    services := []string{
        string(primitives.FrontendService),
        string(primitives.HistoryService),
        string(primitives.MatchingService),
        string(primitives.WorkerService),
    }
    serverOpts := []temporal.ServerOption{
        temporal.WithConfig(cfg),
        temporal.ForServices(services),
        temporal.WithLogger(c.Logger),
        temporal.WithAuthorizer(authorizer),
        temporal.WithClaimMapper(func(cfg *config.Config) authorization.ClaimMapper {
            return claimMapper
        }),
    }

This excludes the internal frontend service for now.

karelbilek commented 12 months ago

I try to get 1.22 work (for advanced visibility), hitting same issue

dilyevsky commented 11 months ago

@hferentschik you can use temporal.DefaultServices (https://github.com/temporalio/temporal/blob/69cc69763af17a456b2ce4efc3f4f520325bedca/temporal/server.go#L59) available since 1.20