diff options
| author | 2023-10-31 11:12:22 +0000 | |
|---|---|---|
| committer | 2023-10-31 11:12:22 +0000 | |
| commit | ce71a5a7902963538fc54583588850563f6746cc (patch) | |
| tree | 3e869eba6d25d2db5fe81184ffee595e451b3147 /internal/federation/dereferencing/emoji.go | |
| parent | [bugfix] Relax `Mention` parsing, allowing either href or name (#2320) (diff) | |
| download | gotosocial-ce71a5a7902963538fc54583588850563f6746cc.tar.xz | |
[feature] add per-uri dereferencer locks (#2291)
Diffstat (limited to 'internal/federation/dereferencing/emoji.go')
| -rw-r--r-- | internal/federation/dereferencing/emoji.go | 17 | 
1 files changed, 9 insertions, 8 deletions
diff --git a/internal/federation/dereferencing/emoji.go b/internal/federation/dereferencing/emoji.go index 2d86da663..1bf19d2fd 100644 --- a/internal/federation/dereferencing/emoji.go +++ b/internal/federation/dereferencing/emoji.go @@ -36,8 +36,15 @@ func (d *Dereferencer) GetRemoteEmoji(ctx context.Context, requestingUsername st  		processingEmoji *media.ProcessingEmoji  	) +	// Ensure we have been passed a valid URL. +	derefURI, err := url.Parse(remoteURL) +	if err != nil { +		return nil, fmt.Errorf("GetRemoteEmoji: error parsing url for emoji %s: %s", shortcodeDomain, err) +	} +  	// Acquire lock for derefs map. -	unlock := d.derefEmojisMu.Lock() +	unlock := d.state.FedLocks.Lock(remoteURL) +	unlock = doOnce(unlock)  	defer unlock()  	// first check if we're already processing this emoji @@ -51,11 +58,6 @@ func (d *Dereferencer) GetRemoteEmoji(ctx context.Context, requestingUsername st  			return nil, fmt.Errorf("GetRemoteEmoji: error creating transport to fetch emoji %s: %s", shortcodeDomain, err)  		} -		derefURI, err := url.Parse(remoteURL) -		if err != nil { -			return nil, fmt.Errorf("GetRemoteEmoji: error parsing url for emoji %s: %s", shortcodeDomain, err) -		} -  		dataFunc := func(innerCtx context.Context) (io.ReadCloser, int64, error) {  			return t.DereferenceMedia(innerCtx, derefURI)  		} @@ -75,7 +77,7 @@ func (d *Dereferencer) GetRemoteEmoji(ctx context.Context, requestingUsername st  	defer func() {  		// On exit safely remove emoji from map. -		unlock := d.derefEmojisMu.Lock() +		unlock := d.state.FedLocks.Lock(remoteURL)  		delete(d.derefEmojis, shortcodeDomain)  		unlock()  	}() @@ -95,7 +97,6 @@ func (d *Dereferencer) populateEmojis(ctx context.Context, rawEmojis []*gtsmodel  	// * the shortcode of the emoji  	// * the remote URL of the image  	// This should be enough to dereference the emoji -  	gotEmojis := make([]*gtsmodel.Emoji, 0, len(rawEmojis))  	for _, e := range rawEmojis {  | 
