mirror of
https://github.com/matrix-org/dendrite.git
synced 2024-11-26 08:11:55 -06:00
Quick and dirty resolve state for all snapshots
This commit is contained in:
parent
317b1018a3
commit
8193fc284f
|
@ -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 {
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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")
|
||||||
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
Loading…
Reference in a new issue