mirror of
https://github.com/1f349/dendrite.git
synced 2024-11-08 18:16:59 +00:00
8c6cf51b8f
This is meant to cache client presence for a moment so that it doesn't oscillate. Currently Dendrite just federates out whatever presence it gets from the sync loop, which means if theres any clients attempting to sync without setting the user online, and there is an online client, it will just flip back and forth each time one of the clients polls /sync. This pull request essentially stores in a map when the client last set online ideally to allow the online client to sync again and set an online presence before setting idle or offline. I am not great at programming nor am I familiar with this codebase so if this pr is just shitwater feel free to discard, just trying to fix an issue that severely bothers me. If it is easier you can also steal the code and write it in yourself. I ran the linter, not sure that it did anything, the vscode go extension seems to format and lint anyways. I tried to run unit tests but I have no idea any of this thing. it errors on `TestRequestPool_updatePresence/same_presence_is_not_published_dummy2 (10m0s)` which I think making this change broke. I am unsure how to comply, if y'all point me in the right direction ill try to fix it. I have tested it with all the situations I can think of on my personal instance pain.agency, and this seems to stand up under all the previously bugged situations. ~~My go also decided to update a bunch of the dependencies, I hate git and github and have no idea how to fix that, it was not intentional.~~ i just overwrote them with the ones from the main repo and committed it, seems to have done what was needed. ### Pull Request Checklist <!-- Please read https://matrix-org.github.io/dendrite/development/contributing before submitting your pull request --> * [x] I have added Go unit tests or [Complement integration tests](https://github.com/matrix-org/complement) for this PR _or_ I have justified why this PR doesn't need tests * [x] Pull request includes a [sign off below using a legally identifiable name](https://matrix-org.github.io/dendrite/development/contributing#sign-off) _or_ I have already signed off privately Signed-off-by: `Joseph Winkie <jjj333.p.1325@gmail.com>` --------- Co-authored-by: Till Faelligen <2353100+S7evinK@users.noreply.github.com>
148 lines
3.4 KiB
Go
148 lines
3.4 KiB
Go
package sync
|
|
|
|
import (
|
|
"context"
|
|
"sync"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/matrix-org/dendrite/setup/config"
|
|
"github.com/matrix-org/dendrite/syncapi/synctypes"
|
|
"github.com/matrix-org/dendrite/syncapi/types"
|
|
"github.com/matrix-org/gomatrixserverlib/spec"
|
|
)
|
|
|
|
type dummyPublisher struct {
|
|
lock sync.Mutex
|
|
count int
|
|
}
|
|
|
|
func (d *dummyPublisher) SendPresence(userID string, presence types.Presence, statusMsg *string) error {
|
|
d.lock.Lock()
|
|
defer d.lock.Unlock()
|
|
d.count++
|
|
return nil
|
|
}
|
|
|
|
type dummyDB struct{}
|
|
|
|
func (d dummyDB) UpdatePresence(ctx context.Context, userID string, presence types.Presence, statusMsg *string, lastActiveTS spec.Timestamp, fromSync bool) (types.StreamPosition, error) {
|
|
return 0, nil
|
|
}
|
|
|
|
func (d dummyDB) GetPresences(ctx context.Context, userID []string) ([]*types.PresenceInternal, error) {
|
|
return []*types.PresenceInternal{}, nil
|
|
}
|
|
|
|
func (d dummyDB) PresenceAfter(ctx context.Context, after types.StreamPosition, filter synctypes.EventFilter) (map[string]*types.PresenceInternal, error) {
|
|
return map[string]*types.PresenceInternal{}, nil
|
|
}
|
|
|
|
func (d dummyDB) MaxStreamPositionForPresence(ctx context.Context) (types.StreamPosition, error) {
|
|
return 0, nil
|
|
}
|
|
|
|
type dummyConsumer struct{}
|
|
|
|
func (d dummyConsumer) EmitPresence(ctx context.Context, userID string, presence types.Presence, statusMsg *string, ts spec.Timestamp, fromSync bool) {
|
|
|
|
}
|
|
|
|
func TestRequestPool_updatePresence(t *testing.T) {
|
|
type args struct {
|
|
presence string
|
|
userID string
|
|
sleep time.Duration
|
|
}
|
|
publisher := &dummyPublisher{}
|
|
consumer := &dummyConsumer{}
|
|
syncMap := sync.Map{}
|
|
|
|
tests := []struct {
|
|
name string
|
|
args args
|
|
wantIncrease bool
|
|
}{
|
|
{
|
|
name: "new presence is published",
|
|
wantIncrease: true,
|
|
args: args{
|
|
userID: "dummy",
|
|
},
|
|
},
|
|
{
|
|
name: "presence not published, no change",
|
|
args: args{
|
|
userID: "dummy",
|
|
},
|
|
},
|
|
{
|
|
name: "new presence is published dummy2",
|
|
wantIncrease: true,
|
|
args: args{
|
|
userID: "dummy2",
|
|
presence: "online",
|
|
},
|
|
},
|
|
/*
|
|
TODO: Fixme
|
|
{
|
|
name: "different presence is published dummy2",
|
|
wantIncrease: true,
|
|
args: args{
|
|
userID: "dummy2",
|
|
presence: "unavailable",
|
|
},
|
|
},
|
|
{
|
|
name: "same presence is not published dummy2",
|
|
args: args{
|
|
userID: "dummy2",
|
|
presence: "unavailable",
|
|
sleep: time.Millisecond * 150,
|
|
},
|
|
},
|
|
{
|
|
name: "same presence is published after being deleted",
|
|
wantIncrease: true,
|
|
args: args{
|
|
userID: "dummy2",
|
|
presence: "unavailable",
|
|
},
|
|
},
|
|
*/
|
|
}
|
|
rp := &RequestPool{
|
|
presence: &syncMap,
|
|
producer: publisher,
|
|
consumer: consumer,
|
|
cfg: &config.SyncAPI{
|
|
Matrix: &config.Global{
|
|
JetStream: config.JetStream{
|
|
TopicPrefix: "Dendrite",
|
|
},
|
|
Presence: config.PresenceOptions{
|
|
EnableInbound: true,
|
|
EnableOutbound: true,
|
|
},
|
|
},
|
|
},
|
|
}
|
|
db := dummyDB{}
|
|
go rp.cleanPresence(db, time.Millisecond*50)
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
publisher.lock.Lock()
|
|
beforeCount := publisher.count
|
|
publisher.lock.Unlock()
|
|
rp.updatePresence(db, tt.args.presence, tt.args.userID)
|
|
publisher.lock.Lock()
|
|
if tt.wantIncrease && publisher.count <= beforeCount {
|
|
t.Fatalf("expected count to increase: %d <= %d", publisher.count, beforeCount)
|
|
}
|
|
publisher.lock.Unlock()
|
|
time.Sleep(tt.args.sleep)
|
|
})
|
|
}
|
|
}
|