mirror of
https://github.com/hoernschen/dendrite.git
synced 2024-12-27 07:28:27 +00:00
Hooray, it doesn't work
This commit is contained in:
parent
3fb5ee7e1c
commit
565c1dc801
4 changed files with 77 additions and 6 deletions
|
@ -83,7 +83,7 @@ func CheckForSoftFail(
|
||||||
// Check if the event is allowed.
|
// Check if the event is allowed.
|
||||||
if err = gomatrixserverlib.Allowed(event.Event, &authEvents); err != nil {
|
if err = gomatrixserverlib.Allowed(event.Event, &authEvents); err != nil {
|
||||||
// return true, nil
|
// return true, nil
|
||||||
return true, err
|
return true, fmt.Errorf("gomatrixserverlib.Allowed: %w", err)
|
||||||
}
|
}
|
||||||
return false, nil
|
return false, nil
|
||||||
}
|
}
|
||||||
|
|
63
roomserver/internal/helpers/eventcache.go
Normal file
63
roomserver/internal/helpers/eventcache.go
Normal file
|
@ -0,0 +1,63 @@
|
||||||
|
package helpers
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"fmt"
|
||||||
|
"sync"
|
||||||
|
|
||||||
|
"github.com/matrix-org/dendrite/roomserver/storage"
|
||||||
|
"github.com/matrix-org/dendrite/roomserver/types"
|
||||||
|
)
|
||||||
|
|
||||||
|
type CachedDB struct {
|
||||||
|
mutex sync.RWMutex
|
||||||
|
eventsByID map[string]*types.Event
|
||||||
|
eventsByNID map[types.EventNID]*types.Event
|
||||||
|
storage.Database
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewCachedDB(db storage.Database) *CachedDB {
|
||||||
|
return &CachedDB{
|
||||||
|
Database: db,
|
||||||
|
eventsByID: make(map[string]*types.Event),
|
||||||
|
eventsByNID: make(map[types.EventNID]*types.Event),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *CachedDB) Events(ctx context.Context, eventNIDs []types.EventNID) ([]types.Event, error) {
|
||||||
|
fmt.Println("Want", eventNIDs)
|
||||||
|
events := make([]types.Event, len(eventNIDs))
|
||||||
|
retrieve := make([]types.EventNID, 0, len(eventNIDs))
|
||||||
|
c.mutex.RLock()
|
||||||
|
for i, eventNID := range eventNIDs {
|
||||||
|
if cached, ok := c.eventsByNID[eventNID]; ok {
|
||||||
|
events[i] = *cached
|
||||||
|
fmt.Println(i, "Existing", cached, cached.EventID(), cached.EventNID, cached.Type(), *cached.StateKey())
|
||||||
|
} else {
|
||||||
|
retrieve = append(retrieve, eventNID)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
c.mutex.RUnlock()
|
||||||
|
var retrieved []types.Event
|
||||||
|
var err error
|
||||||
|
if len(retrieve) > 0 {
|
||||||
|
retrieved, err = c.Database.Events(ctx, retrieve)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
c.mutex.Lock()
|
||||||
|
defer c.mutex.Unlock()
|
||||||
|
for i, event := range retrieved {
|
||||||
|
c.eventsByID[event.EventID()] = &retrieved[i]
|
||||||
|
c.eventsByNID[event.EventNID] = &retrieved[i]
|
||||||
|
}
|
||||||
|
for i, eventNID := range eventNIDs {
|
||||||
|
if cached, ok := c.eventsByNID[eventNID]; ok {
|
||||||
|
fmt.Println(i, "Found", cached, cached.EventID(), cached.EventNID, cached.Type(), *cached.StateKey(), string(cached.Content()))
|
||||||
|
events[i] = *cached
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fmt.Println("Returning", events)
|
||||||
|
return events, nil
|
||||||
|
}
|
|
@ -26,6 +26,7 @@ import (
|
||||||
"github.com/matrix-org/dendrite/internal/hooks"
|
"github.com/matrix-org/dendrite/internal/hooks"
|
||||||
"github.com/matrix-org/dendrite/roomserver/acls"
|
"github.com/matrix-org/dendrite/roomserver/acls"
|
||||||
"github.com/matrix-org/dendrite/roomserver/api"
|
"github.com/matrix-org/dendrite/roomserver/api"
|
||||||
|
"github.com/matrix-org/dendrite/roomserver/internal/helpers"
|
||||||
"github.com/matrix-org/dendrite/roomserver/storage"
|
"github.com/matrix-org/dendrite/roomserver/storage"
|
||||||
"github.com/matrix-org/gomatrixserverlib"
|
"github.com/matrix-org/gomatrixserverlib"
|
||||||
"github.com/prometheus/client_golang/prometheus"
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
|
@ -53,11 +54,16 @@ type inputWorker struct {
|
||||||
r *Inputer
|
r *Inputer
|
||||||
running atomic.Bool
|
running atomic.Bool
|
||||||
input *fifoQueue
|
input *fifoQueue
|
||||||
|
db *helpers.CachedDB
|
||||||
}
|
}
|
||||||
|
|
||||||
// Guarded by a CAS on w.running
|
// Guarded by a CAS on w.running
|
||||||
func (w *inputWorker) start() {
|
func (w *inputWorker) start() {
|
||||||
defer w.running.Store(false)
|
defer func() {
|
||||||
|
w.db = nil
|
||||||
|
w.running.Store(false)
|
||||||
|
}()
|
||||||
|
w.db = helpers.NewCachedDB(w.r.DB)
|
||||||
for {
|
for {
|
||||||
select {
|
select {
|
||||||
case <-w.input.wait():
|
case <-w.input.wait():
|
||||||
|
@ -69,7 +75,7 @@ func (w *inputWorker) start() {
|
||||||
"room_id": task.event.Event.RoomID(),
|
"room_id": task.event.Event.RoomID(),
|
||||||
}).Dec()
|
}).Dec()
|
||||||
hooks.Run(hooks.KindNewEventReceived, task.event.Event)
|
hooks.Run(hooks.KindNewEventReceived, task.event.Event)
|
||||||
_, task.err = w.r.processRoomEvent(task.ctx, task.event)
|
_, task.err = w.r.processRoomEvent(task.ctx, task.event, w.db)
|
||||||
if task.err == nil {
|
if task.err == nil {
|
||||||
hooks.Run(hooks.KindNewEventPersisted, task.event.Event)
|
hooks.Run(hooks.KindNewEventPersisted, task.event.Event)
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -26,6 +26,7 @@ import (
|
||||||
"github.com/matrix-org/dendrite/roomserver/api"
|
"github.com/matrix-org/dendrite/roomserver/api"
|
||||||
"github.com/matrix-org/dendrite/roomserver/internal/helpers"
|
"github.com/matrix-org/dendrite/roomserver/internal/helpers"
|
||||||
"github.com/matrix-org/dendrite/roomserver/state"
|
"github.com/matrix-org/dendrite/roomserver/state"
|
||||||
|
"github.com/matrix-org/dendrite/roomserver/storage"
|
||||||
"github.com/matrix-org/dendrite/roomserver/types"
|
"github.com/matrix-org/dendrite/roomserver/types"
|
||||||
"github.com/matrix-org/gomatrixserverlib"
|
"github.com/matrix-org/gomatrixserverlib"
|
||||||
"github.com/matrix-org/util"
|
"github.com/matrix-org/util"
|
||||||
|
@ -62,6 +63,7 @@ var processRoomEventDuration = prometheus.NewHistogramVec(
|
||||||
func (r *Inputer) processRoomEvent(
|
func (r *Inputer) processRoomEvent(
|
||||||
ctx context.Context,
|
ctx context.Context,
|
||||||
input *api.InputRoomEvent,
|
input *api.InputRoomEvent,
|
||||||
|
db storage.Database,
|
||||||
) (eventID string, err error) {
|
) (eventID string, err error) {
|
||||||
// Measure how long it takes to process this event.
|
// Measure how long it takes to process this event.
|
||||||
started := time.Now()
|
started := time.Now()
|
||||||
|
@ -79,7 +81,7 @@ func (r *Inputer) processRoomEvent(
|
||||||
// if we have already got this event then do not process it again, if the input kind is an outlier.
|
// if we have already got this event then do not process it again, if the input kind is an outlier.
|
||||||
// Outliers contain no extra information which may warrant a re-processing.
|
// Outliers contain no extra information which may warrant a re-processing.
|
||||||
if input.Kind == api.KindOutlier {
|
if input.Kind == api.KindOutlier {
|
||||||
evs, err2 := r.DB.EventsFromIDs(ctx, []string{event.EventID()})
|
evs, err2 := db.EventsFromIDs(ctx, []string{event.EventID()})
|
||||||
if err2 == nil && len(evs) == 1 {
|
if err2 == nil && len(evs) == 1 {
|
||||||
// check hash matches if we're on early room versions where the event ID was a random string
|
// check hash matches if we're on early room versions where the event ID was a random string
|
||||||
idFormat, err2 := headered.RoomVersion.EventIDFormat()
|
idFormat, err2 := headered.RoomVersion.EventIDFormat()
|
||||||
|
@ -101,7 +103,7 @@ func (r *Inputer) processRoomEvent(
|
||||||
// Check that the event passes authentication checks and work out
|
// Check that the event passes authentication checks and work out
|
||||||
// the numeric IDs for the auth events.
|
// the numeric IDs for the auth events.
|
||||||
isRejected := false
|
isRejected := false
|
||||||
authEventNIDs, rejectionErr := helpers.CheckAuthEvents(ctx, r.DB, headered, input.AuthEventIDs)
|
authEventNIDs, rejectionErr := helpers.CheckAuthEvents(ctx, db, headered, input.AuthEventIDs)
|
||||||
if rejectionErr != nil {
|
if rejectionErr != nil {
|
||||||
logrus.WithError(rejectionErr).WithField("event_id", event.EventID()).WithField("auth_event_ids", input.AuthEventIDs).Error("helpers.CheckAuthEvents failed for event, rejecting event")
|
logrus.WithError(rejectionErr).WithField("event_id", event.EventID()).WithField("auth_event_ids", input.AuthEventIDs).Error("helpers.CheckAuthEvents failed for event, rejecting event")
|
||||||
isRejected = true
|
isRejected = true
|
||||||
|
@ -111,7 +113,7 @@ func (r *Inputer) processRoomEvent(
|
||||||
if input.Kind == api.KindNew {
|
if input.Kind == api.KindNew {
|
||||||
// Check that the event passes authentication checks based on the
|
// Check that the event passes authentication checks based on the
|
||||||
// current room state.
|
// current room state.
|
||||||
softfail, err = helpers.CheckForSoftFail(ctx, r.DB, headered, input.StateEventIDs)
|
softfail, err = helpers.CheckForSoftFail(ctx, db, headered, input.StateEventIDs)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logrus.WithFields(logrus.Fields{
|
logrus.WithFields(logrus.Fields{
|
||||||
"event_id": event.EventID(),
|
"event_id": event.EventID(),
|
||||||
|
|
Loading…
Reference in a new issue