mirror of
https://github.com/zitadel/zitadel.git
synced 2025-08-12 01:47:33 +00:00
fix: improve startup times by initializing projection tables during setup (#4642)
* fix: improve startup times by initializing projections table during setup * add missing file
This commit is contained in:
@@ -3,7 +3,6 @@ package projection
|
||||
import (
|
||||
"context"
|
||||
"database/sql"
|
||||
"time"
|
||||
|
||||
"github.com/zitadel/zitadel/internal/crypto"
|
||||
"github.com/zitadel/zitadel/internal/eventstore"
|
||||
@@ -63,7 +62,16 @@ var (
|
||||
NotificationsProjection interface{}
|
||||
)
|
||||
|
||||
func Start(ctx context.Context, sqlClient *sql.DB, es *eventstore.Eventstore, config Config, keyEncryptionAlgorithm crypto.EncryptionAlgorithm, certEncryptionAlgorithm crypto.EncryptionAlgorithm) error {
|
||||
type projection interface {
|
||||
Start()
|
||||
Init(ctx context.Context) error
|
||||
}
|
||||
|
||||
var (
|
||||
projections []projection
|
||||
)
|
||||
|
||||
func Create(ctx context.Context, sqlClient *sql.DB, es *eventstore.Eventstore, config Config, keyEncryptionAlgorithm crypto.EncryptionAlgorithm, certEncryptionAlgorithm crypto.EncryptionAlgorithm) error {
|
||||
projectionConfig = crdb.StatementHandlerConfig{
|
||||
ProjectionHandlerConfig: handler.ProjectionHandlerConfig{
|
||||
HandlerConfig: handler.HandlerConfig{
|
||||
@@ -123,9 +131,25 @@ func Start(ctx context.Context, sqlClient *sql.DB, es *eventstore.Eventstore, co
|
||||
OIDCSettingsProjection = newOIDCSettingsProjection(ctx, applyCustomConfig(projectionConfig, config.Customizations["oidc_settings"]))
|
||||
DebugNotificationProviderProjection = newDebugNotificationProviderProjection(ctx, applyCustomConfig(projectionConfig, config.Customizations["debug_notification_provider"]))
|
||||
KeyProjection = newKeyProjection(ctx, applyCustomConfig(projectionConfig, config.Customizations["keys"]), keyEncryptionAlgorithm, certEncryptionAlgorithm)
|
||||
newProjectionsList()
|
||||
return nil
|
||||
}
|
||||
|
||||
func Init(ctx context.Context) error {
|
||||
for _, p := range projections {
|
||||
if err := p.Init(ctx); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func Start() {
|
||||
for _, projection := range projections {
|
||||
projection.Start()
|
||||
}
|
||||
}
|
||||
|
||||
func ApplyCustomConfig(customConfig CustomConfig) crdb.StatementHandlerConfig {
|
||||
return applyCustomConfig(projectionConfig, customConfig)
|
||||
|
||||
@@ -148,19 +172,54 @@ func applyCustomConfig(config crdb.StatementHandlerConfig, customConfig CustomCo
|
||||
return config
|
||||
}
|
||||
|
||||
func iteratorPool(workerCount int) chan func() {
|
||||
if workerCount <= 0 {
|
||||
return nil
|
||||
// we know this is ugly, but we need to have a singleton slice of all projections
|
||||
// and are only able to initialize it after all projections are created
|
||||
// as setup and start currently create them individually, we make sure we get the right one
|
||||
// will be refactored when changing to new id based projections
|
||||
//
|
||||
// NotificationsProjection is not added here, because it does not statement based / has no proprietary projection table
|
||||
func newProjectionsList() {
|
||||
projections = []projection{
|
||||
OrgProjection,
|
||||
OrgMetadataProjection,
|
||||
ActionProjection,
|
||||
FlowProjection,
|
||||
ProjectProjection,
|
||||
PasswordComplexityProjection,
|
||||
PasswordAgeProjection,
|
||||
LockoutPolicyProjection,
|
||||
PrivacyPolicyProjection,
|
||||
DomainPolicyProjection,
|
||||
LabelPolicyProjection,
|
||||
ProjectGrantProjection,
|
||||
ProjectRoleProjection,
|
||||
OrgDomainProjection,
|
||||
LoginPolicyProjection,
|
||||
IDPProjection,
|
||||
AppProjection,
|
||||
IDPUserLinkProjection,
|
||||
IDPLoginPolicyLinkProjection,
|
||||
MailTemplateProjection,
|
||||
MessageTextProjection,
|
||||
CustomTextProjection,
|
||||
UserProjection,
|
||||
LoginNameProjection,
|
||||
OrgMemberProjection,
|
||||
InstanceDomainProjection,
|
||||
InstanceMemberProjection,
|
||||
ProjectMemberProjection,
|
||||
ProjectGrantMemberProjection,
|
||||
AuthNKeyProjection,
|
||||
PersonalAccessTokenProjection,
|
||||
UserGrantProjection,
|
||||
UserMetadataProjection,
|
||||
UserAuthMethodProjection,
|
||||
InstanceProjection,
|
||||
SecretGeneratorProjection,
|
||||
SMTPConfigProjection,
|
||||
SMSConfigProjection,
|
||||
OIDCSettingsProjection,
|
||||
DebugNotificationProviderProjection,
|
||||
KeyProjection,
|
||||
}
|
||||
|
||||
queue := make(chan func())
|
||||
for i := 0; i < workerCount; i++ {
|
||||
go func() {
|
||||
for iteration := range queue {
|
||||
iteration()
|
||||
time.Sleep(2 * time.Second)
|
||||
}
|
||||
}()
|
||||
}
|
||||
return queue
|
||||
}
|
||||
|
Reference in New Issue
Block a user