mirror of
https://github.com/zitadel/zitadel.git
synced 2025-08-11 20:57:31 +00:00
feat(cache): organization (#8903)
# Which Problems Are Solved Organizations are ofter searched for by ID or primary domain. This results in many redundant queries, resulting in a performance impact. # How the Problems Are Solved Cache Organizaion objects by ID and primary domain. # Additional Changes - Adjust integration test config to use all types of cache. - Adjust integration test lifetimes so the pruner has something to do while the tests run. # Additional Context - Closes #8865 - After #8902
This commit is contained in:
@@ -107,10 +107,19 @@ func (q *OrgSearchQueries) toQuery(query sq.SelectBuilder) sq.SelectBuilder {
|
||||
return query
|
||||
}
|
||||
|
||||
func (q *Queries) OrgByID(ctx context.Context, shouldTriggerBulk bool, id string) (_ *Org, err error) {
|
||||
func (q *Queries) OrgByID(ctx context.Context, shouldTriggerBulk bool, id string) (org *Org, err error) {
|
||||
ctx, span := tracing.NewSpan(ctx)
|
||||
defer func() { span.EndWithError(err) }()
|
||||
|
||||
if org, ok := q.caches.org.Get(ctx, orgIndexByID, id); ok {
|
||||
return org, nil
|
||||
}
|
||||
defer func() {
|
||||
if err == nil && org != nil {
|
||||
q.caches.org.Set(ctx, org)
|
||||
}
|
||||
}()
|
||||
|
||||
if !authz.GetInstance(ctx).Features().ShouldUseImprovedPerformance(feature.ImprovedPerformanceTypeOrgByID) {
|
||||
return q.oldOrgByID(ctx, shouldTriggerBulk, id)
|
||||
}
|
||||
@@ -175,6 +184,11 @@ func (q *Queries) OrgByPrimaryDomain(ctx context.Context, domain string) (org *O
|
||||
ctx, span := tracing.NewSpan(ctx)
|
||||
defer func() { span.EndWithError(err) }()
|
||||
|
||||
org, ok := q.caches.org.Get(ctx, orgIndexByPrimaryDomain, domain)
|
||||
if ok {
|
||||
return org, nil
|
||||
}
|
||||
|
||||
stmt, scan := prepareOrgQuery(ctx, q.client)
|
||||
query, args, err := stmt.Where(sq.Eq{
|
||||
OrgColumnDomain.identifier(): domain,
|
||||
@@ -189,6 +203,9 @@ func (q *Queries) OrgByPrimaryDomain(ctx context.Context, domain string) (org *O
|
||||
org, err = scan(row)
|
||||
return err
|
||||
}, query, args...)
|
||||
if err == nil {
|
||||
q.caches.org.Set(ctx, org)
|
||||
}
|
||||
return org, err
|
||||
}
|
||||
|
||||
@@ -476,3 +493,30 @@ func prepareOrgUniqueQuery(ctx context.Context, db prepareDatabase) (sq.SelectBu
|
||||
return isUnique, err
|
||||
}
|
||||
}
|
||||
|
||||
type orgIndex int
|
||||
|
||||
//go:generate enumer -type orgIndex -linecomment
|
||||
const (
|
||||
// Empty line comment ensures empty string for unspecified value
|
||||
orgIndexUnspecified orgIndex = iota //
|
||||
orgIndexByID
|
||||
orgIndexByPrimaryDomain
|
||||
)
|
||||
|
||||
// Keys implements [cache.Entry]
|
||||
func (o *Org) Keys(index orgIndex) []string {
|
||||
switch index {
|
||||
case orgIndexByID:
|
||||
return []string{o.ID}
|
||||
case orgIndexByPrimaryDomain:
|
||||
return []string{o.Domain}
|
||||
case orgIndexUnspecified:
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (c *Caches) registerOrgInvalidation() {
|
||||
invalidate := cacheInvalidationFunc(c.instance, instanceIndexByID, getAggregateID)
|
||||
projection.OrgProjection.RegisterCacheInvalidation(invalidate)
|
||||
}
|
||||
|
Reference in New Issue
Block a user