fix: query optimisations (#1949)

* index on events for changes

* check for current sequence before filter events
This commit is contained in:
Silvan 2021-07-01 16:21:24 +02:00 committed by GitHub
parent 2037d7d41c
commit 15ae8be3c3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 91 additions and 15 deletions

View File

@ -33,7 +33,14 @@ func (repo *FeaturesRepo) GetDefaultFeatures(ctx context.Context) (*features_mod
if errors.IsNotFound(viewErr) {
features = new(model.FeaturesView)
}
events, esErr := repo.getIAMEvents(ctx, features.Sequence)
sequence := features.Sequence
currentSequence, err := repo.View.GetLatestFeaturesSequence()
if err == nil {
sequence = currentSequence.CurrentSequence
}
events, esErr := repo.getIAMEvents(ctx, sequence)
if errors.IsNotFound(viewErr) && len(events) == 0 {
return nil, errors.ThrowNotFound(nil, "EVENT-Lsoj7", "Errors.Org.NotFound")
}

View File

@ -5,7 +5,7 @@ import (
"strings"
"github.com/caos/zitadel/internal/domain"
"github.com/caos/zitadel/internal/eventstore/v1"
v1 "github.com/caos/zitadel/internal/eventstore/v1"
"github.com/caos/zitadel/internal/eventstore/v1/models"
iam_view "github.com/caos/zitadel/internal/iam/repository/view"
"github.com/caos/zitadel/internal/user/repository/view/model"
@ -138,7 +138,14 @@ func (repo *IAMRepository) GetDefaultLoginPolicy(ctx context.Context) (*iam_mode
if caos_errs.IsNotFound(viewErr) {
policy = new(iam_es_model.LoginPolicyView)
}
events, esErr := repo.getIAMEvents(ctx, policy.Sequence)
sequence := policy.Sequence
currentSequence, err := repo.View.GetLatestLoginPolicySequence()
if err == nil {
sequence = currentSequence.CurrentSequence
}
events, esErr := repo.getIAMEvents(ctx, sequence)
if caos_errs.IsNotFound(viewErr) && len(events) == 0 {
return nil, caos_errs.ThrowNotFound(nil, "EVENT-cmO9s", "Errors.IAM.LoginPolicy.NotFound")
}
@ -210,7 +217,14 @@ func (repo *IAMRepository) GetDefaultPasswordComplexityPolicy(ctx context.Contex
if caos_errs.IsNotFound(viewErr) {
policy = new(iam_es_model.PasswordComplexityPolicyView)
}
events, esErr := repo.getIAMEvents(ctx, policy.Sequence)
sequence := policy.Sequence
currentSequence, err := repo.View.GetLatestPasswordComplexityPolicySequence()
if err == nil {
sequence = currentSequence.CurrentSequence
}
events, esErr := repo.getIAMEvents(ctx, sequence)
if caos_errs.IsNotFound(viewErr) && len(events) == 0 {
return nil, caos_errs.ThrowNotFound(nil, "EVENT-1Mc0s", "Errors.IAM.PasswordComplexityPolicy.NotFound")
}
@ -235,7 +249,14 @@ func (repo *IAMRepository) GetDefaultPasswordAgePolicy(ctx context.Context) (*ia
if caos_errs.IsNotFound(viewErr) {
policy = new(iam_es_model.PasswordAgePolicyView)
}
events, esErr := repo.getIAMEvents(ctx, policy.Sequence)
sequence := policy.Sequence
currentSequence, err := repo.View.GetLatestPasswordAgePolicySequence()
if err == nil {
sequence = currentSequence.CurrentSequence
}
events, esErr := repo.getIAMEvents(ctx, sequence)
if caos_errs.IsNotFound(viewErr) && len(events) == 0 {
return nil, caos_errs.ThrowNotFound(nil, "EVENT-vMyS3", "Errors.IAM.PasswordAgePolicy.NotFound")
}
@ -260,7 +281,14 @@ func (repo *IAMRepository) GetDefaultPasswordLockoutPolicy(ctx context.Context)
if caos_errs.IsNotFound(viewErr) {
policy = new(iam_es_model.PasswordLockoutPolicyView)
}
events, esErr := repo.getIAMEvents(ctx, policy.Sequence)
sequence := policy.Sequence
currentSequence, err := repo.View.GetLatestPasswordLockoutPolicySequence()
if err == nil {
sequence = currentSequence.CurrentSequence
}
events, esErr := repo.getIAMEvents(ctx, sequence)
if caos_errs.IsNotFound(viewErr) && len(events) == 0 {
return nil, caos_errs.ThrowNotFound(nil, "EVENT-2M9oP", "Errors.IAM.PasswordLockoutPolicy.NotFound")
}
@ -285,7 +313,14 @@ func (repo *IAMRepository) GetOrgIAMPolicy(ctx context.Context) (*iam_model.OrgI
if caos_errs.IsNotFound(viewErr) {
policy = new(iam_es_model.OrgIAMPolicyView)
}
events, esErr := repo.getIAMEvents(ctx, policy.Sequence)
sequence := policy.Sequence
currentSequence, err := repo.View.GetLatestOrgIAMPolicySequence()
if err == nil {
sequence = currentSequence.CurrentSequence
}
events, esErr := repo.getIAMEvents(ctx, sequence)
if caos_errs.IsNotFound(viewErr) && len(events) == 0 {
return nil, caos_errs.ThrowNotFound(nil, "EVENT-MkoL0", "Errors.IAM.OrgIAMPolicy.NotFound")
}

View File

@ -2,8 +2,9 @@ package eventstore
import (
"context"
"github.com/caos/zitadel/internal/errors"
"github.com/caos/zitadel/internal/eventstore/v1"
v1 "github.com/caos/zitadel/internal/eventstore/v1"
"github.com/caos/zitadel/internal/eventstore/v1/models"
es_sdk "github.com/caos/zitadel/internal/eventstore/v1/sdk"
iam_model "github.com/caos/zitadel/internal/iam/model"
@ -36,7 +37,14 @@ func (repo *OrgRepo) OrgByID(ctx context.Context, id string) (*org_model.OrgView
if errors.IsNotFound(viewErr) {
org = new(model.OrgView)
}
events, esErr := repo.getOrgEvents(ctx, id, org.Sequence)
sequence := org.Sequence
currentSequence, err := repo.View.GetLatestOrgSequence()
if err == nil {
sequence = currentSequence.CurrentSequence
}
events, esErr := repo.getOrgEvents(ctx, id, sequence)
if errors.IsNotFound(viewErr) && len(events) == 0 {
return nil, errors.ThrowNotFound(nil, "EVENT-Lsoj7", "Errors.Org.NotFound")
}

View File

@ -8,7 +8,7 @@ import (
"github.com/caos/zitadel/internal/crypto"
"github.com/caos/zitadel/internal/domain"
"github.com/caos/zitadel/internal/eventstore/v1"
v1 "github.com/caos/zitadel/internal/eventstore/v1"
"github.com/caos/zitadel/internal/eventstore/v1/models"
usr_view "github.com/caos/zitadel/internal/user/repository/view"
@ -41,7 +41,13 @@ func (r *RefreshTokenRepo) RefreshTokenByID(ctx context.Context, refreshToken st
tokenView.UserID = userID
}
events, esErr := r.getUserEvents(ctx, userID, tokenView.Sequence)
sequence := tokenView.Sequence
currentSequence, err := r.View.GetLatestRefreshTokenSequence()
if err == nil {
sequence = currentSequence.CurrentSequence
}
events, esErr := r.getUserEvents(ctx, userID, sequence)
if errors.IsNotFound(viewErr) && len(events) == 0 {
return nil, errors.ThrowNotFound(nil, "EVENT-BHB52", "Errors.User.RefreshToken.Invalid")
}

View File

@ -43,7 +43,13 @@ func (repo *TokenVerifierRepo) TokenByID(ctx context.Context, tokenID, userID st
token.UserID = userID
}
events, esErr := repo.getUserEvents(ctx, userID, token.Sequence)
sequence := token.Sequence
currentSequence, err := repo.View.GetLatestTokenSequence()
if err == nil {
sequence = currentSequence.CurrentSequence
}
events, esErr := repo.getUserEvents(ctx, userID, sequence)
if caos_errs.IsNotFound(viewErr) && len(events) == 0 {
return nil, caos_errs.ThrowNotFound(nil, "EVENT-4T90g", "Errors.Token.NotFound")
}

View File

@ -47,7 +47,13 @@ func (repo *ProjectRepo) ProjectByID(ctx context.Context, id string) (*proj_mode
project = new(model.ProjectView)
}
events, esErr := repo.getProjectEvents(ctx, id, project.Sequence)
sequence := project.Sequence
currentSequence, err := repo.View.GetLatestProjectSequence()
if err == nil {
sequence = currentSequence.CurrentSequence
}
events, esErr := repo.getProjectEvents(ctx, id, sequence)
if caos_errs.IsNotFound(viewErr) && len(events) == 0 {
return nil, caos_errs.ThrowNotFound(nil, "EVENT-8yfKu", "Errors.Project.NotFound")
}

View File

@ -7,7 +7,7 @@ import (
"github.com/golang/protobuf/ptypes"
"github.com/caos/zitadel/internal/domain"
"github.com/caos/zitadel/internal/eventstore/v1"
v1 "github.com/caos/zitadel/internal/eventstore/v1"
"github.com/caos/zitadel/internal/eventstore/v1/models"
usr_view "github.com/caos/zitadel/internal/user/repository/view"
@ -41,7 +41,14 @@ func (repo *UserRepo) UserByID(ctx context.Context, id string) (*usr_model.UserV
if caos_errs.IsNotFound(viewErr) {
user = new(model.UserView)
}
events, esErr := repo.getUserEvents(ctx, id, user.Sequence)
sequence := user.Sequence
currentSequence, err := repo.View.GetLatestUserSequence()
if err == nil {
sequence = currentSequence.CurrentSequence
}
events, esErr := repo.getUserEvents(ctx, id, sequence)
if caos_errs.IsNotFound(viewErr) && len(events) == 0 {
return nil, caos_errs.ThrowNotFound(nil, "EVENT-Lsoj7", "Errors.User.NotFound")
}

View File

@ -0,0 +1 @@
CREATE INDEX changes_idx ON eventstore.events (aggregate_type, aggregate_id, creation_date) USING HASH WITH BUCKET_COUNT = 10;