Quick and dirty resolve state for all snapshots

This commit is contained in:
Till Faelligen 2023-10-27 17:36:40 +02:00
parent 317b1018a3
commit 8193fc284f
No known key found for this signature in database
GPG key ID: ACCDC9606D472758
7 changed files with 65 additions and 3 deletions

View file

@ -32,6 +32,7 @@ import (
var roomVersion = flag.String("roomversion", "5", "the room version to parse events as") var roomVersion = flag.String("roomversion", "5", "the room version to parse events as")
var filterType = flag.String("filtertype", "", "the event types to filter on") var filterType = flag.String("filtertype", "", "the event types to filter on")
var difference = flag.Bool("difference", false, "whether to calculate the difference between snapshots") var difference = flag.Bool("difference", false, "whether to calculate the difference between snapshots")
var roomID = flag.String("room_id", "", "roomID to get the state for")
// dummyQuerier implements QuerySenderIDAPI. Does **NOT** do any "magic" for pseudoID rooms // dummyQuerier implements QuerySenderIDAPI. Does **NOT** do any "magic" for pseudoID rooms
// to avoid having to "start" a full roomserver API. // to avoid having to "start" a full roomserver API.
@ -58,8 +59,6 @@ func main() {
args := flag.Args() args := flag.Args()
fmt.Println("Room version", *roomVersion)
snapshotNIDs := []types.StateSnapshotNID{} snapshotNIDs := []types.StateSnapshotNID{}
for _, arg := range args { for _, arg := range args {
if i, err := strconv.Atoi(arg); err == nil { if i, err := strconv.Atoi(arg); err == nil {
@ -89,6 +88,24 @@ func main() {
roomInfo := &types.RoomInfo{ roomInfo := &types.RoomInfo{
RoomVersion: gomatrixserverlib.RoomVersion(*roomVersion), RoomVersion: gomatrixserverlib.RoomVersion(*roomVersion),
} }
if *roomID != "" {
roomInfo, err = roomserverDB.RoomInfo(ctx, *roomID)
if err != nil {
panic(err)
}
if roomInfo == nil {
panic("no room found")
}
snapshotNIDs, err = roomserverDB.GetAllStateSnapshots(ctx, roomInfo.RoomNID)
if err != nil {
panic(err)
}
}
fmt.Println("Room version", roomInfo.RoomVersion)
stateres := state.NewStateResolution(roomserverDB, roomInfo, rsAPI) stateres := state.NewStateResolution(roomserverDB, roomInfo, rsAPI)
fmt.Println("Fetching", len(snapshotNIDs), "snapshot NIDs") fmt.Println("Fetching", len(snapshotNIDs), "snapshot NIDs")
@ -152,7 +169,8 @@ func main() {
} }
var stateEntries []types.StateEntry var stateEntries []types.StateEntry
for _, snapshotNID := range snapshotNIDs { for i, snapshotNID := range snapshotNIDs {
fmt.Printf("\r \a %d of %d", i, len(snapshotNIDs))
var entries []types.StateEntry var entries []types.StateEntry
entries, err = stateres.LoadStateAtSnapshot(ctx, snapshotNID) entries, err = stateres.LoadStateAtSnapshot(ctx, snapshotNID)
if err != nil { if err != nil {
@ -160,6 +178,7 @@ func main() {
} }
stateEntries = append(stateEntries, entries...) stateEntries = append(stateEntries, entries...)
} }
fmt.Println()
eventNIDMap := map[types.EventNID]struct{}{} eventNIDMap := map[types.EventNID]struct{}{}
for _, entry := range stateEntries { for _, entry := range stateEntries {

View file

@ -30,6 +30,7 @@ import (
type Database interface { type Database interface {
UserRoomKeys UserRoomKeys
GetAllStateSnapshots(ctx context.Context, roomNID types.RoomNID) ([]types.StateSnapshotNID, error)
// Do we support processing input events for more than one room at a time? // Do we support processing input events for more than one room at a time?
SupportsConcurrentRoomInputs() bool SupportsConcurrentRoomInputs() bool
AssignRoomNID(ctx context.Context, roomID spec.RoomID, roomVersion gomatrixserverlib.RoomVersion) (roomNID types.RoomNID, err error) AssignRoomNID(ctx context.Context, roomID spec.RoomID, roomVersion gomatrixserverlib.RoomVersion) (roomNID types.RoomNID, err error)

View file

@ -21,6 +21,7 @@ import (
"fmt" "fmt"
"github.com/lib/pq" "github.com/lib/pq"
"github.com/matrix-org/dendrite/internal"
"github.com/matrix-org/gomatrixserverlib" "github.com/matrix-org/gomatrixserverlib"
"github.com/matrix-org/util" "github.com/matrix-org/util"
@ -114,11 +115,14 @@ WHERE re.event_id = ANY($2)
` `
const getAllSnapshotsSQL = "SELECT state_snapshot_nid FROM roomserver_state_snapshots WHERE room_nid = $1"
type stateSnapshotStatements struct { type stateSnapshotStatements struct {
insertStateStmt *sql.Stmt insertStateStmt *sql.Stmt
bulkSelectStateBlockNIDsStmt *sql.Stmt bulkSelectStateBlockNIDsStmt *sql.Stmt
bulkSelectStateForHistoryVisibilityStmt *sql.Stmt bulkSelectStateForHistoryVisibilityStmt *sql.Stmt
bulktSelectMembershipForHistoryVisibilityStmt *sql.Stmt bulktSelectMembershipForHistoryVisibilityStmt *sql.Stmt
getAllSnapshotsStmt *sql.Stmt
} }
func CreateStateSnapshotTable(db *sql.DB) error { func CreateStateSnapshotTable(db *sql.DB) error {
@ -134,9 +138,32 @@ func PrepareStateSnapshotTable(db *sql.DB) (*stateSnapshotStatements, error) {
{&s.bulkSelectStateBlockNIDsStmt, bulkSelectStateBlockNIDsSQL}, {&s.bulkSelectStateBlockNIDsStmt, bulkSelectStateBlockNIDsSQL},
{&s.bulkSelectStateForHistoryVisibilityStmt, bulkSelectStateForHistoryVisibilitySQL}, {&s.bulkSelectStateForHistoryVisibilityStmt, bulkSelectStateForHistoryVisibilitySQL},
{&s.bulktSelectMembershipForHistoryVisibilityStmt, bulkSelectMembershipForHistoryVisibilitySQL}, {&s.bulktSelectMembershipForHistoryVisibilityStmt, bulkSelectMembershipForHistoryVisibilitySQL},
{&s.getAllSnapshotsStmt, getAllSnapshotsSQL},
}.Prepare(db) }.Prepare(db)
} }
func (s *stateSnapshotStatements) GetAllStateSnapshots(ctx context.Context, txn *sql.Tx, roomNID types.RoomNID) ([]types.StateSnapshotNID, error) {
stmt := sqlutil.TxStmt(txn, s.getAllSnapshotsStmt)
rows, err := stmt.QueryContext(ctx, roomNID)
if err != nil {
return nil, err
}
defer internal.CloseAndLogIfError(ctx, rows, "failed to close rows")
nids := make([]types.StateSnapshotNID, 0, 2000)
var nid types.StateSnapshotNID
for rows.Next() {
if err := rows.Scan(&nid); err != nil {
return nil, err
}
nids = append(nids, nid)
}
return nids, rows.Err()
}
func (s *stateSnapshotStatements) InsertState( func (s *stateSnapshotStatements) InsertState(
ctx context.Context, txn *sql.Tx, roomNID types.RoomNID, nids types.StateBlockNIDs, ctx context.Context, txn *sql.Tx, roomNID types.RoomNID, nids types.StateBlockNIDs,
) (stateNID types.StateSnapshotNID, err error) { ) (stateNID types.StateSnapshotNID, err error) {

View file

@ -23,6 +23,7 @@ import (
// Import the postgres database driver. // Import the postgres database driver.
_ "github.com/lib/pq" _ "github.com/lib/pq"
"github.com/matrix-org/dendrite/roomserver/types"
"github.com/matrix-org/dendrite/internal/caching" "github.com/matrix-org/dendrite/internal/caching"
"github.com/matrix-org/dendrite/internal/sqlutil" "github.com/matrix-org/dendrite/internal/sqlutil"
@ -36,6 +37,10 @@ type Database struct {
shared.Database shared.Database
} }
func (d *Database) GetAllStateSnapshots(ctx context.Context, roomNID types.RoomNID) ([]types.StateSnapshotNID, error) {
return d.StateSnapshotTable.GetAllStateSnapshots(ctx, nil, roomNID)
}
// Open a postgres database. // Open a postgres database.
func Open(ctx context.Context, conMan *sqlutil.Connections, dbProperties *config.DatabaseOptions, cache caching.RoomServerCaches) (*Database, error) { func Open(ctx context.Context, conMan *sqlutil.Connections, dbProperties *config.DatabaseOptions, cache caching.RoomServerCaches) (*Database, error) {
var d Database var d Database

View file

@ -181,3 +181,7 @@ func (s *stateSnapshotStatements) selectStateBlockNIDsForRoomNID(
return res, rows.Err() return res, rows.Err()
} }
func (s *stateSnapshotStatements) GetAllStateSnapshots(ctx context.Context, txn *sql.Tx, roomNID types.RoomNID) ([]types.StateSnapshotNID, error) {
return []types.StateSnapshotNID{}, fmt.Errorf("not implemented")
}

View file

@ -35,6 +35,10 @@ type Database struct {
shared.Database shared.Database
} }
func (d *Database) GetAllStateSnapshots(ctx context.Context, roomNID types.RoomNID) ([]types.StateSnapshotNID, error) {
return []types.StateSnapshotNID{}, fmt.Errorf("not implemented")
}
// Open a sqlite database. // Open a sqlite database.
func Open(ctx context.Context, conMan *sqlutil.Connections, dbProperties *config.DatabaseOptions, cache caching.RoomServerCaches) (*Database, error) { func Open(ctx context.Context, conMan *sqlutil.Connections, dbProperties *config.DatabaseOptions, cache caching.RoomServerCaches) (*Database, error) {
var d Database var d Database

View file

@ -96,6 +96,8 @@ type StateSnapshot interface {
BulkSelectMembershipForHistoryVisibility( BulkSelectMembershipForHistoryVisibility(
ctx context.Context, txn *sql.Tx, userNID types.EventStateKeyNID, roomInfo *types.RoomInfo, eventIDs ...string, ctx context.Context, txn *sql.Tx, userNID types.EventStateKeyNID, roomInfo *types.RoomInfo, eventIDs ...string,
) (map[string]*types.HeaderedEvent, error) ) (map[string]*types.HeaderedEvent, error)
GetAllStateSnapshots(ctx context.Context, txn *sql.Tx, roomNID types.RoomNID) ([]types.StateSnapshotNID, error)
} }
type StateBlock interface { type StateBlock interface {