keep a cache of activity IDs we have handled creates for

This commit is contained in:
kim 2025-01-15 16:00:25 +00:00
commit 2aee3a2605
5 changed files with 15 additions and 9 deletions

View file

@ -63,6 +63,10 @@ func (f *federatingDB) Create(ctx context.Context, asType vocab.Type) error {
return nil return nil
} }
// Cache entry for this create activity ID for later
// checks in the Exist() function if we see it again.
f.createdIDs.Set(ap.GetJSONLDId(asType).String(), struct{}{})
switch name := asType.GetTypeName(); name { switch name := asType.GetTypeName(); name {
case ap.ActivityBlock: case ap.ActivityBlock:
// BLOCK SOMETHING // BLOCK SOMETHING

View file

@ -21,6 +21,7 @@ import (
"context" "context"
"net/url" "net/url"
"codeberg.org/gruf/go-cache/v3/simple"
"github.com/superseriousbusiness/activity/pub" "github.com/superseriousbusiness/activity/pub"
"github.com/superseriousbusiness/activity/streams/vocab" "github.com/superseriousbusiness/activity/streams/vocab"
"github.com/superseriousbusiness/gotosocial/internal/filter/interaction" "github.com/superseriousbusiness/gotosocial/internal/filter/interaction"
@ -61,6 +62,10 @@ type federatingDB struct {
visFilter *visibility.Filter visFilter *visibility.Filter
intFilter *interaction.Filter intFilter *interaction.Filter
spamFilter *spam.Filter spamFilter *spam.Filter
// tracks Activity IDs we have handled creates for,
// for use in the Exists() function during forwarding.
createdIDs simple.Cache[string, struct{}]
} }
// New returns a DB that satisfies the pub.Database // New returns a DB that satisfies the pub.Database
@ -79,5 +84,6 @@ func New(
intFilter: intFilter, intFilter: intFilter,
spamFilter: spamFilter, spamFilter: spamFilter,
} }
fdb.createdIDs.Init(0, 1000)
return &fdb return &fdb
} }

View file

@ -22,12 +22,8 @@ import (
"net/url" "net/url"
) )
// Exists returns true if the database has an entry for the specified // Exists is an implementation of pub.Database{}.Exists(), optimized specifically for
// id. It may not be owned by this application instance. // the only usecase in which go-fed/activity/pub actually calls it. Do not use otherwise!
//
// The library makes this call only after acquiring a lock first.
//
// Implementation note: this just straight up isn't implemented, and doesn't *really* need to be either.
func (f *federatingDB) Exists(ctx context.Context, id *url.URL) (exists bool, err error) { func (f *federatingDB) Exists(ctx context.Context, id *url.URL) (exists bool, err error) {
return false, nil return f.createdIDs.Has(id.String()), nil
} }

View file

@ -33,7 +33,7 @@ import (
var _ interface { var _ interface {
pub.CommonBehavior pub.CommonBehavior
pub.FederatingProtocol pub.FederatingProtocol
} = &Federator{} } = (*Federator)(nil)
type Federator struct { type Federator struct {
db db.DB db db.DB

View file

@ -49,7 +49,7 @@ import (
// Note that the library will not maintain a long-lived pointer to the // Note that the library will not maintain a long-lived pointer to the
// returned Transport so that any private credentials are able to be // returned Transport so that any private credentials are able to be
// garbage collected. // garbage collected.
func (f *Federator) NewTransport(ctx context.Context, actorBoxIRI *url.URL, gofedAgent string) (pub.Transport, error) { func (f *Federator) NewTransport(ctx context.Context, actorBoxIRI *url.URL, _ string) (pub.Transport, error) {
var username string var username string
var err error var err error