aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNeil Alexander <neilalexander@users.noreply.github.com>2022-04-26 16:58:20 +0100
committerNeil Alexander <neilalexander@users.noreply.github.com>2022-04-26 16:58:20 +0100
commitb527e33c16d70ee6f94ac12c077b43283ff1fd86 (patch)
treeb638c155536a06149b0b4a130c673173e9a81d96
parentf6d07768a82cdea07c56cf4ae463449292fa9fe4 (diff)
Send all account data on complete sync by default
Squashed commit of the following: commit 0ec8de57261d573a5f88577aa9d7a1174d3999b9 Author: Neil Alexander <neilalexander@users.noreply.github.com> Date: Tue Apr 26 16:56:30 2022 +0100 Select filter onto provided target filter commit da40b6fffbf5737864b223f49900048f557941f9 Author: Neil Alexander <neilalexander@users.noreply.github.com> Date: Tue Apr 26 16:48:00 2022 +0100 Specify other field too commit ffc0b0801f63bb4d3061b6813e3ce5f3b4c8fbcb Author: Neil Alexander <neilalexander@users.noreply.github.com> Date: Tue Apr 26 16:45:44 2022 +0100 Send as much account data as possible during complete sync
-rw-r--r--syncapi/routing/filter.go4
-rw-r--r--syncapi/storage/interface.go6
-rw-r--r--syncapi/storage/postgres/filter_table.go13
-rw-r--r--syncapi/storage/shared/syncserver.go6
-rw-r--r--syncapi/storage/sqlite3/filter_table.go13
-rw-r--r--syncapi/storage/tables/interface.go2
-rw-r--r--syncapi/sync/request.go12
7 files changed, 30 insertions, 26 deletions
diff --git a/syncapi/routing/filter.go b/syncapi/routing/filter.go
index baa4d841..1a10bd64 100644
--- a/syncapi/routing/filter.go
+++ b/syncapi/routing/filter.go
@@ -44,8 +44,8 @@ func GetFilter(
return jsonerror.InternalServerError()
}
- filter, err := syncDB.GetFilter(req.Context(), localpart, filterID)
- if err != nil {
+ filter := gomatrixserverlib.DefaultFilter()
+ if err := syncDB.GetFilter(req.Context(), &filter, localpart, filterID); err != nil {
//TODO better error handling. This error message is *probably* right,
// but if there are obscure db errors, this will also be returned,
// even though it is not correct.
diff --git a/syncapi/storage/interface.go b/syncapi/storage/interface.go
index 13065fa6..43aaa358 100644
--- a/syncapi/storage/interface.go
+++ b/syncapi/storage/interface.go
@@ -125,10 +125,10 @@ type Database interface {
// CleanSendToDeviceUpdates removes all send-to-device messages BEFORE the specified
// from position, preventing the send-to-device table from growing indefinitely.
CleanSendToDeviceUpdates(ctx context.Context, userID, deviceID string, before types.StreamPosition) (err error)
- // GetFilter looks up the filter associated with a given local user and filter ID.
- // Returns a filter structure. Otherwise returns an error if no such filter exists
+ // GetFilter looks up the filter associated with a given local user and filter ID
+ // and populates the target filter. Otherwise returns an error if no such filter exists
// or if there was an error talking to the database.
- GetFilter(ctx context.Context, localpart string, filterID string) (*gomatrixserverlib.Filter, error)
+ GetFilter(ctx context.Context, target *gomatrixserverlib.Filter, localpart string, filterID string) error
// PutFilter puts the passed filter into the database.
// Returns the filterID as a string. Otherwise returns an error if something
// goes wrong.
diff --git a/syncapi/storage/postgres/filter_table.go b/syncapi/storage/postgres/filter_table.go
index dfd3d696..c82ef092 100644
--- a/syncapi/storage/postgres/filter_table.go
+++ b/syncapi/storage/postgres/filter_table.go
@@ -73,21 +73,20 @@ func NewPostgresFilterTable(db *sql.DB) (tables.Filter, error) {
}
func (s *filterStatements) SelectFilter(
- ctx context.Context, localpart string, filterID string,
-) (*gomatrixserverlib.Filter, error) {
+ ctx context.Context, target *gomatrixserverlib.Filter, localpart string, filterID string,
+) error {
// Retrieve filter from database (stored as canonical JSON)
var filterData []byte
err := s.selectFilterStmt.QueryRowContext(ctx, localpart, filterID).Scan(&filterData)
if err != nil {
- return nil, err
+ return err
}
// Unmarshal JSON into Filter struct
- filter := gomatrixserverlib.DefaultFilter()
- if err = json.Unmarshal(filterData, &filter); err != nil {
- return nil, err
+ if err = json.Unmarshal(filterData, &target); err != nil {
+ return err
}
- return &filter, nil
+ return nil
}
func (s *filterStatements) InsertFilter(
diff --git a/syncapi/storage/shared/syncserver.go b/syncapi/storage/shared/syncserver.go
index 69bceb62..25aca50a 100644
--- a/syncapi/storage/shared/syncserver.go
+++ b/syncapi/storage/shared/syncserver.go
@@ -513,9 +513,9 @@ func (d *Database) StreamToTopologicalPosition(
}
func (d *Database) GetFilter(
- ctx context.Context, localpart string, filterID string,
-) (*gomatrixserverlib.Filter, error) {
- return d.Filter.SelectFilter(ctx, localpart, filterID)
+ ctx context.Context, target *gomatrixserverlib.Filter, localpart string, filterID string,
+) error {
+ return d.Filter.SelectFilter(ctx, target, localpart, filterID)
}
func (d *Database) PutFilter(
diff --git a/syncapi/storage/sqlite3/filter_table.go b/syncapi/storage/sqlite3/filter_table.go
index 0cfebef2..6081a48b 100644
--- a/syncapi/storage/sqlite3/filter_table.go
+++ b/syncapi/storage/sqlite3/filter_table.go
@@ -77,21 +77,20 @@ func NewSqliteFilterTable(db *sql.DB) (tables.Filter, error) {
}
func (s *filterStatements) SelectFilter(
- ctx context.Context, localpart string, filterID string,
-) (*gomatrixserverlib.Filter, error) {
+ ctx context.Context, target *gomatrixserverlib.Filter, localpart string, filterID string,
+) error {
// Retrieve filter from database (stored as canonical JSON)
var filterData []byte
err := s.selectFilterStmt.QueryRowContext(ctx, localpart, filterID).Scan(&filterData)
if err != nil {
- return nil, err
+ return err
}
// Unmarshal JSON into Filter struct
- filter := gomatrixserverlib.DefaultFilter()
- if err = json.Unmarshal(filterData, &filter); err != nil {
- return nil, err
+ if err = json.Unmarshal(filterData, &target); err != nil {
+ return err
}
- return &filter, nil
+ return nil
}
func (s *filterStatements) InsertFilter(
diff --git a/syncapi/storage/tables/interface.go b/syncapi/storage/tables/interface.go
index 32b1c34e..4ff4689e 100644
--- a/syncapi/storage/tables/interface.go
+++ b/syncapi/storage/tables/interface.go
@@ -157,7 +157,7 @@ type SendToDevice interface {
}
type Filter interface {
- SelectFilter(ctx context.Context, localpart string, filterID string) (*gomatrixserverlib.Filter, error)
+ SelectFilter(ctx context.Context, target *gomatrixserverlib.Filter, localpart string, filterID string) error
InsertFilter(ctx context.Context, filter *gomatrixserverlib.Filter, localpart string) (filterID string, err error)
}
diff --git a/syncapi/sync/request.go b/syncapi/sync/request.go
index f04f172d..c9ee8e4a 100644
--- a/syncapi/sync/request.go
+++ b/syncapi/sync/request.go
@@ -18,6 +18,7 @@ import (
"database/sql"
"encoding/json"
"fmt"
+ "math"
"net/http"
"strconv"
"time"
@@ -47,6 +48,13 @@ func newSyncRequest(req *http.Request, device userapi.Device, syncDB storage.Dat
}
// TODO: read from stored filters too
filter := gomatrixserverlib.DefaultFilter()
+ if since.IsEmpty() {
+ // Send as much account data down for complete syncs as possible
+ // by default, otherwise clients do weird things while waiting
+ // for the rest of the data to trickle down.
+ filter.AccountData.Limit = math.MaxInt
+ filter.Room.AccountData.Limit = math.MaxInt
+ }
filterQuery := req.URL.Query().Get("filter")
if filterQuery != "" {
if filterQuery[0] == '{' {
@@ -61,11 +69,9 @@ func newSyncRequest(req *http.Request, device userapi.Device, syncDB storage.Dat
util.GetLogger(req.Context()).WithError(err).Error("gomatrixserverlib.SplitID failed")
return nil, fmt.Errorf("gomatrixserverlib.SplitID: %w", err)
}
- if f, err := syncDB.GetFilter(req.Context(), localpart, filterQuery); err != nil && err != sql.ErrNoRows {
+ if err := syncDB.GetFilter(req.Context(), &filter, localpart, filterQuery); err != nil && err != sql.ErrNoRows {
util.GetLogger(req.Context()).WithError(err).Error("syncDB.GetFilter failed")
return nil, fmt.Errorf("syncDB.GetFilter: %w", err)
- } else if f != nil {
- filter = *f
}
}
}