mirror of
https://github.com/zitadel/zitadel.git
synced 2025-08-11 21:37:32 +00:00
feat(eventstore): increase parallel write capabilities (#5940)
This implementation increases parallel write capabilities of the eventstore. Please have a look at the technical advisories: [05](https://zitadel.com/docs/support/advisory/a10005) and [06](https://zitadel.com/docs/support/advisory/a10006). The implementation of eventstore.push is rewritten and stored events are migrated to a new table `eventstore.events2`. If you are using cockroach: make sure that the database user of ZITADEL has `VIEWACTIVITY` grant. This is used to query events.
This commit is contained in:
@@ -1,10 +1,9 @@
|
||||
package model
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
|
||||
"github.com/zitadel/zitadel/internal/crypto"
|
||||
"github.com/zitadel/zitadel/internal/errors"
|
||||
"github.com/zitadel/zitadel/internal/eventstore"
|
||||
es_models "github.com/zitadel/zitadel/internal/eventstore/v1/models"
|
||||
"github.com/zitadel/zitadel/internal/org/model"
|
||||
)
|
||||
@@ -28,18 +27,18 @@ func GetDomain(domains []*OrgDomain, domain string) (int, *OrgDomain) {
|
||||
return -1, nil
|
||||
}
|
||||
|
||||
func (o *Org) appendAddDomainEvent(event *es_models.Event) error {
|
||||
func (o *Org) appendAddDomainEvent(event eventstore.Event) error {
|
||||
domain := new(OrgDomain)
|
||||
err := domain.SetData(event)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
domain.ObjectRoot.CreationDate = event.CreationDate
|
||||
domain.ObjectRoot.CreationDate = event.CreatedAt()
|
||||
o.Domains = append(o.Domains, domain)
|
||||
return nil
|
||||
}
|
||||
|
||||
func (o *Org) appendRemoveDomainEvent(event *es_models.Event) error {
|
||||
func (o *Org) appendRemoveDomainEvent(event eventstore.Event) error {
|
||||
domain := new(OrgDomain)
|
||||
err := domain.SetData(event)
|
||||
if err != nil {
|
||||
@@ -53,7 +52,7 @@ func (o *Org) appendRemoveDomainEvent(event *es_models.Event) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (o *Org) appendVerifyDomainEvent(event *es_models.Event) error {
|
||||
func (o *Org) appendVerifyDomainEvent(event eventstore.Event) error {
|
||||
domain := new(OrgDomain)
|
||||
err := domain.SetData(event)
|
||||
if err != nil {
|
||||
@@ -66,7 +65,7 @@ func (o *Org) appendVerifyDomainEvent(event *es_models.Event) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (o *Org) appendPrimaryDomainEvent(event *es_models.Event) error {
|
||||
func (o *Org) appendPrimaryDomainEvent(event eventstore.Event) error {
|
||||
domain := new(OrgDomain)
|
||||
err := domain.SetData(event)
|
||||
if err != nil {
|
||||
@@ -81,7 +80,7 @@ func (o *Org) appendPrimaryDomainEvent(event *es_models.Event) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (o *Org) appendVerificationDomainEvent(event *es_models.Event) error {
|
||||
func (o *Org) appendVerificationDomainEvent(event eventstore.Event) error {
|
||||
domain := new(OrgDomain)
|
||||
err := domain.SetData(event)
|
||||
if err != nil {
|
||||
@@ -96,8 +95,8 @@ func (o *Org) appendVerificationDomainEvent(event *es_models.Event) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *OrgDomain) SetData(event *es_models.Event) error {
|
||||
err := json.Unmarshal(event.Data, m)
|
||||
func (m *OrgDomain) SetData(event eventstore.Event) error {
|
||||
err := event.Unmarshal(m)
|
||||
if err != nil {
|
||||
return errors.ThrowInternal(err, "EVENT-Hz7Mb", "unable to unmarshal data")
|
||||
}
|
||||
|
@@ -1,21 +1,21 @@
|
||||
package model
|
||||
|
||||
import (
|
||||
es_models "github.com/zitadel/zitadel/internal/eventstore/v1/models"
|
||||
"github.com/zitadel/zitadel/internal/eventstore"
|
||||
iam_es_model "github.com/zitadel/zitadel/internal/iam/repository/eventsourcing/model"
|
||||
)
|
||||
|
||||
func (o *Org) appendAddDomainPolicyEvent(event *es_models.Event) error {
|
||||
func (o *Org) appendAddDomainPolicyEvent(event eventstore.Event) error {
|
||||
o.DomainPolicy = new(iam_es_model.DomainPolicy)
|
||||
err := o.DomainPolicy.SetData(event)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
o.DomainPolicy.ObjectRoot.CreationDate = event.CreationDate
|
||||
o.DomainPolicy.ObjectRoot.CreationDate = event.CreatedAt()
|
||||
return nil
|
||||
}
|
||||
|
||||
func (o *Org) appendChangeDomainPolicyEvent(event *es_models.Event) error {
|
||||
func (o *Org) appendChangeDomainPolicyEvent(event eventstore.Event) error {
|
||||
return o.DomainPolicy.SetData(event)
|
||||
}
|
||||
|
||||
|
@@ -1,8 +1,6 @@
|
||||
package model
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
|
||||
"github.com/zitadel/zitadel/internal/errors"
|
||||
"github.com/zitadel/zitadel/internal/eventstore"
|
||||
es_models "github.com/zitadel/zitadel/internal/eventstore/v1/models"
|
||||
@@ -34,7 +32,7 @@ func OrgToModel(org *Org) *org_model.Org {
|
||||
return converted
|
||||
}
|
||||
|
||||
func OrgFromEvents(org *Org, events ...*es_models.Event) (*Org, error) {
|
||||
func OrgFromEvents(org *Org, events ...eventstore.Event) (*Org, error) {
|
||||
if org == nil {
|
||||
org = new(Org)
|
||||
}
|
||||
@@ -42,7 +40,7 @@ func OrgFromEvents(org *Org, events ...*es_models.Event) (*Org, error) {
|
||||
return org, org.AppendEvents(events...)
|
||||
}
|
||||
|
||||
func (o *Org) AppendEvents(events ...*es_models.Event) error {
|
||||
func (o *Org) AppendEvents(events ...eventstore.Event) error {
|
||||
for _, event := range events {
|
||||
err := o.AppendEvent(event)
|
||||
if err != nil {
|
||||
@@ -52,8 +50,8 @@ func (o *Org) AppendEvents(events ...*es_models.Event) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (o *Org) AppendEvent(event *es_models.Event) (err error) {
|
||||
switch eventstore.EventType(event.Type) {
|
||||
func (o *Org) AppendEvent(event eventstore.Event) (err error) {
|
||||
switch event.Type() {
|
||||
case org.OrgAddedEventType:
|
||||
err = o.SetData(event)
|
||||
if err != nil {
|
||||
@@ -92,8 +90,8 @@ func (o *Org) AppendEvent(event *es_models.Event) (err error) {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (o *Org) SetData(event *es_models.Event) error {
|
||||
err := json.Unmarshal(event.Data, o)
|
||||
func (o *Org) SetData(event eventstore.Event) error {
|
||||
err := event.Unmarshal(o)
|
||||
if err != nil {
|
||||
return errors.ThrowInternal(err, "EVENT-BpbQZ", "unable to unmarshal event")
|
||||
}
|
||||
|
@@ -4,6 +4,7 @@ import (
|
||||
"encoding/json"
|
||||
"testing"
|
||||
|
||||
"github.com/zitadel/zitadel/internal/eventstore"
|
||||
es_models "github.com/zitadel/zitadel/internal/eventstore/v1/models"
|
||||
"github.com/zitadel/zitadel/internal/org/model"
|
||||
"github.com/zitadel/zitadel/internal/repository/org"
|
||||
@@ -11,7 +12,7 @@ import (
|
||||
|
||||
func TestOrgFromEvents(t *testing.T) {
|
||||
type args struct {
|
||||
event []*es_models.Event
|
||||
event []eventstore.Event
|
||||
org *Org
|
||||
}
|
||||
tests := []struct {
|
||||
@@ -22,8 +23,8 @@ func TestOrgFromEvents(t *testing.T) {
|
||||
{
|
||||
name: "org from events, ok",
|
||||
args: args{
|
||||
event: []*es_models.Event{
|
||||
{AggregateID: "ID", Sequence: 1, Type: es_models.EventType(org.OrgAddedEventType)},
|
||||
event: []eventstore.Event{
|
||||
&es_models.Event{AggregateID: "ID", Seq: 1, Typ: org.OrgAddedEventType},
|
||||
},
|
||||
org: &Org{Name: "OrgName"},
|
||||
},
|
||||
@@ -32,8 +33,8 @@ func TestOrgFromEvents(t *testing.T) {
|
||||
{
|
||||
name: "org from events, nil org",
|
||||
args: args{
|
||||
event: []*es_models.Event{
|
||||
{AggregateID: "ID", Sequence: 1, Type: es_models.EventType(org.OrgAddedEventType)},
|
||||
event: []eventstore.Event{
|
||||
&es_models.Event{AggregateID: "ID", Seq: 1, Typ: org.OrgAddedEventType},
|
||||
},
|
||||
org: nil,
|
||||
},
|
||||
@@ -44,7 +45,7 @@ func TestOrgFromEvents(t *testing.T) {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
if tt.args.org != nil {
|
||||
data, _ := json.Marshal(tt.args.org)
|
||||
tt.args.event[0].Data = data
|
||||
tt.args.event[0].(*es_models.Event).Data = data
|
||||
}
|
||||
result, _ := OrgFromEvents(tt.args.org, tt.args.event...)
|
||||
if result.Name != tt.result.Name {
|
||||
@@ -67,7 +68,7 @@ func TestAppendEvent(t *testing.T) {
|
||||
{
|
||||
name: "append added event",
|
||||
args: args{
|
||||
event: &es_models.Event{AggregateID: "ID", Sequence: 1, Type: es_models.EventType(org.OrgAddedEventType)},
|
||||
event: &es_models.Event{AggregateID: "ID", Seq: 1, Typ: org.OrgAddedEventType},
|
||||
org: &Org{Name: "OrgName"},
|
||||
},
|
||||
result: &Org{ObjectRoot: es_models.ObjectRoot{AggregateID: "ID"}, State: int32(model.OrgStateActive), Name: "OrgName"},
|
||||
@@ -75,7 +76,7 @@ func TestAppendEvent(t *testing.T) {
|
||||
{
|
||||
name: "append change event",
|
||||
args: args{
|
||||
event: &es_models.Event{AggregateID: "ID", Sequence: 1, Type: es_models.EventType(org.OrgChangedEventType), Data: []byte(`{"name": "OrgName}`)},
|
||||
event: &es_models.Event{AggregateID: "ID", Seq: 1, Typ: org.OrgChangedEventType, Data: []byte(`{"name": "OrgName}`)},
|
||||
org: &Org{Name: "OrgNameChanged"},
|
||||
},
|
||||
result: &Org{ObjectRoot: es_models.ObjectRoot{AggregateID: "ID"}, State: int32(model.OrgStateActive), Name: "OrgNameChanged"},
|
||||
@@ -83,14 +84,14 @@ func TestAppendEvent(t *testing.T) {
|
||||
{
|
||||
name: "append deactivate event",
|
||||
args: args{
|
||||
event: &es_models.Event{AggregateID: "ID", Sequence: 1, Type: es_models.EventType(org.OrgDeactivatedEventType)},
|
||||
event: &es_models.Event{AggregateID: "ID", Seq: 1, Typ: org.OrgDeactivatedEventType},
|
||||
},
|
||||
result: &Org{ObjectRoot: es_models.ObjectRoot{AggregateID: "ID"}, State: int32(model.OrgStateInactive)},
|
||||
},
|
||||
{
|
||||
name: "append reactivate event",
|
||||
args: args{
|
||||
event: &es_models.Event{AggregateID: "ID", Sequence: 1, Type: es_models.EventType(org.OrgReactivatedEventType)},
|
||||
event: &es_models.Event{AggregateID: "ID", Seq: 1, Typ: org.OrgReactivatedEventType},
|
||||
},
|
||||
result: &Org{ObjectRoot: es_models.ObjectRoot{AggregateID: "ID"}, State: int32(model.OrgStateActive)},
|
||||
},
|
||||
|
@@ -2,33 +2,34 @@ package view
|
||||
|
||||
import (
|
||||
"github.com/zitadel/zitadel/internal/errors"
|
||||
es_models "github.com/zitadel/zitadel/internal/eventstore/v1/models"
|
||||
"github.com/zitadel/zitadel/internal/eventstore"
|
||||
"github.com/zitadel/zitadel/internal/repository/org"
|
||||
)
|
||||
|
||||
func OrgByIDQuery(id, instanceID string, latestSequence uint64) (*es_models.SearchQuery, error) {
|
||||
func OrgByIDQuery(id, instanceID string, latestSequence uint64) (*eventstore.SearchQueryBuilder, error) {
|
||||
if id == "" {
|
||||
return nil, errors.ThrowPreconditionFailed(nil, "EVENT-dke74", "id should be filled")
|
||||
}
|
||||
return es_models.NewSearchQuery().
|
||||
return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
|
||||
InstanceID(instanceID).
|
||||
AwaitOpenTransactions().
|
||||
SequenceGreater(latestSequence).
|
||||
AddQuery().
|
||||
AggregateTypeFilter(org.AggregateType).
|
||||
LatestSequenceFilter(latestSequence).
|
||||
InstanceIDFilter(instanceID).
|
||||
AggregateIDFilter(id).
|
||||
EventTypesFilter(
|
||||
es_models.EventType(org.OrgAddedEventType),
|
||||
es_models.EventType(org.OrgChangedEventType),
|
||||
es_models.EventType(org.OrgDeactivatedEventType),
|
||||
es_models.EventType(org.OrgReactivatedEventType),
|
||||
es_models.EventType(org.OrgDomainAddedEventType),
|
||||
es_models.EventType(org.OrgDomainVerificationAddedEventType),
|
||||
es_models.EventType(org.OrgDomainVerifiedEventType),
|
||||
es_models.EventType(org.OrgDomainPrimarySetEventType),
|
||||
es_models.EventType(org.OrgDomainRemovedEventType),
|
||||
es_models.EventType(org.DomainPolicyAddedEventType),
|
||||
es_models.EventType(org.DomainPolicyChangedEventType),
|
||||
es_models.EventType(org.DomainPolicyRemovedEventType),
|
||||
AggregateTypes(org.AggregateType).
|
||||
AggregateIDs(id).
|
||||
EventTypes(
|
||||
org.OrgAddedEventType,
|
||||
org.OrgChangedEventType,
|
||||
org.OrgDeactivatedEventType,
|
||||
org.OrgReactivatedEventType,
|
||||
org.OrgDomainAddedEventType,
|
||||
org.OrgDomainVerificationAddedEventType,
|
||||
org.OrgDomainVerifiedEventType,
|
||||
org.OrgDomainPrimarySetEventType,
|
||||
org.OrgDomainRemovedEventType,
|
||||
org.DomainPolicyAddedEventType,
|
||||
org.DomainPolicyChangedEventType,
|
||||
org.DomainPolicyRemovedEventType,
|
||||
).
|
||||
SearchQuery(), nil
|
||||
Builder(), nil
|
||||
}
|
||||
|
Reference in New Issue
Block a user