mirror of
https://github.com/hoernschen/dendrite.git
synced 2025-07-29 12:42:46 +00:00
Ensure only one transaction is used for RS input per room (#2178)
* Ensure the input API only uses a single transaction * Remove more of the dead query API call * Tidy up * Fix tests hopefully * Don't do unnecessary work for rooms that don't exist * Improve error, fix another case where transaction wasn't used properly * Add a unit test for checking single transaction on RS input API * Fix logic oops when deciding whether to use a transaction in storeEvent
This commit is contained in:
parent
a4e7d471af
commit
5106cc807c
13 changed files with 211 additions and 214 deletions
|
@ -16,6 +16,7 @@ type RoomUpdater struct {
|
|||
latestEvents []types.StateAtEventAndReference
|
||||
lastEventIDSent string
|
||||
currentStateSnapshotNID types.StateSnapshotNID
|
||||
roomExists bool
|
||||
}
|
||||
|
||||
func rollback(txn *sql.Tx) {
|
||||
|
@ -33,7 +34,7 @@ func NewRoomUpdater(ctx context.Context, d *Database, txn *sql.Tx, roomInfo *typ
|
|||
// succeed, processing a create event which creates the room, or it won't.
|
||||
if roomInfo == nil {
|
||||
return &RoomUpdater{
|
||||
transaction{ctx, txn}, d, nil, nil, "", 0,
|
||||
transaction{ctx, txn}, d, nil, nil, "", 0, false,
|
||||
}, nil
|
||||
}
|
||||
|
||||
|
@ -57,10 +58,15 @@ func NewRoomUpdater(ctx context.Context, d *Database, txn *sql.Tx, roomInfo *typ
|
|||
}
|
||||
}
|
||||
return &RoomUpdater{
|
||||
transaction{ctx, txn}, d, roomInfo, stateAndRefs, lastEventIDSent, currentStateSnapshotNID,
|
||||
transaction{ctx, txn}, d, roomInfo, stateAndRefs, lastEventIDSent, currentStateSnapshotNID, true,
|
||||
}, nil
|
||||
}
|
||||
|
||||
// RoomExists returns true if the room exists and false otherwise.
|
||||
func (u *RoomUpdater) RoomExists() bool {
|
||||
return u.roomExists
|
||||
}
|
||||
|
||||
// Implements sqlutil.Transaction
|
||||
func (u *RoomUpdater) Commit() error {
|
||||
if u.txn == nil { // SQLite mode probably
|
||||
|
@ -97,6 +103,25 @@ func (u *RoomUpdater) CurrentStateSnapshotNID() types.StateSnapshotNID {
|
|||
return u.currentStateSnapshotNID
|
||||
}
|
||||
|
||||
func (u *RoomUpdater) MissingAuthPrevEvents(
|
||||
ctx context.Context, e *gomatrixserverlib.Event,
|
||||
) (missingAuth, missingPrev []string, err error) {
|
||||
for _, authEventID := range e.AuthEventIDs() {
|
||||
if nids, err := u.EventNIDs(ctx, []string{authEventID}); err != nil || len(nids) == 0 {
|
||||
missingAuth = append(missingAuth, authEventID)
|
||||
}
|
||||
}
|
||||
|
||||
for _, prevEventID := range e.PrevEventIDs() {
|
||||
state, err := u.StateAtEventIDs(ctx, []string{prevEventID})
|
||||
if err != nil || len(state) == 0 || (!state[0].IsCreate() && state[0].BeforeStateSnapshotNID == 0) {
|
||||
missingPrev = append(missingPrev, prevEventID)
|
||||
}
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
// StorePreviousEvents implements types.RoomRecentEventsUpdater - This must be called from a Writer
|
||||
func (u *RoomUpdater) StorePreviousEvents(eventNID types.EventNID, previousEventReferences []gomatrixserverlib.EventReference) error {
|
||||
return u.d.Writer.Do(u.d.DB, u.txn, func(txn *sql.Tx) error {
|
||||
|
|
|
@ -553,7 +553,7 @@ func (d *Database) storeEvent(
|
|||
err error
|
||||
)
|
||||
var txn *sql.Tx
|
||||
if updater != nil {
|
||||
if updater != nil && updater.txn != nil {
|
||||
txn = updater.txn
|
||||
}
|
||||
err = d.Writer.Do(d.DB, txn, func(txn *sql.Tx) error {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue