[#1700] engine: Drop unused block execution methods
Some checks failed
Build / Build Components (push) Has been cancelled
OCI image / Build container images (push) Has been cancelled
Pre-commit hooks / Pre-commit (push) Has been cancelled
Tests and linters / Lint (push) Has been cancelled
Tests and linters / Tests (push) Has been cancelled
Tests and linters / Tests with -race (push) Has been cancelled
Tests and linters / Staticcheck (push) Has been cancelled
Tests and linters / gopls check (push) Has been cancelled
Tests and linters / Run gofumpt (push) Has been cancelled
Vulncheck / Vulncheck (push) Has been cancelled
Some checks failed
Build / Build Components (push) Has been cancelled
OCI image / Build container images (push) Has been cancelled
Pre-commit hooks / Pre-commit (push) Has been cancelled
Tests and linters / Lint (push) Has been cancelled
Tests and linters / Tests (push) Has been cancelled
Tests and linters / Tests with -race (push) Has been cancelled
Tests and linters / Staticcheck (push) Has been cancelled
Tests and linters / gopls check (push) Has been cancelled
Tests and linters / Run gofumpt (push) Has been cancelled
Vulncheck / Vulncheck (push) Has been cancelled
`BlockExecution` and `ResumeExecution` were used only by unit test. So drop them and simplify code. Change-Id: Ib3de324617e8a27fc1f015542ac5e94df5c60a6e Signed-off-by: Dmitrii Stepanov <d.stepanov@yadro.com>
This commit is contained in:
parent
e80632884a
commit
fd37cea443
3 changed files with 10 additions and 102 deletions
|
@ -22,10 +22,6 @@ type shardInitError struct {
|
||||||
|
|
||||||
// Open opens all StorageEngine's components.
|
// Open opens all StorageEngine's components.
|
||||||
func (e *StorageEngine) Open(ctx context.Context) error {
|
func (e *StorageEngine) Open(ctx context.Context) error {
|
||||||
return e.open(ctx)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (e *StorageEngine) open(ctx context.Context) error {
|
|
||||||
e.mtx.Lock()
|
e.mtx.Lock()
|
||||||
defer e.mtx.Unlock()
|
defer e.mtx.Unlock()
|
||||||
|
|
||||||
|
@ -149,11 +145,11 @@ var errClosed = errors.New("storage engine is closed")
|
||||||
func (e *StorageEngine) Close(ctx context.Context) error {
|
func (e *StorageEngine) Close(ctx context.Context) error {
|
||||||
close(e.closeCh)
|
close(e.closeCh)
|
||||||
defer e.wg.Wait()
|
defer e.wg.Wait()
|
||||||
return e.setBlockExecErr(ctx, errClosed)
|
return e.closeEngine(ctx)
|
||||||
}
|
}
|
||||||
|
|
||||||
// closes all shards. Never returns an error, shard errors are logged.
|
// closes all shards. Never returns an error, shard errors are logged.
|
||||||
func (e *StorageEngine) close(ctx context.Context) error {
|
func (e *StorageEngine) closeAllShards(ctx context.Context) error {
|
||||||
e.mtx.RLock()
|
e.mtx.RLock()
|
||||||
defer e.mtx.RUnlock()
|
defer e.mtx.RUnlock()
|
||||||
|
|
||||||
|
@ -176,70 +172,23 @@ func (e *StorageEngine) execIfNotBlocked(op func() error) error {
|
||||||
e.blockExec.mtx.RLock()
|
e.blockExec.mtx.RLock()
|
||||||
defer e.blockExec.mtx.RUnlock()
|
defer e.blockExec.mtx.RUnlock()
|
||||||
|
|
||||||
if e.blockExec.err != nil {
|
if e.blockExec.closed {
|
||||||
return e.blockExec.err
|
return errClosed
|
||||||
}
|
}
|
||||||
|
|
||||||
return op()
|
return op()
|
||||||
}
|
}
|
||||||
|
|
||||||
// sets the flag of blocking execution of all data operations according to err:
|
func (e *StorageEngine) closeEngine(ctx context.Context) error {
|
||||||
// - err != nil, then blocks the execution. If exec wasn't blocked, calls close method
|
|
||||||
// (if err == errClosed => additionally releases pools and does not allow to resume executions).
|
|
||||||
// - otherwise, resumes execution. If exec was blocked, calls open method.
|
|
||||||
//
|
|
||||||
// Can be called concurrently with exec. In this case it waits for all executions to complete.
|
|
||||||
func (e *StorageEngine) setBlockExecErr(ctx context.Context, err error) error {
|
|
||||||
e.blockExec.mtx.Lock()
|
e.blockExec.mtx.Lock()
|
||||||
defer e.blockExec.mtx.Unlock()
|
defer e.blockExec.mtx.Unlock()
|
||||||
|
|
||||||
prevErr := e.blockExec.err
|
if e.blockExec.closed {
|
||||||
|
|
||||||
wasClosed := errors.Is(prevErr, errClosed)
|
|
||||||
if wasClosed {
|
|
||||||
return errClosed
|
return errClosed
|
||||||
}
|
}
|
||||||
|
|
||||||
e.blockExec.err = err
|
e.blockExec.closed = true
|
||||||
|
return e.closeAllShards(ctx)
|
||||||
if err == nil {
|
|
||||||
if prevErr != nil { // block -> ok
|
|
||||||
return e.open(ctx)
|
|
||||||
}
|
|
||||||
} else if prevErr == nil { // ok -> block
|
|
||||||
return e.close(ctx)
|
|
||||||
}
|
|
||||||
|
|
||||||
// otherwise do nothing
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// BlockExecution blocks the execution of any data-related operation. All blocked ops will return err.
|
|
||||||
// To resume the execution, use ResumeExecution method.
|
|
||||||
//
|
|
||||||
// Сan be called regardless of the fact of the previous blocking. If execution wasn't blocked, releases all resources
|
|
||||||
// similar to Close. Can be called concurrently with Close and any data related method (waits for all executions
|
|
||||||
// to complete). Returns error if any Close has been called before.
|
|
||||||
//
|
|
||||||
// Must not be called concurrently with either Open or Init.
|
|
||||||
//
|
|
||||||
// Note: technically passing nil error will resume the execution, otherwise, it is recommended to call ResumeExecution
|
|
||||||
// for this.
|
|
||||||
func (e *StorageEngine) BlockExecution(err error) error {
|
|
||||||
return e.setBlockExecErr(context.Background(), err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ResumeExecution resumes the execution of any data-related operation.
|
|
||||||
// To block the execution, use BlockExecution method.
|
|
||||||
//
|
|
||||||
// Сan be called regardless of the fact of the previous blocking. If execution was blocked, prepares all resources
|
|
||||||
// similar to Open. Can be called concurrently with Close and any data related method (waits for all executions
|
|
||||||
// to complete). Returns error if any Close has been called before.
|
|
||||||
//
|
|
||||||
// Must not be called concurrently with either Open or Init.
|
|
||||||
func (e *StorageEngine) ResumeExecution() error {
|
|
||||||
return e.setBlockExecErr(context.Background(), nil)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
type ReConfiguration struct {
|
type ReConfiguration struct {
|
||||||
|
|
|
@ -2,7 +2,6 @@ package engine
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"errors"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
"io/fs"
|
"io/fs"
|
||||||
"os"
|
"os"
|
||||||
|
@ -12,17 +11,14 @@ import (
|
||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"git.frostfs.info/TrueCloudLab/frostfs-node/pkg/core/object"
|
|
||||||
"git.frostfs.info/TrueCloudLab/frostfs-node/pkg/local_object_storage/blobstor"
|
"git.frostfs.info/TrueCloudLab/frostfs-node/pkg/local_object_storage/blobstor"
|
||||||
"git.frostfs.info/TrueCloudLab/frostfs-node/pkg/local_object_storage/blobstor/teststore"
|
"git.frostfs.info/TrueCloudLab/frostfs-node/pkg/local_object_storage/blobstor/teststore"
|
||||||
"git.frostfs.info/TrueCloudLab/frostfs-node/pkg/local_object_storage/internal/testutil"
|
|
||||||
meta "git.frostfs.info/TrueCloudLab/frostfs-node/pkg/local_object_storage/metabase"
|
meta "git.frostfs.info/TrueCloudLab/frostfs-node/pkg/local_object_storage/metabase"
|
||||||
"git.frostfs.info/TrueCloudLab/frostfs-node/pkg/local_object_storage/pilorama"
|
"git.frostfs.info/TrueCloudLab/frostfs-node/pkg/local_object_storage/pilorama"
|
||||||
"git.frostfs.info/TrueCloudLab/frostfs-node/pkg/local_object_storage/shard"
|
"git.frostfs.info/TrueCloudLab/frostfs-node/pkg/local_object_storage/shard"
|
||||||
"git.frostfs.info/TrueCloudLab/frostfs-node/pkg/local_object_storage/shard/mode"
|
"git.frostfs.info/TrueCloudLab/frostfs-node/pkg/local_object_storage/shard/mode"
|
||||||
"git.frostfs.info/TrueCloudLab/frostfs-node/pkg/local_object_storage/writecache"
|
"git.frostfs.info/TrueCloudLab/frostfs-node/pkg/local_object_storage/writecache"
|
||||||
"git.frostfs.info/TrueCloudLab/frostfs-node/pkg/util/logger/test"
|
"git.frostfs.info/TrueCloudLab/frostfs-node/pkg/util/logger/test"
|
||||||
cidtest "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/container/id/test"
|
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
"go.etcd.io/bbolt"
|
"go.etcd.io/bbolt"
|
||||||
)
|
)
|
||||||
|
@ -163,42 +159,6 @@ func testEngineFailInitAndReload(t *testing.T, degradedMode bool, opts []shard.O
|
||||||
require.Equal(t, 1, shardCount)
|
require.Equal(t, 1, shardCount)
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestExecBlocks(t *testing.T) {
|
|
||||||
e := testNewEngine(t).setShardsNum(t, 2).prepare(t).engine // number doesn't matter in this test, 2 is several but not many
|
|
||||||
|
|
||||||
// put some object
|
|
||||||
obj := testutil.GenerateObjectWithCID(cidtest.ID())
|
|
||||||
|
|
||||||
addr := object.AddressOf(obj)
|
|
||||||
|
|
||||||
require.NoError(t, Put(context.Background(), e, obj, false))
|
|
||||||
|
|
||||||
// block executions
|
|
||||||
errBlock := errors.New("block exec err")
|
|
||||||
|
|
||||||
require.NoError(t, e.BlockExecution(errBlock))
|
|
||||||
|
|
||||||
// try to exec some op
|
|
||||||
_, err := Head(context.Background(), e, addr)
|
|
||||||
require.ErrorIs(t, err, errBlock)
|
|
||||||
|
|
||||||
// resume executions
|
|
||||||
require.NoError(t, e.ResumeExecution())
|
|
||||||
|
|
||||||
_, err = Head(context.Background(), e, addr) // can be any data-related op
|
|
||||||
require.NoError(t, err)
|
|
||||||
|
|
||||||
// close
|
|
||||||
require.NoError(t, e.Close(context.Background()))
|
|
||||||
|
|
||||||
// try exec after close
|
|
||||||
_, err = Head(context.Background(), e, addr)
|
|
||||||
require.Error(t, err)
|
|
||||||
|
|
||||||
// try to resume
|
|
||||||
require.Error(t, e.ResumeExecution())
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestPersistentShardID(t *testing.T) {
|
func TestPersistentShardID(t *testing.T) {
|
||||||
dir := t.TempDir()
|
dir := t.TempDir()
|
||||||
|
|
||||||
|
|
|
@ -33,9 +33,8 @@ type StorageEngine struct {
|
||||||
wg sync.WaitGroup
|
wg sync.WaitGroup
|
||||||
|
|
||||||
blockExec struct {
|
blockExec struct {
|
||||||
mtx sync.RWMutex
|
mtx sync.RWMutex
|
||||||
|
closed bool
|
||||||
err error
|
|
||||||
}
|
}
|
||||||
evacuateLimiter *evacuationLimiter
|
evacuateLimiter *evacuationLimiter
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue