mirror of
https://github.com/superseriousbusiness/gotosocial.git
synced 2024-05-20 09:18:13 +00:00
5318054808
* media processor consolidation and reformatting, reduce amount of required syscalls Signed-off-by: kim <grufwub@gmail.com> * update go-store library, stream jpeg/png encoding + use buffer pools, improved media processing AlreadyExists error handling Signed-off-by: kim <grufwub@gmail.com> * fix duration not being set, fix mp4 test expecting error Signed-off-by: kim <grufwub@gmail.com> * fix test expecting media files with different extension Signed-off-by: kim <grufwub@gmail.com> * remove unused code Signed-off-by: kim <grufwub@gmail.com> * fix expected storage paths in tests, update expected test thumbnails Signed-off-by: kim <grufwub@gmail.com> * remove dead code Signed-off-by: kim <grufwub@gmail.com> * fix cached presigned s3 url fetching Signed-off-by: kim <grufwub@gmail.com> * fix tests Signed-off-by: kim <grufwub@gmail.com> * fix test models Signed-off-by: kim <grufwub@gmail.com> * update media processing to use sync.Once{} for concurrency protection Signed-off-by: kim <grufwub@gmail.com> * shutup linter Signed-off-by: kim <grufwub@gmail.com> * fix passing in KVStore GetStream() as stream to PutStream() Signed-off-by: kim <grufwub@gmail.com> * fix unlocks of storage keys Signed-off-by: kim <grufwub@gmail.com> * whoops, return the error... Signed-off-by: kim <grufwub@gmail.com> * pour one out for tobi's code <3 Signed-off-by: kim <grufwub@gmail.com> * add back the byte slurping code Signed-off-by: kim <grufwub@gmail.com> * check for both ErrUnexpectedEOF and EOF Signed-off-by: kim <grufwub@gmail.com> * add back links to file format header information Signed-off-by: kim <grufwub@gmail.com> Signed-off-by: kim <grufwub@gmail.com>
117 lines
3.4 KiB
Go
117 lines
3.4 KiB
Go
package kv
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"io"
|
|
|
|
"codeberg.org/gruf/go-mutexes"
|
|
)
|
|
|
|
// ErrStateClosed is returned on further calls to states after calling Release().
|
|
var ErrStateClosed = errors.New("store/kv: state closed")
|
|
|
|
// StateRO provides a read-only window to the store. While this
|
|
// state is active during the Read() function window, the entire
|
|
// store will be read-locked. The state is thread-safe for concurrent
|
|
// use UNTIL the moment that your supplied function to Read() returns.
|
|
type StateRO struct {
|
|
store *KVStore
|
|
state *mutexes.LockState
|
|
}
|
|
|
|
// Get: see KVStore.Get(). Returns error if state already closed.
|
|
func (st *StateRO) Get(ctx context.Context, key string) ([]byte, error) {
|
|
if st.store == nil {
|
|
return nil, ErrStateClosed
|
|
}
|
|
return st.store.get(st.state.RLock, ctx, key)
|
|
}
|
|
|
|
// GetStream: see KVStore.GetStream(). Returns error if state already closed.
|
|
func (st *StateRO) GetStream(ctx context.Context, key string) (io.ReadCloser, error) {
|
|
if st.store == nil {
|
|
return nil, ErrStateClosed
|
|
}
|
|
return st.store.getStream(st.state.RLock, ctx, key)
|
|
}
|
|
|
|
// Has: see KVStore.Has(). Returns error if state already closed.
|
|
func (st *StateRO) Has(ctx context.Context, key string) (bool, error) {
|
|
if st.store == nil {
|
|
return false, ErrStateClosed
|
|
}
|
|
return st.store.has(st.state.RLock, ctx, key)
|
|
}
|
|
|
|
// Release will release the store read-lock, and close this state.
|
|
func (st *StateRO) Release() {
|
|
st.state.UnlockMap()
|
|
st.state = nil
|
|
st.store = nil
|
|
}
|
|
|
|
// StateRW provides a read-write window to the store. While this
|
|
// state is active during the Update() function window, the entire
|
|
// store will be locked. The state is thread-safe for concurrent
|
|
// use UNTIL the moment that your supplied function to Update() returns.
|
|
type StateRW struct {
|
|
store *KVStore
|
|
state *mutexes.LockState
|
|
}
|
|
|
|
// Get: see KVStore.Get(). Returns error if state already closed.
|
|
func (st *StateRW) Get(ctx context.Context, key string) ([]byte, error) {
|
|
if st.store == nil {
|
|
return nil, ErrStateClosed
|
|
}
|
|
return st.store.get(st.state.RLock, ctx, key)
|
|
}
|
|
|
|
// GetStream: see KVStore.GetStream(). Returns error if state already closed.
|
|
func (st *StateRW) GetStream(ctx context.Context, key string) (io.ReadCloser, error) {
|
|
if st.store == nil {
|
|
return nil, ErrStateClosed
|
|
}
|
|
return st.store.getStream(st.state.RLock, ctx, key)
|
|
}
|
|
|
|
// Put: see KVStore.Put(). Returns error if state already closed.
|
|
func (st *StateRW) Put(ctx context.Context, key string, value []byte) (int, error) {
|
|
if st.store == nil {
|
|
return 0, ErrStateClosed
|
|
}
|
|
return st.store.put(st.state.Lock, ctx, key, value)
|
|
}
|
|
|
|
// PutStream: see KVStore.PutStream(). Returns error if state already closed.
|
|
func (st *StateRW) PutStream(ctx context.Context, key string, r io.Reader) (int64, error) {
|
|
if st.store == nil {
|
|
return 0, ErrStateClosed
|
|
}
|
|
return st.store.putStream(st.state.Lock, ctx, key, r)
|
|
}
|
|
|
|
// Has: see KVStore.Has(). Returns error if state already closed.
|
|
func (st *StateRW) Has(ctx context.Context, key string) (bool, error) {
|
|
if st.store == nil {
|
|
return false, ErrStateClosed
|
|
}
|
|
return st.store.has(st.state.RLock, ctx, key)
|
|
}
|
|
|
|
// Delete: see KVStore.Delete(). Returns error if state already closed.
|
|
func (st *StateRW) Delete(ctx context.Context, key string) error {
|
|
if st.store == nil {
|
|
return ErrStateClosed
|
|
}
|
|
return st.store.delete(st.state.Lock, ctx, key)
|
|
}
|
|
|
|
// Release will release the store lock, and close this state.
|
|
func (st *StateRW) Release() {
|
|
st.state.UnlockMap()
|
|
st.state = nil
|
|
st.store = nil
|
|
}
|