Apply gofumpt #772
139 changed files with 309 additions and 247 deletions
|
@ -47,6 +47,15 @@ repos:
|
||||||
types: [go]
|
types: [go]
|
||||||
language: system
|
language: system
|
||||||
|
|
||||||
|
- repo: local
|
||||||
|
hooks:
|
||||||
|
- id: gofumpt
|
||||||
|
name: gofumpt
|
||||||
|
entry: make fumpt
|
||||||
|
pass_filenames: false
|
||||||
|
types: [go]
|
||||||
|
language: system
|
||||||
|
|
||||||
- repo: https://github.com/TekWizely/pre-commit-golang
|
- repo: https://github.com/TekWizely/pre-commit-golang
|
||||||
rev: v1.0.0-rc.1
|
rev: v1.0.0-rc.1
|
||||||
hooks:
|
hooks:
|
||||||
|
|
13
Makefile
13
Makefile
|
@ -30,7 +30,7 @@ OUTPUT_LINT_DIR ?= $(shell pwd)/bin
|
||||||
LINT_DIR = $(OUTPUT_LINT_DIR)/golangci-lint-$(LINT_VERSION)-v$(TRUECLOUDLAB_LINT_VERSION)
|
LINT_DIR = $(OUTPUT_LINT_DIR)/golangci-lint-$(LINT_VERSION)-v$(TRUECLOUDLAB_LINT_VERSION)
|
||||||
TMP_DIR := .cache
|
TMP_DIR := .cache
|
||||||
|
|
||||||
.PHONY: help all images dep clean fmts fmt imports test lint docker/lint
|
.PHONY: help all images dep clean fmts fumpt imports test lint docker/lint
|
||||||
prepare-release debpackage pre-commit unpre-commit
|
prepare-release debpackage pre-commit unpre-commit
|
||||||
|
|
||||||
# To build a specific binary, use it's name prefix with bin/ as a target
|
# To build a specific binary, use it's name prefix with bin/ as a target
|
||||||
|
@ -122,18 +122,17 @@ docker/%:
|
||||||
|
|
||||||
|
|
||||||
# Run all code formatters
|
# Run all code formatters
|
||||||
fmts: fmt imports
|
fmts: fumpt imports
|
||||||
|
|
||||||
# Reformat code
|
|
||||||
fmt:
|
|
||||||
@echo "⇒ Processing gofmt check"
|
|
||||||
@gofmt -s -w cmd/ pkg/ misc/
|
|
||||||
|
|
||||||
# Reformat imports
|
# Reformat imports
|
||||||
imports:
|
imports:
|
||||||
@echo "⇒ Processing goimports check"
|
@echo "⇒ Processing goimports check"
|
||||||
@goimports -w cmd/ pkg/ misc/
|
@goimports -w cmd/ pkg/ misc/
|
||||||
|
|
||||||
|
fumpt:
|
||||||
|
@echo "⇒ Processing gofumpt check"
|
||||||
|
@gofumpt -l -w cmd/ pkg/ misc/
|
||||||
|
|
||||||
# Run Unit Test with go test
|
# Run Unit Test with go test
|
||||||
test:
|
test:
|
||||||
@echo "⇒ Running go test"
|
@echo "⇒ Running go test"
|
||||||
|
|
|
@ -50,12 +50,12 @@ func initConfig(cmd *cobra.Command, _ []string) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
pathDir := filepath.Dir(configPath)
|
pathDir := filepath.Dir(configPath)
|
||||||
err = os.MkdirAll(pathDir, 0700)
|
err = os.MkdirAll(pathDir, 0o700)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("create dir %s: %w", pathDir, err)
|
return fmt.Errorf("create dir %s: %w", pathDir, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
f, err := os.OpenFile(configPath, os.O_RDWR|os.O_CREATE|os.O_TRUNC|os.O_SYNC, 0600)
|
f, err := os.OpenFile(configPath, os.O_RDWR|os.O_CREATE|os.O_TRUNC|os.O_SYNC, 0o600)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("open %s: %w", configPath, err)
|
return fmt.Errorf("open %s: %w", configPath, err)
|
||||||
}
|
}
|
||||||
|
|
|
@ -76,7 +76,7 @@ func initializeWallets(v *viper.Viper, walletDir string, size int) ([]string, er
|
||||||
}
|
}
|
||||||
|
|
||||||
p := filepath.Join(walletDir, innerring.GlagoliticLetter(i).String()+".json")
|
p := filepath.Join(walletDir, innerring.GlagoliticLetter(i).String()+".json")
|
||||||
f, err := os.OpenFile(p, os.O_CREATE, 0644)
|
f, err := os.OpenFile(p, os.O_CREATE, 0o644)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("can't create wallet file: %w", err)
|
return nil, fmt.Errorf("can't create wallet file: %w", err)
|
||||||
}
|
}
|
||||||
|
|
|
@ -83,7 +83,7 @@ func newLocalClient(cmd *cobra.Command, v *viper.Viper, wallets []*wallet.Wallet
|
||||||
go bc.Run()
|
go bc.Run()
|
||||||
|
|
||||||
if cmd.Name() != "init" {
|
if cmd.Name() != "init" {
|
||||||
f, err := os.OpenFile(dumpPath, os.O_RDONLY, 0600)
|
f, err := os.OpenFile(dumpPath, os.O_RDONLY, 0o600)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("can't open local dump: %w", err)
|
return nil, fmt.Errorf("can't open local dump: %w", err)
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,16 +15,14 @@ import (
|
||||||
"github.com/spf13/viper"
|
"github.com/spf13/viper"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var rootCmd = &cobra.Command{
|
||||||
rootCmd = &cobra.Command{
|
Use: "frostfs-adm",
|
||||||
Use: "frostfs-adm",
|
Short: "FrostFS Administrative Tool",
|
||||||
Short: "FrostFS Administrative Tool",
|
Long: `FrostFS Administrative Tool provides functions to setup and
|
||||||
Long: `FrostFS Administrative Tool provides functions to setup and
|
|
||||||
manage FrostFS network deployment.`,
|
manage FrostFS network deployment.`,
|
||||||
RunE: entryPoint,
|
RunE: entryPoint,
|
||||||
SilenceUsage: true,
|
SilenceUsage: true,
|
||||||
}
|
}
|
||||||
)
|
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
cobra.OnInitialize(func() { initConfig(rootCmd) })
|
cobra.OnInitialize(func() { initConfig(rootCmd) })
|
||||||
|
|
|
@ -145,7 +145,7 @@ func storageConfig(cmd *cobra.Command, args []string) {
|
||||||
}
|
}
|
||||||
|
|
||||||
out := applyTemplate(c)
|
out := applyTemplate(c)
|
||||||
fatalOnErr(os.WriteFile(outPath, out, 0644))
|
fatalOnErr(os.WriteFile(outPath, out, 0o644))
|
||||||
|
|
||||||
cmd.Println("Node is ready for work! Run `frostfs-node -config " + outPath + "`")
|
cmd.Println("Node is ready for work! Run `frostfs-node -config " + outPath + "`")
|
||||||
}
|
}
|
||||||
|
|
|
@ -106,7 +106,7 @@ func createEACL(cmd *cobra.Command, _ []string) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
err = os.WriteFile(outArg, buf.Bytes(), 0644)
|
err = os.WriteFile(outArg, buf.Bytes(), 0o644)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
cmd.PrintErrln(err)
|
cmd.PrintErrln(err)
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
|
|
|
@ -130,6 +130,6 @@ func createToken(cmd *cobra.Command, _ []string) {
|
||||||
}
|
}
|
||||||
|
|
||||||
out, _ := cmd.Flags().GetString(outFlag)
|
out, _ := cmd.Flags().GetString(outFlag)
|
||||||
err = os.WriteFile(out, data, 0644)
|
err = os.WriteFile(out, data, 0o644)
|
||||||
commonCmd.ExitOnErr(cmd, "can't write token to file: %w", err)
|
commonCmd.ExitOnErr(cmd, "can't write token to file: %w", err)
|
||||||
}
|
}
|
||||||
|
|
|
@ -51,7 +51,7 @@ var getContainerInfoCmd = &cobra.Command{
|
||||||
data = cnr.Marshal()
|
data = cnr.Marshal()
|
||||||
}
|
}
|
||||||
|
|
||||||
err = os.WriteFile(containerPathTo, data, 0644)
|
err = os.WriteFile(containerPathTo, data, 0o644)
|
||||||
commonCmd.ExitOnErr(cmd, "can't write container to file: %w", err)
|
commonCmd.ExitOnErr(cmd, "can't write container to file: %w", err)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
|
@ -52,7 +52,7 @@ var getExtendedACLCmd = &cobra.Command{
|
||||||
|
|
||||||
cmd.Println("dumping data to file:", containerPathTo)
|
cmd.Println("dumping data to file:", containerPathTo)
|
||||||
|
|
||||||
err = os.WriteFile(containerPathTo, data, 0644)
|
err = os.WriteFile(containerPathTo, data, 0o644)
|
||||||
commonCmd.ExitOnErr(cmd, "could not write eACL to file: %w", err)
|
commonCmd.ExitOnErr(cmd, "could not write eACL to file: %w", err)
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,7 +20,7 @@ var containerNodesCmd = &cobra.Command{
|
||||||
Short: "Show nodes for container",
|
Short: "Show nodes for container",
|
||||||
Long: "Show nodes taking part in a container at the current epoch.",
|
Long: "Show nodes taking part in a container at the current epoch.",
|
||||||
Run: func(cmd *cobra.Command, args []string) {
|
Run: func(cmd *cobra.Command, args []string) {
|
||||||
var cnr, pkey = getContainer(cmd)
|
cnr, pkey := getContainer(cmd)
|
||||||
|
|
||||||
if pkey == nil {
|
if pkey == nil {
|
||||||
pkey = key.GetOrGenerate(cmd)
|
pkey = key.GetOrGenerate(cmd)
|
||||||
|
|
|
@ -132,7 +132,7 @@ func createOutWriter(cmd *cobra.Command, filename string) (out io.Writer, closer
|
||||||
out = os.Stdout
|
out = os.Stdout
|
||||||
closer = func() {}
|
closer = func() {}
|
||||||
} else {
|
} else {
|
||||||
f, err := os.OpenFile(filename, os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0644)
|
f, err := os.OpenFile(filename, os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0o644)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
commonCmd.ExitOnErr(cmd, "", fmt.Errorf("can't open file '%s': %w", filename, err))
|
commonCmd.ExitOnErr(cmd, "", fmt.Errorf("can't open file '%s': %w", filename, err))
|
||||||
}
|
}
|
||||||
|
|
|
@ -191,7 +191,7 @@ func getRequiredPlacement(cmd *cobra.Command, objInfo *objectNodesInfo, placemen
|
||||||
numOfReplicas := placementPolicy.ReplicaNumberByIndex(repIdx)
|
numOfReplicas := placementPolicy.ReplicaNumberByIndex(repIdx)
|
||||||
var nodeIdx uint32
|
var nodeIdx uint32
|
||||||
for _, n := range rep {
|
for _, n := range rep {
|
||||||
if !objInfo.isLock && nodeIdx == numOfReplicas { //lock object should be on all container nodes
|
if !objInfo.isLock && nodeIdx == numOfReplicas { // lock object should be on all container nodes
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
nodes[n.Hash()] = n
|
nodes[n.Hash()] = n
|
||||||
|
@ -213,7 +213,8 @@ func getRequiredPlacement(cmd *cobra.Command, objInfo *objectNodesInfo, placemen
|
||||||
}
|
}
|
||||||
|
|
||||||
func getActualPlacement(cmd *cobra.Command, netmap *netmapSDK.NetMap, requiredPlacement map[uint64]netmapSDK.NodeInfo,
|
func getActualPlacement(cmd *cobra.Command, netmap *netmapSDK.NetMap, requiredPlacement map[uint64]netmapSDK.NodeInfo,
|
||||||
pk *ecdsa.PrivateKey, objInfo *objectNodesInfo) map[uint64]boolError {
|
pk *ecdsa.PrivateKey, objInfo *objectNodesInfo,
|
||||||
|
) map[uint64]boolError {
|
||||||
result := make(map[uint64]boolError)
|
result := make(map[uint64]boolError)
|
||||||
resultMtx := &sync.Mutex{}
|
resultMtx := &sync.Mutex{}
|
||||||
|
|
||||||
|
|
|
@ -31,7 +31,8 @@ func init() {
|
||||||
objectHashCmd,
|
objectHashCmd,
|
||||||
objectRangeCmd,
|
objectRangeCmd,
|
||||||
objectLockCmd,
|
objectLockCmd,
|
||||||
objectNodesCmd}
|
objectNodesCmd,
|
||||||
|
}
|
||||||
|
|
||||||
Cmd.AddCommand(objectChildCommands...)
|
Cmd.AddCommand(objectChildCommands...)
|
||||||
|
|
||||||
|
|
|
@ -81,7 +81,7 @@ func createSession(cmd *cobra.Command, _ []string) {
|
||||||
}
|
}
|
||||||
|
|
||||||
filename, _ := cmd.Flags().GetString(outFlag)
|
filename, _ := cmd.Flags().GetString(outFlag)
|
||||||
err = os.WriteFile(filename, data, 0644)
|
err = os.WriteFile(filename, data, 0o644)
|
||||||
commonCmd.ExitOnErr(cmd, "can't write token to file: %w", err)
|
commonCmd.ExitOnErr(cmd, "can't write token to file: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -48,7 +48,7 @@ func convertEACLTable(cmd *cobra.Command, _ []string) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
err = os.WriteFile(to, data, 0644)
|
err = os.WriteFile(to, data, 0o644)
|
||||||
commonCmd.ExitOnErr(cmd, "can't write exteded ACL table to file: %w", err)
|
commonCmd.ExitOnErr(cmd, "can't write exteded ACL table to file: %w", err)
|
||||||
|
|
||||||
cmd.Printf("extended ACL table was successfully dumped to %s\n", to)
|
cmd.Printf("extended ACL table was successfully dumped to %s\n", to)
|
||||||
|
|
|
@ -78,7 +78,7 @@ func keyerGenerate(filename string, d *keyer.Dashboard) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
if filename != "" {
|
if filename != "" {
|
||||||
return os.WriteFile(filename, key, 0600)
|
return os.WriteFile(filename, key, 0o600)
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
|
|
@ -56,7 +56,7 @@ func signBearerToken(cmd *cobra.Command, _ []string) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
err = os.WriteFile(to, data, 0644)
|
err = os.WriteFile(to, data, 0o644)
|
||||||
commonCmd.ExitOnErr(cmd, "can't write signed bearer token to file: %w", err)
|
commonCmd.ExitOnErr(cmd, "can't write signed bearer token to file: %w", err)
|
||||||
|
|
||||||
cmd.Printf("signed bearer token was successfully dumped to %s\n", to)
|
cmd.Printf("signed bearer token was successfully dumped to %s\n", to)
|
||||||
|
|
|
@ -76,7 +76,7 @@ func signSessionToken(cmd *cobra.Command, _ []string) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
err = os.WriteFile(to, data, 0644)
|
err = os.WriteFile(to, data, 0o644)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
commonCmd.ExitOnErr(cmd, "", fmt.Errorf("can't write signed session token to %s: %w", to, err))
|
commonCmd.ExitOnErr(cmd, "", fmt.Errorf("can't write signed session token to %s: %w", to, err))
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,7 +13,7 @@ import (
|
||||||
|
|
||||||
func newConfig() (*viper.Viper, error) {
|
func newConfig() (*viper.Viper, error) {
|
||||||
var err error
|
var err error
|
||||||
var dv = viper.New()
|
dv := viper.New()
|
||||||
|
|
||||||
defaultConfiguration(dv)
|
defaultConfiguration(dv)
|
||||||
|
|
||||||
|
|
|
@ -59,7 +59,7 @@ func WriteObjectToFile(cmd *cobra.Command, path string, data []byte) {
|
||||||
}
|
}
|
||||||
|
|
||||||
ExitOnErr(cmd, Errf("could not write file: %w",
|
ExitOnErr(cmd, Errf("could not write file: %w",
|
||||||
os.WriteFile(path, data, 0644)))
|
os.WriteFile(path, data, 0o644)))
|
||||||
|
|
||||||
cmd.Printf("\nSaved payload to '%s' file\n", path)
|
cmd.Printf("\nSaved payload to '%s' file\n", path)
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,7 +22,7 @@ func TestApiclientSection(t *testing.T) {
|
||||||
|
|
||||||
const path = "../../../../config/example/node"
|
const path = "../../../../config/example/node"
|
||||||
|
|
||||||
var fileConfigTest = func(c *config.Config) {
|
fileConfigTest := func(c *config.Config) {
|
||||||
require.Equal(t, 15*time.Second, apiclientconfig.DialTimeout(c))
|
require.Equal(t, 15*time.Second, apiclientconfig.DialTimeout(c))
|
||||||
require.Equal(t, 20*time.Second, apiclientconfig.StreamTimeout(c))
|
require.Equal(t, 20*time.Second, apiclientconfig.StreamTimeout(c))
|
||||||
require.Equal(t, 30*time.Second, apiclientconfig.ReconnectTimeout(c))
|
require.Equal(t, 30*time.Second, apiclientconfig.ReconnectTimeout(c))
|
||||||
|
|
|
@ -38,7 +38,6 @@ func New(configFile, configDir, envPrefix string) *Config {
|
||||||
configViper.WithConfigFile(configFile),
|
configViper.WithConfigFile(configFile),
|
||||||
configViper.WithConfigDir(configDir),
|
configViper.WithConfigDir(configDir),
|
||||||
configViper.WithEnvPrefix(envPrefix))
|
configViper.WithEnvPrefix(envPrefix))
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,8 +15,8 @@ func TestConfigDir(t *testing.T) {
|
||||||
cfgFileName0 := path.Join(dir, "cfg_00.json")
|
cfgFileName0 := path.Join(dir, "cfg_00.json")
|
||||||
cfgFileName1 := path.Join(dir, "cfg_01.yml")
|
cfgFileName1 := path.Join(dir, "cfg_01.yml")
|
||||||
|
|
||||||
require.NoError(t, os.WriteFile(cfgFileName0, []byte(`{"storage":{"shard_pool_size":15}}`), 0777))
|
require.NoError(t, os.WriteFile(cfgFileName0, []byte(`{"storage":{"shard_pool_size":15}}`), 0o777))
|
||||||
require.NoError(t, os.WriteFile(cfgFileName1, []byte("logger:\n level: debug"), 0777))
|
require.NoError(t, os.WriteFile(cfgFileName1, []byte("logger:\n level: debug"), 0o777))
|
||||||
|
|
||||||
c := New("", dir, "")
|
c := New("", dir, "")
|
||||||
require.Equal(t, "debug", cast.ToString(c.Sub("logger").Value("level")))
|
require.Equal(t, "debug", cast.ToString(c.Sub("logger").Value("level")))
|
||||||
|
|
|
@ -35,7 +35,7 @@ func TestContractsSection(t *testing.T) {
|
||||||
expProxy, err := util.Uint160DecodeStringLE("ad7c6b55b737b696e5c82c85445040964a03e97f")
|
expProxy, err := util.Uint160DecodeStringLE("ad7c6b55b737b696e5c82c85445040964a03e97f")
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
var fileConfigTest = func(c *config.Config) {
|
fileConfigTest := func(c *config.Config) {
|
||||||
balance := contractsconfig.Balance(c)
|
balance := contractsconfig.Balance(c)
|
||||||
container := contractsconfig.Container(c)
|
container := contractsconfig.Container(c)
|
||||||
netmap := contractsconfig.Netmap(c)
|
netmap := contractsconfig.Netmap(c)
|
||||||
|
|
|
@ -24,7 +24,7 @@ func TestControlSection(t *testing.T) {
|
||||||
pubs[0], _ = keys.NewPublicKeyFromString("035839e45d472a3b7769a2a1bd7d54c4ccd4943c3b40f547870e83a8fcbfb3ce11")
|
pubs[0], _ = keys.NewPublicKeyFromString("035839e45d472a3b7769a2a1bd7d54c4ccd4943c3b40f547870e83a8fcbfb3ce11")
|
||||||
pubs[1], _ = keys.NewPublicKeyFromString("028f42cfcb74499d7b15b35d9bff260a1c8d27de4f446a627406a382d8961486d6")
|
pubs[1], _ = keys.NewPublicKeyFromString("028f42cfcb74499d7b15b35d9bff260a1c8d27de4f446a627406a382d8961486d6")
|
||||||
|
|
||||||
var fileConfigTest = func(c *config.Config) {
|
fileConfigTest := func(c *config.Config) {
|
||||||
require.Equal(t, pubs, controlconfig.AuthorizedKeys(c))
|
require.Equal(t, pubs, controlconfig.AuthorizedKeys(c))
|
||||||
require.Equal(t, "localhost:8090", controlconfig.GRPC(c).Endpoint())
|
require.Equal(t, "localhost:8090", controlconfig.GRPC(c).Endpoint())
|
||||||
}
|
}
|
||||||
|
|
|
@ -42,7 +42,7 @@ func TestEngineSection(t *testing.T) {
|
||||||
|
|
||||||
const path = "../../../../config/example/node"
|
const path = "../../../../config/example/node"
|
||||||
|
|
||||||
var fileConfigTest = func(c *config.Config) {
|
fileConfigTest := func(c *config.Config) {
|
||||||
num := 0
|
num := 0
|
||||||
|
|
||||||
require.EqualValues(t, 100, engineconfig.ShardErrorThreshold(c))
|
require.EqualValues(t, 100, engineconfig.ShardErrorThreshold(c))
|
||||||
|
@ -78,7 +78,7 @@ func TestEngineSection(t *testing.T) {
|
||||||
require.EqualValues(t, 3221225472, wc.SizeLimit())
|
require.EqualValues(t, 3221225472, wc.SizeLimit())
|
||||||
|
|
||||||
require.Equal(t, "tmp/0/meta", meta.Path())
|
require.Equal(t, "tmp/0/meta", meta.Path())
|
||||||
require.Equal(t, fs.FileMode(0644), meta.BoltDB().Perm())
|
require.Equal(t, fs.FileMode(0o644), meta.BoltDB().Perm())
|
||||||
require.Equal(t, 100, meta.BoltDB().MaxBatchSize())
|
require.Equal(t, 100, meta.BoltDB().MaxBatchSize())
|
||||||
require.Equal(t, 10*time.Millisecond, meta.BoltDB().MaxBatchDelay())
|
require.Equal(t, 10*time.Millisecond, meta.BoltDB().MaxBatchDelay())
|
||||||
|
|
||||||
|
@ -89,7 +89,7 @@ func TestEngineSection(t *testing.T) {
|
||||||
require.Equal(t, 2, len(ss))
|
require.Equal(t, 2, len(ss))
|
||||||
blz := blobovniczaconfig.From((*config.Config)(ss[0]))
|
blz := blobovniczaconfig.From((*config.Config)(ss[0]))
|
||||||
require.Equal(t, "tmp/0/blob/blobovnicza", ss[0].Path())
|
require.Equal(t, "tmp/0/blob/blobovnicza", ss[0].Path())
|
||||||
require.EqualValues(t, 0644, blz.BoltDB().Perm())
|
require.EqualValues(t, 0o644, blz.BoltDB().Perm())
|
||||||
require.EqualValues(t, 4194304, blz.Size())
|
require.EqualValues(t, 4194304, blz.Size())
|
||||||
require.EqualValues(t, 1, blz.ShallowDepth())
|
require.EqualValues(t, 1, blz.ShallowDepth())
|
||||||
require.EqualValues(t, 4, blz.ShallowWidth())
|
require.EqualValues(t, 4, blz.ShallowWidth())
|
||||||
|
@ -97,7 +97,7 @@ func TestEngineSection(t *testing.T) {
|
||||||
require.EqualValues(t, 10, blz.LeafWidth())
|
require.EqualValues(t, 10, blz.LeafWidth())
|
||||||
|
|
||||||
require.Equal(t, "tmp/0/blob", ss[1].Path())
|
require.Equal(t, "tmp/0/blob", ss[1].Path())
|
||||||
require.EqualValues(t, 0644, ss[1].Perm())
|
require.EqualValues(t, 0o644, ss[1].Perm())
|
||||||
|
|
||||||
fst := fstreeconfig.From((*config.Config)(ss[1]))
|
fst := fstreeconfig.From((*config.Config)(ss[1]))
|
||||||
require.EqualValues(t, 5, fst.Depth())
|
require.EqualValues(t, 5, fst.Depth())
|
||||||
|
@ -112,7 +112,7 @@ func TestEngineSection(t *testing.T) {
|
||||||
require.Equal(t, mode.ReadOnly, sc.Mode())
|
require.Equal(t, mode.ReadOnly, sc.Mode())
|
||||||
case 1:
|
case 1:
|
||||||
require.Equal(t, "tmp/1/blob/pilorama.db", pl.Path())
|
require.Equal(t, "tmp/1/blob/pilorama.db", pl.Path())
|
||||||
require.Equal(t, fs.FileMode(0644), pl.Perm())
|
require.Equal(t, fs.FileMode(0o644), pl.Perm())
|
||||||
require.True(t, pl.NoSync())
|
require.True(t, pl.NoSync())
|
||||||
require.Equal(t, 5*time.Millisecond, pl.MaxBatchDelay())
|
require.Equal(t, 5*time.Millisecond, pl.MaxBatchDelay())
|
||||||
require.Equal(t, 100, pl.MaxBatchSize())
|
require.Equal(t, 100, pl.MaxBatchSize())
|
||||||
|
@ -127,7 +127,7 @@ func TestEngineSection(t *testing.T) {
|
||||||
require.EqualValues(t, 4294967296, wc.SizeLimit())
|
require.EqualValues(t, 4294967296, wc.SizeLimit())
|
||||||
|
|
||||||
require.Equal(t, "tmp/1/meta", meta.Path())
|
require.Equal(t, "tmp/1/meta", meta.Path())
|
||||||
require.Equal(t, fs.FileMode(0644), meta.BoltDB().Perm())
|
require.Equal(t, fs.FileMode(0o644), meta.BoltDB().Perm())
|
||||||
require.Equal(t, 200, meta.BoltDB().MaxBatchSize())
|
require.Equal(t, 200, meta.BoltDB().MaxBatchSize())
|
||||||
require.Equal(t, 20*time.Millisecond, meta.BoltDB().MaxBatchDelay())
|
require.Equal(t, 20*time.Millisecond, meta.BoltDB().MaxBatchDelay())
|
||||||
|
|
||||||
|
@ -146,7 +146,7 @@ func TestEngineSection(t *testing.T) {
|
||||||
require.EqualValues(t, 10, blz.LeafWidth())
|
require.EqualValues(t, 10, blz.LeafWidth())
|
||||||
|
|
||||||
require.Equal(t, "tmp/1/blob", ss[1].Path())
|
require.Equal(t, "tmp/1/blob", ss[1].Path())
|
||||||
require.EqualValues(t, 0644, ss[1].Perm())
|
require.EqualValues(t, 0o644, ss[1].Perm())
|
||||||
|
|
||||||
fst := fstreeconfig.From((*config.Config)(ss[1]))
|
fst := fstreeconfig.From((*config.Config)(ss[1]))
|
||||||
require.EqualValues(t, 5, fst.Depth())
|
require.EqualValues(t, 5, fst.Depth())
|
||||||
|
|
|
@ -9,7 +9,7 @@ import (
|
||||||
type Config config.Config
|
type Config config.Config
|
||||||
|
|
||||||
// PermDefault are default permission bits for BlobStor data.
|
// PermDefault are default permission bits for BlobStor data.
|
||||||
const PermDefault = 0660
|
const PermDefault = 0o660
|
||||||
|
|
||||||
func From(x *config.Config) *Config {
|
func From(x *config.Config) *Config {
|
||||||
return (*Config)(x)
|
return (*Config)(x)
|
||||||
|
|
|
@ -13,7 +13,7 @@ type Config config.Config
|
||||||
|
|
||||||
const (
|
const (
|
||||||
// PermDefault is a default permission bits for metabase file.
|
// PermDefault is a default permission bits for metabase file.
|
||||||
PermDefault = 0660
|
PermDefault = 0o660
|
||||||
)
|
)
|
||||||
|
|
||||||
// Perm returns the value of "perm" config parameter as a fs.FileMode.
|
// Perm returns the value of "perm" config parameter as a fs.FileMode.
|
||||||
|
|
|
@ -13,7 +13,7 @@ type Config config.Config
|
||||||
|
|
||||||
const (
|
const (
|
||||||
// PermDefault is a default permission bits for metabase file.
|
// PermDefault is a default permission bits for metabase file.
|
||||||
PermDefault = 0660
|
PermDefault = 0o660
|
||||||
)
|
)
|
||||||
|
|
||||||
// From wraps config section into Config.
|
// From wraps config section into Config.
|
||||||
|
|
|
@ -17,7 +17,7 @@ func TestGRPCSection(t *testing.T) {
|
||||||
|
|
||||||
const path = "../../../../config/example/node"
|
const path = "../../../../config/example/node"
|
||||||
|
|
||||||
var fileConfigTest = func(c *config.Config) {
|
fileConfigTest := func(c *config.Config) {
|
||||||
num := 0
|
num := 0
|
||||||
|
|
||||||
IterateEndpoints(c, func(sc *Config) {
|
IterateEndpoints(c, func(sc *Config) {
|
||||||
|
|
|
@ -17,7 +17,7 @@ func TestLoggerSection_Level(t *testing.T) {
|
||||||
|
|
||||||
const path = "../../../../config/example/node"
|
const path = "../../../../config/example/node"
|
||||||
|
|
||||||
var fileConfigTest = func(c *config.Config) {
|
fileConfigTest := func(c *config.Config) {
|
||||||
v := loggerconfig.Level(c)
|
v := loggerconfig.Level(c)
|
||||||
require.Equal(t, "debug", v)
|
require.Equal(t, "debug", v)
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,7 +22,7 @@ func TestMetricsSection(t *testing.T) {
|
||||||
|
|
||||||
const path = "../../../../config/example/node"
|
const path = "../../../../config/example/node"
|
||||||
|
|
||||||
var fileConfigTest = func(c *config.Config) {
|
fileConfigTest := func(c *config.Config) {
|
||||||
to := metricsconfig.ShutdownTimeout(c)
|
to := metricsconfig.ShutdownTimeout(c)
|
||||||
addr := metricsconfig.Address(c)
|
addr := metricsconfig.Address(c)
|
||||||
|
|
||||||
|
|
|
@ -23,14 +23,12 @@ func TestMorphSection(t *testing.T) {
|
||||||
|
|
||||||
const path = "../../../../config/example/node"
|
const path = "../../../../config/example/node"
|
||||||
|
|
||||||
var (
|
rpcs := []client.Endpoint{
|
||||||
rpcs = []client.Endpoint{
|
{"wss://rpc1.morph.frostfs.info:40341/ws", 1},
|
||||||
{"wss://rpc1.morph.frostfs.info:40341/ws", 1},
|
{"wss://rpc2.morph.frostfs.info:40341/ws", 2},
|
||||||
{"wss://rpc2.morph.frostfs.info:40341/ws", 2},
|
}
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
var fileConfigTest = func(c *config.Config) {
|
fileConfigTest := func(c *config.Config) {
|
||||||
require.Equal(t, rpcs, morphconfig.RPCEndpoint(c))
|
require.Equal(t, rpcs, morphconfig.RPCEndpoint(c))
|
||||||
require.Equal(t, 30*time.Second, morphconfig.DialTimeout(c))
|
require.Equal(t, 30*time.Second, morphconfig.DialTimeout(c))
|
||||||
require.Equal(t, 15*time.Second, morphconfig.CacheTTL(c))
|
require.Equal(t, 15*time.Second, morphconfig.CacheTTL(c))
|
||||||
|
|
|
@ -56,7 +56,7 @@ func TestNodeSection(t *testing.T) {
|
||||||
|
|
||||||
const path = "../../../../config/example/node"
|
const path = "../../../../config/example/node"
|
||||||
|
|
||||||
var fileConfigTest = func(c *config.Config) {
|
fileConfigTest := func(c *config.Config) {
|
||||||
key := Key(c)
|
key := Key(c)
|
||||||
addrs := BootstrapAddresses(c)
|
addrs := BootstrapAddresses(c)
|
||||||
attributes := Attributes(c)
|
attributes := Attributes(c)
|
||||||
|
|
|
@ -21,7 +21,7 @@ func TestObjectSection(t *testing.T) {
|
||||||
|
|
||||||
const path = "../../../../config/example/node"
|
const path = "../../../../config/example/node"
|
||||||
|
|
||||||
var fileConfigTest = func(c *config.Config) {
|
fileConfigTest := func(c *config.Config) {
|
||||||
require.Equal(t, 100, objectconfig.Put(c).PoolSizeRemote())
|
require.Equal(t, 100, objectconfig.Put(c).PoolSizeRemote())
|
||||||
require.Equal(t, 200, objectconfig.Put(c).PoolSizeLocal())
|
require.Equal(t, 200, objectconfig.Put(c).PoolSizeLocal())
|
||||||
require.EqualValues(t, 10, objectconfig.TombstoneLifetime(c))
|
require.EqualValues(t, 10, objectconfig.TombstoneLifetime(c))
|
||||||
|
|
|
@ -19,7 +19,7 @@ func TestPolicerSection(t *testing.T) {
|
||||||
|
|
||||||
const path = "../../../../config/example/node"
|
const path = "../../../../config/example/node"
|
||||||
|
|
||||||
var fileConfigTest = func(c *config.Config) {
|
fileConfigTest := func(c *config.Config) {
|
||||||
require.Equal(t, 15*time.Second, policerconfig.HeadTimeout(c))
|
require.Equal(t, 15*time.Second, policerconfig.HeadTimeout(c))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -25,7 +25,7 @@ func TestProfilerSection(t *testing.T) {
|
||||||
|
|
||||||
const path = "../../../../config/example/node"
|
const path = "../../../../config/example/node"
|
||||||
|
|
||||||
var fileConfigTest = func(c *config.Config) {
|
fileConfigTest := func(c *config.Config) {
|
||||||
to := profilerconfig.ShutdownTimeout(c)
|
to := profilerconfig.ShutdownTimeout(c)
|
||||||
addr := profilerconfig.Address(c)
|
addr := profilerconfig.Address(c)
|
||||||
|
|
||||||
|
|
|
@ -20,7 +20,7 @@ func TestReplicatorSection(t *testing.T) {
|
||||||
|
|
||||||
const path = "../../../../config/example/node"
|
const path = "../../../../config/example/node"
|
||||||
|
|
||||||
var fileConfigTest = func(c *config.Config) {
|
fileConfigTest := func(c *config.Config) {
|
||||||
require.Equal(t, 15*time.Second, replicatorconfig.PutTimeout(c))
|
require.Equal(t, 15*time.Second, replicatorconfig.PutTimeout(c))
|
||||||
require.Equal(t, 10, replicatorconfig.PoolSize(c))
|
require.Equal(t, 10, replicatorconfig.PoolSize(c))
|
||||||
}
|
}
|
||||||
|
|
|
@ -35,7 +35,7 @@ func TestTreeSection(t *testing.T) {
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
expectedKeys = append(expectedKeys, key)
|
expectedKeys = append(expectedKeys, key)
|
||||||
|
|
||||||
var fileConfigTest = func(c *config.Config) {
|
fileConfigTest := func(c *config.Config) {
|
||||||
treeSec := treeconfig.Tree(c)
|
treeSec := treeconfig.Tree(c)
|
||||||
|
|
||||||
require.True(t, treeSec.Enabled())
|
require.True(t, treeSec.Enabled())
|
||||||
|
|
|
@ -239,7 +239,8 @@ func listenMorphNotifications(ctx context.Context, c *cfg) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func registerNotificationHandlers(scHash util.Uint160, lis event.Listener, parsers map[event.Type]event.NotificationParser,
|
func registerNotificationHandlers(scHash util.Uint160, lis event.Listener, parsers map[event.Type]event.NotificationParser,
|
||||||
subs map[event.Type][]event.Handler) {
|
subs map[event.Type][]event.Handler,
|
||||||
|
) {
|
||||||
for typ, handlers := range subs {
|
for typ, handlers := range subs {
|
||||||
pi := event.NotificationParserInfo{}
|
pi := event.NotificationParserInfo{}
|
||||||
pi.SetType(typ)
|
pi.SetType(typ)
|
||||||
|
|
|
@ -353,7 +353,8 @@ func createSearchSvcV2(sSearch *searchsvc.Service, keyStorage *util.KeyStorage)
|
||||||
}
|
}
|
||||||
|
|
||||||
func createGetService(c *cfg, keyStorage *util.KeyStorage, traverseGen *util.TraverserGenerator,
|
func createGetService(c *cfg, keyStorage *util.KeyStorage, traverseGen *util.TraverserGenerator,
|
||||||
coreConstructor *cache.ClientCache) *getsvc.Service {
|
coreConstructor *cache.ClientCache,
|
||||||
|
) *getsvc.Service {
|
||||||
ls := c.cfgObject.cfgLocalStorage.localStorage
|
ls := c.cfgObject.cfgLocalStorage.localStorage
|
||||||
|
|
||||||
return getsvc.New(
|
return getsvc.New(
|
||||||
|
@ -375,7 +376,8 @@ func createGetServiceV2(sGet *getsvc.Service, keyStorage *util.KeyStorage) *gets
|
||||||
}
|
}
|
||||||
|
|
||||||
func createDeleteService(c *cfg, keyStorage *util.KeyStorage, sGet *getsvc.Service,
|
func createDeleteService(c *cfg, keyStorage *util.KeyStorage, sGet *getsvc.Service,
|
||||||
sSearch *searchsvc.Service, sPut *putsvc.Service) *deletesvc.Service {
|
sSearch *searchsvc.Service, sPut *putsvc.Service,
|
||||||
|
) *deletesvc.Service {
|
||||||
return deletesvc.New(
|
return deletesvc.New(
|
||||||
sGet,
|
sGet,
|
||||||
sSearch,
|
sSearch,
|
||||||
|
@ -396,7 +398,8 @@ func createDeleteServiceV2(sDelete *deletesvc.Service) *deletesvcV2.Service {
|
||||||
}
|
}
|
||||||
|
|
||||||
func createSplitService(c *cfg, sPutV2 *putsvcV2.Service, sGetV2 *getsvcV2.Service,
|
func createSplitService(c *cfg, sPutV2 *putsvcV2.Service, sGetV2 *getsvcV2.Service,
|
||||||
sSearchV2 *searchsvcV2.Service, sDeleteV2 *deletesvcV2.Service) *objectService.TransportSplitter {
|
sSearchV2 *searchsvcV2.Service, sDeleteV2 *deletesvcV2.Service,
|
||||||
|
) *objectService.TransportSplitter {
|
||||||
return objectService.NewTransportSplitter(
|
return objectService.NewTransportSplitter(
|
||||||
c.cfgGRPC.maxChunkSize,
|
c.cfgGRPC.maxChunkSize,
|
||||||
c.cfgGRPC.maxAddrAmount,
|
c.cfgGRPC.maxAddrAmount,
|
||||||
|
|
|
@ -23,7 +23,7 @@ func initTracing(ctx context.Context, c *cfg) {
|
||||||
fn: func() {
|
fn: func() {
|
||||||
ctx, cancel := context.WithTimeout(context.Background(), time.Second*5)
|
ctx, cancel := context.WithTimeout(context.Background(), time.Second*5)
|
||||||
defer cancel()
|
defer cancel()
|
||||||
err := tracing.Shutdown(ctx) //cfg context cancels before close
|
err := tracing.Shutdown(ctx) // cfg context cancels before close
|
||||||
if err != nil {
|
if err != nil {
|
||||||
c.log.Error(logs.FrostFSNodeFailedShutdownTracing, zap.Error(err))
|
c.log.Error(logs.FrostFSNodeFailedShutdownTracing, zap.Error(err))
|
||||||
}
|
}
|
||||||
|
|
|
@ -59,7 +59,7 @@ func validateConfig(c *config.Config) error {
|
||||||
default:
|
default:
|
||||||
return fmt.Errorf("unexpected storage type: %s (shard %d)", blobstor[i].Type(), shardNum)
|
return fmt.Errorf("unexpected storage type: %s (shard %d)", blobstor[i].Type(), shardNum)
|
||||||
}
|
}
|
||||||
if blobstor[i].Perm()&0600 != 0600 {
|
if blobstor[i].Perm()&0o600 != 0o600 {
|
||||||
return fmt.Errorf("invalid permissions for blobstor component: %s, "+
|
return fmt.Errorf("invalid permissions for blobstor component: %s, "+
|
||||||
"expected at least rw- for the owner (shard %d)",
|
"expected at least rw- for the owner (shard %d)",
|
||||||
blobstor[i].Perm(), shardNum)
|
blobstor[i].Perm(), shardNum)
|
||||||
|
|
|
@ -10,7 +10,8 @@ import (
|
||||||
// PrettyPrintNodeInfo print information about network node with given indent and index.
|
// PrettyPrintNodeInfo print information about network node with given indent and index.
|
||||||
// To avoid printing attribute list use short parameter.
|
// To avoid printing attribute list use short parameter.
|
||||||
func PrettyPrintNodeInfo(cmd *cobra.Command, node netmap.NodeInfo,
|
func PrettyPrintNodeInfo(cmd *cobra.Command, node netmap.NodeInfo,
|
||||||
index int, indent string, short bool) {
|
index int, indent string, short bool,
|
||||||
|
) {
|
||||||
var strState string
|
var strState string
|
||||||
|
|
||||||
switch {
|
switch {
|
||||||
|
|
|
@ -22,7 +22,8 @@ func NodeInfoFromRawNetmapElement(dst *NodeInfo, info interface {
|
||||||
IterateAddresses(func(string) bool)
|
IterateAddresses(func(string) bool)
|
||||||
NumberOfAddresses() int
|
NumberOfAddresses() int
|
||||||
ExternalAddresses() []string
|
ExternalAddresses() []string
|
||||||
}) error {
|
},
|
||||||
|
) error {
|
||||||
var a network.AddressGroup
|
var a network.AddressGroup
|
||||||
|
|
||||||
err := a.FromIterator(info)
|
err := a.FromIterator(info)
|
||||||
|
@ -49,7 +50,8 @@ func NodeInfoFromNetmapElement(dst *NodeInfo, info interface {
|
||||||
PublicKey() []byte
|
PublicKey() []byte
|
||||||
Addresses() network.AddressGroup
|
Addresses() network.AddressGroup
|
||||||
ExternalAddresses() network.AddressGroup
|
ExternalAddresses() network.AddressGroup
|
||||||
}) {
|
},
|
||||||
|
) {
|
||||||
nodeInfoFromKeyAddr(dst, info.PublicKey(), info.Addresses(), info.ExternalAddresses())
|
nodeInfoFromKeyAddr(dst, info.PublicKey(), info.Addresses(), info.ExternalAddresses())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -43,7 +43,8 @@ func (c SenderClassifier) Classify(
|
||||||
ownerID *user.ID,
|
ownerID *user.ID,
|
||||||
ownerKey *keys.PublicKey,
|
ownerKey *keys.PublicKey,
|
||||||
idCnr cid.ID,
|
idCnr cid.ID,
|
||||||
cnr container.Container) (res *ClassifyResult, err error) {
|
cnr container.Container,
|
||||||
|
) (res *ClassifyResult, err error) {
|
||||||
ownerKeyInBytes := ownerKey.Bytes()
|
ownerKeyInBytes := ownerKey.Bytes()
|
||||||
|
|
||||||
// TODO: #767 get owner from frostfs.id if present
|
// TODO: #767 get owner from frostfs.id if present
|
||||||
|
@ -114,7 +115,8 @@ func (c SenderClassifier) isInnerRingKey(owner []byte) (bool, error) {
|
||||||
|
|
||||||
func (c SenderClassifier) isContainerKey(
|
func (c SenderClassifier) isContainerKey(
|
||||||
owner, idCnr []byte,
|
owner, idCnr []byte,
|
||||||
cnr container.Container) (bool, error) {
|
cnr container.Container,
|
||||||
|
) (bool, error) {
|
||||||
nm, err := core.GetLatestNetworkMap(c.netmap) // first check current netmap
|
nm, err := core.GetLatestNetworkMap(c.netmap) // first check current netmap
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return false, err
|
return false, err
|
||||||
|
@ -140,7 +142,8 @@ func (c SenderClassifier) isContainerKey(
|
||||||
func lookupKeyInContainer(
|
func lookupKeyInContainer(
|
||||||
nm *netmap.NetMap,
|
nm *netmap.NetMap,
|
||||||
owner, idCnr []byte,
|
owner, idCnr []byte,
|
||||||
cnr container.Container) (bool, error) {
|
cnr container.Container,
|
||||||
|
) (bool, error) {
|
||||||
cnrVectors, err := nm.ContainerNodes(cnr.PlacementPolicy(), idCnr)
|
cnrVectors, err := nm.ContainerNodes(cnr.PlacementPolicy(), idCnr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return false, err
|
return false, err
|
||||||
|
|
|
@ -117,6 +117,7 @@ type testEpochState struct {
|
||||||
func (s *testEpochState) EpochCounter() uint64 {
|
func (s *testEpochState) EpochCounter() uint64 {
|
||||||
return s.counter
|
return s.counter
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *testEpochState) EpochDuration() uint64 {
|
func (s *testEpochState) EpochDuration() uint64 {
|
||||||
return s.duration
|
return s.duration
|
||||||
}
|
}
|
||||||
|
|
|
@ -60,5 +60,4 @@ fee:
|
||||||
require.Equal(t, fixedn.Fixed8(10), config.MainChainFee(), "main chain fee invalid")
|
require.Equal(t, fixedn.Fixed8(10), config.MainChainFee(), "main chain fee invalid")
|
||||||
require.Equal(t, fixedn.Fixed8(0), config.SideChainFee(), "side chain fee invalid")
|
require.Equal(t, fixedn.Fixed8(0), config.SideChainFee(), "side chain fee invalid")
|
||||||
})
|
})
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -35,7 +35,8 @@ import (
|
||||||
|
|
||||||
func (s *Server) initNetmapProcessor(cfg *viper.Viper,
|
func (s *Server) initNetmapProcessor(cfg *viper.Viper,
|
||||||
cnrClient *container.Client,
|
cnrClient *container.Client,
|
||||||
alphaSync event.Handler) error {
|
alphaSync event.Handler,
|
||||||
|
) error {
|
||||||
locodeValidator, err := s.newLocodeValidator(cfg)
|
locodeValidator, err := s.newLocodeValidator(cfg)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
@ -250,7 +251,8 @@ func (s *Server) initAlphabetProcessor(cfg *viper.Viper) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *Server) initContainerProcessor(cfg *viper.Viper, cnrClient *container.Client,
|
func (s *Server) initContainerProcessor(cfg *viper.Viper, cnrClient *container.Client,
|
||||||
frostfsIDClient *frostfsid.Client) error {
|
frostfsIDClient *frostfsid.Client,
|
||||||
|
) error {
|
||||||
// container processor
|
// container processor
|
||||||
containerProcessor, err := cont.New(&cont.Params{
|
containerProcessor, err := cont.New(&cont.Params{
|
||||||
Log: s.log,
|
Log: s.log,
|
||||||
|
|
|
@ -328,7 +328,8 @@ func (s *Server) registerStarter(f func() error) {
|
||||||
|
|
||||||
// New creates instance of inner ring sever structure.
|
// New creates instance of inner ring sever structure.
|
||||||
func New(ctx context.Context, log *logger.Logger, cfg *viper.Viper, errChan chan<- error,
|
func New(ctx context.Context, log *logger.Logger, cfg *viper.Viper, errChan chan<- error,
|
||||||
metrics *metrics.InnerRingServiceMetrics) (*Server, error) {
|
metrics *metrics.InnerRingServiceMetrics,
|
||||||
|
) (*Server, error) {
|
||||||
var err error
|
var err error
|
||||||
server := &Server{
|
server := &Server{
|
||||||
log: log,
|
log: log,
|
||||||
|
|
|
@ -256,6 +256,7 @@ func (c *testMorphClient) Invoke(contract util.Uint160, fee fixedn.Fixed8, metho
|
||||||
})
|
})
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *testMorphClient) TransferGas(receiver util.Uint160, amount fixedn.Fixed8) error {
|
func (c *testMorphClient) TransferGas(receiver util.Uint160, amount fixedn.Fixed8) error {
|
||||||
c.transferedGas = append(c.transferedGas, transferGas{
|
c.transferedGas = append(c.transferedGas, transferGas{
|
||||||
receiver: receiver,
|
receiver: receiver,
|
||||||
|
|
|
@ -73,8 +73,7 @@ func (s *testAlphabetState) IsAlphabet() bool {
|
||||||
return s.isAlphabet
|
return s.isAlphabet
|
||||||
}
|
}
|
||||||
|
|
||||||
type testPresicionConverter struct {
|
type testPresicionConverter struct{}
|
||||||
}
|
|
||||||
|
|
||||||
func (c *testPresicionConverter) ToFixed8(v int64) int64 {
|
func (c *testPresicionConverter) ToFixed8(v int64) int64 {
|
||||||
return v
|
return v
|
||||||
|
|
|
@ -319,6 +319,7 @@ func (e *testPutEvent) Signature() []byte {
|
||||||
func (e *testPutEvent) SessionToken() []byte {
|
func (e *testPutEvent) SessionToken() []byte {
|
||||||
return e.st
|
return e.st
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *testPutEvent) NotaryRequest() *payload.P2PNotaryRequest {
|
func (e *testPutEvent) NotaryRequest() *payload.P2PNotaryRequest {
|
||||||
return e.nr
|
return e.nr
|
||||||
}
|
}
|
||||||
|
|
|
@ -301,8 +301,7 @@ func (s *testAlphabetState) IsAlphabet() bool {
|
||||||
return s.isAlphabet
|
return s.isAlphabet
|
||||||
}
|
}
|
||||||
|
|
||||||
type testPrecisionConverter struct {
|
type testPrecisionConverter struct{}
|
||||||
}
|
|
||||||
|
|
||||||
func (c *testPrecisionConverter) ToBalancePrecision(v int64) int64 {
|
func (c *testPrecisionConverter) ToBalancePrecision(v int64) int64 {
|
||||||
return v
|
return v
|
||||||
|
@ -318,10 +317,12 @@ func (c *testBalaceClient) Mint(p balance.MintPrm) error {
|
||||||
c.mint = append(c.mint, p)
|
c.mint = append(c.mint, p)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *testBalaceClient) Lock(p balance.LockPrm) error {
|
func (c *testBalaceClient) Lock(p balance.LockPrm) error {
|
||||||
c.lock = append(c.lock, p)
|
c.lock = append(c.lock, p)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *testBalaceClient) Burn(p balance.BurnPrm) error {
|
func (c *testBalaceClient) Burn(p balance.BurnPrm) error {
|
||||||
c.burn = append(c.burn, p)
|
c.burn = append(c.burn, p)
|
||||||
return nil
|
return nil
|
||||||
|
@ -349,6 +350,7 @@ type testMorphClient struct {
|
||||||
func (c *testMorphClient) GasBalance() (res int64, err error) {
|
func (c *testMorphClient) GasBalance() (res int64, err error) {
|
||||||
return c.balance, nil
|
return c.balance, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *testMorphClient) TransferGas(receiver util.Uint160, amount fixedn.Fixed8) error {
|
func (c *testMorphClient) TransferGas(receiver util.Uint160, amount fixedn.Fixed8) error {
|
||||||
c.transferGas = append(c.transferGas, transferGas{
|
c.transferGas = append(c.transferGas, transferGas{
|
||||||
receiver: receiver,
|
receiver: receiver,
|
||||||
|
|
|
@ -205,7 +205,7 @@ func generateTestKeys(t *testing.T) testKeys {
|
||||||
require.NoError(t, err, "failed to create expected new alphabet")
|
require.NoError(t, err, "failed to create expected new alphabet")
|
||||||
|
|
||||||
if len(result.newAlphabetExp) == 0 {
|
if len(result.newAlphabetExp) == 0 {
|
||||||
continue //can be happen because of random and sort
|
continue // can be happen because of random and sort
|
||||||
}
|
}
|
||||||
|
|
||||||
var irKeys keys.PublicKeys
|
var irKeys keys.PublicKeys
|
||||||
|
|
|
@ -309,12 +309,15 @@ type testEpochState struct {
|
||||||
func (s *testEpochState) SetEpochCounter(c uint64) {
|
func (s *testEpochState) SetEpochCounter(c uint64) {
|
||||||
s.counter = c
|
s.counter = c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *testEpochState) EpochCounter() uint64 {
|
func (s *testEpochState) EpochCounter() uint64 {
|
||||||
return s.counter
|
return s.counter
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *testEpochState) SetEpochDuration(d uint64) {
|
func (s *testEpochState) SetEpochDuration(d uint64) {
|
||||||
s.duration = d
|
s.duration = d
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *testEpochState) EpochDuration() uint64 {
|
func (s *testEpochState) EpochDuration() uint64 {
|
||||||
return s.duration
|
return s.duration
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,8 +20,7 @@ type DeletePrm struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
// DeleteRes groups the resulting values of Delete operation.
|
// DeleteRes groups the resulting values of Delete operation.
|
||||||
type DeleteRes struct {
|
type DeleteRes struct{}
|
||||||
}
|
|
||||||
|
|
||||||
// SetAddress sets the address of the requested object.
|
// SetAddress sets the address of the requested object.
|
||||||
func (p *DeletePrm) SetAddress(addr oid.Address) {
|
func (p *DeletePrm) SetAddress(addr oid.Address) {
|
||||||
|
|
|
@ -12,9 +12,7 @@ import (
|
||||||
|
|
||||||
// Exists check if object with the specified address is stored in b.
|
// Exists check if object with the specified address is stored in b.
|
||||||
func (b *Blobovnicza) Exists(ctx context.Context, addr oid.Address) (bool, error) {
|
func (b *Blobovnicza) Exists(ctx context.Context, addr oid.Address) (bool, error) {
|
||||||
var (
|
exists := false
|
||||||
exists = false
|
|
||||||
)
|
|
||||||
|
|
||||||
_, span := tracing.StartSpanFromContext(ctx, "Blobovnicza.Exists",
|
_, span := tracing.StartSpanFromContext(ctx, "Blobovnicza.Exists",
|
||||||
trace.WithAttributes(
|
trace.WithAttributes(
|
||||||
|
|
|
@ -116,8 +116,7 @@ func (x *IteratePrm) IgnoreErrors() {
|
||||||
}
|
}
|
||||||
|
|
||||||
// IterateRes groups the resulting values of Iterate operation.
|
// IterateRes groups the resulting values of Iterate operation.
|
||||||
type IterateRes struct {
|
type IterateRes struct{}
|
||||||
}
|
|
||||||
|
|
||||||
// Iterate goes through all stored objects, and passes IterationElement to parameterized handler until error return.
|
// Iterate goes through all stored objects, and passes IterationElement to parameterized handler until error return.
|
||||||
//
|
//
|
||||||
|
|
|
@ -20,8 +20,7 @@ type PutPrm struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
// PutRes groups the resulting values of Put operation.
|
// PutRes groups the resulting values of Put operation.
|
||||||
type PutRes struct {
|
type PutRes struct{}
|
||||||
}
|
|
||||||
|
|
||||||
// SetAddress sets the address of the saving object.
|
// SetAddress sets the address of the saving object.
|
||||||
func (p *PutPrm) SetAddress(addr oid.Address) {
|
func (p *PutPrm) SetAddress(addr oid.Address) {
|
||||||
|
|
|
@ -96,7 +96,7 @@ func (m *activeDBManager) getCurrentActiveIfOk(lvlPath string) (*activeDB, error
|
||||||
return nil, nil
|
return nil, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
blz, err := db.Open() //open db for usage, will be closed on activeDB.Close()
|
blz, err := db.Open() // open db for usage, will be closed on activeDB.Close()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
@ -156,7 +156,7 @@ func (m *activeDBManager) getNextSharedDB(lvlPath string) (*sharedDB, error) {
|
||||||
for iterCount < m.leafWidth {
|
for iterCount < m.leafWidth {
|
||||||
path := filepath.Join(lvlPath, u64ToHexString(idx))
|
path := filepath.Join(lvlPath, u64ToHexString(idx))
|
||||||
shDB := m.dbManager.GetByPath(path)
|
shDB := m.dbManager.GetByPath(path)
|
||||||
db, err := shDB.Open() //open db to hold active DB open, will be closed if db is full, after m.replace or by activeDBManager.Close()
|
db, err := shDB.Open() // open db to hold active DB open, will be closed if db is full, after m.replace or by activeDBManager.Close()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
|
@ -80,7 +80,7 @@ func (c *dbCache) create(path string) *sharedDB {
|
||||||
|
|
||||||
value = c.dbManager.GetByPath(path)
|
value = c.dbManager.GetByPath(path)
|
||||||
|
|
||||||
_, err := value.Open() //open db to hold reference, closed by evictedDB.Close() or if cache closed
|
_, err := value.Open() // open db to hold reference, closed by evictedDB.Close() or if cache closed
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return value
|
return value
|
||||||
}
|
}
|
||||||
|
|
|
@ -40,14 +40,14 @@ func (b *Blobovniczas) Init() error {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (b *Blobovniczas) openManagers() {
|
func (b *Blobovniczas) openManagers() {
|
||||||
b.commondbManager.Open() //order important
|
b.commondbManager.Open() // order important
|
||||||
b.activeDBManager.Open()
|
b.activeDBManager.Open()
|
||||||
b.dbCache.Open()
|
b.dbCache.Open()
|
||||||
}
|
}
|
||||||
|
|
||||||
// Close implements common.Storage.
|
// Close implements common.Storage.
|
||||||
func (b *Blobovniczas) Close() error {
|
func (b *Blobovniczas) Close() error {
|
||||||
b.dbCache.Close() //order important
|
b.dbCache.Close() // order important
|
||||||
b.activeDBManager.Close()
|
b.activeDBManager.Close()
|
||||||
b.commondbManager.Close()
|
b.commondbManager.Close()
|
||||||
|
|
||||||
|
|
|
@ -55,7 +55,7 @@ func TestExistsInvalidStorageID(t *testing.T) {
|
||||||
|
|
||||||
// An invalid boltdb file is created so that it returns an error when opened
|
// An invalid boltdb file is created so that it returns an error when opened
|
||||||
require.NoError(t, os.MkdirAll(filepath.Join(dir, relBadFileDir), os.ModePerm))
|
require.NoError(t, os.MkdirAll(filepath.Join(dir, relBadFileDir), os.ModePerm))
|
||||||
require.NoError(t, os.WriteFile(filepath.Join(dir, relBadFileDir, badFileName), []byte("not a boltdb file content"), 0777))
|
require.NoError(t, os.WriteFile(filepath.Join(dir, relBadFileDir, badFileName), []byte("not a boltdb file content"), 0o777))
|
||||||
|
|
||||||
res, err := b.Exists(context.Background(), common.ExistsPrm{Address: addr, StorageID: []byte(filepath.Join(relBadFileDir, badFileName))})
|
res, err := b.Exists(context.Background(), common.ExistsPrm{Address: addr, StorageID: []byte(filepath.Join(relBadFileDir, badFileName))})
|
||||||
require.Error(t, err)
|
require.Error(t, err)
|
||||||
|
|
|
@ -28,7 +28,8 @@ type sharedDB struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
func newSharedDB(options []blobovnicza.Option, path string, readOnly bool,
|
func newSharedDB(options []blobovnicza.Option, path string, readOnly bool,
|
||||||
metrics blobovnicza.Metrics, openDBCounter *openDBCounter, closedFlag *atomic.Bool, log *logger.Logger) *sharedDB {
|
metrics blobovnicza.Metrics, openDBCounter *openDBCounter, closedFlag *atomic.Bool, log *logger.Logger,
|
||||||
|
) *sharedDB {
|
||||||
return &sharedDB{
|
return &sharedDB{
|
||||||
guard: &sync.RWMutex{},
|
guard: &sync.RWMutex{},
|
||||||
|
|
||||||
|
@ -110,7 +111,8 @@ type levelDbManager struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
func newLevelDBManager(width uint64, options []blobovnicza.Option, rootPath string, lvlPath string,
|
func newLevelDBManager(width uint64, options []blobovnicza.Option, rootPath string, lvlPath string,
|
||||||
readOnly bool, metrics blobovnicza.Metrics, openDBCounter *openDBCounter, closedFlog *atomic.Bool, log *logger.Logger) *levelDbManager {
|
readOnly bool, metrics blobovnicza.Metrics, openDBCounter *openDBCounter, closedFlog *atomic.Bool, log *logger.Logger,
|
||||||
|
) *levelDbManager {
|
||||||
result := &levelDbManager{
|
result := &levelDbManager{
|
||||||
databases: make([]*sharedDB, width),
|
databases: make([]*sharedDB, width),
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,7 +28,7 @@ type cfg struct {
|
||||||
type Option func(*cfg)
|
type Option func(*cfg)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
defaultPerm = 0700
|
defaultPerm = 0o700
|
||||||
defaultOpenedCacheSize = 50
|
defaultOpenedCacheSize = 50
|
||||||
defaultBlzShallowDepth = 2
|
defaultBlzShallowDepth = 2
|
||||||
defaultBlzShallowWidth = 16
|
defaultBlzShallowWidth = 16
|
||||||
|
|
|
@ -77,7 +77,7 @@ var _ common.Storage = (*FSTree)(nil)
|
||||||
func New(opts ...Option) *FSTree {
|
func New(opts ...Option) *FSTree {
|
||||||
f := &FSTree{
|
f := &FSTree{
|
||||||
Info: Info{
|
Info: Info{
|
||||||
Permissions: 0700,
|
Permissions: 0o700,
|
||||||
RootPath: "./",
|
RootPath: "./",
|
||||||
},
|
},
|
||||||
Config: nil,
|
Config: nil,
|
||||||
|
|
|
@ -7,7 +7,6 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestGeneric(t *testing.T) {
|
func TestGeneric(t *testing.T) {
|
||||||
|
|
||||||
newMetabase := func(t *testing.T) storagetest.Component {
|
newMetabase := func(t *testing.T) storagetest.Component {
|
||||||
return New(
|
return New(
|
||||||
WithStorages(defaultStorages(t.TempDir(), 128)))
|
WithStorages(defaultStorages(t.TempDir(), 128)))
|
||||||
|
|
|
@ -18,9 +18,7 @@ import (
|
||||||
// If the descriptor is present, only one sub-storage is tried,
|
// If the descriptor is present, only one sub-storage is tried,
|
||||||
// Otherwise, each sub-storage is tried in order.
|
// Otherwise, each sub-storage is tried in order.
|
||||||
func (b *BlobStor) Get(ctx context.Context, prm common.GetPrm) (res common.GetRes, err error) {
|
func (b *BlobStor) Get(ctx context.Context, prm common.GetPrm) (res common.GetRes, err error) {
|
||||||
var (
|
startedAt := time.Now()
|
||||||
startedAt = time.Now()
|
|
||||||
)
|
|
||||||
defer func() {
|
defer func() {
|
||||||
b.metrics.Get(time.Since(startedAt), len(res.RawData), err == nil, prm.StorageID != nil)
|
b.metrics.Get(time.Since(startedAt), len(res.RawData), err == nil, prm.StorageID != nil)
|
||||||
}()
|
}()
|
||||||
|
|
|
@ -19,9 +19,7 @@ import (
|
||||||
// If the descriptor is present, only one sub-storage is tried,
|
// If the descriptor is present, only one sub-storage is tried,
|
||||||
// Otherwise, each sub-storage is tried in order.
|
// Otherwise, each sub-storage is tried in order.
|
||||||
func (b *BlobStor) GetRange(ctx context.Context, prm common.GetRangePrm) (res common.GetRangeRes, err error) {
|
func (b *BlobStor) GetRange(ctx context.Context, prm common.GetRangePrm) (res common.GetRangeRes, err error) {
|
||||||
var (
|
startedAt := time.Now()
|
||||||
startedAt = time.Now()
|
|
||||||
)
|
|
||||||
defer func() {
|
defer func() {
|
||||||
b.metrics.GetRange(time.Since(startedAt), len(res.Data), err == nil, prm.StorageID != nil)
|
b.metrics.GetRange(time.Since(startedAt), len(res.Data), err == nil, prm.StorageID != nil)
|
||||||
}()
|
}()
|
||||||
|
|
|
@ -91,7 +91,7 @@ func runTestIgnoreLogicalErrors(t *testing.T, s common.Storage, objects []object
|
||||||
seen := make(map[string]objectDesc)
|
seen := make(map[string]objectDesc)
|
||||||
|
|
||||||
var n int
|
var n int
|
||||||
var logicErr = errors.New("logic error")
|
logicErr := errors.New("logic error")
|
||||||
var iterPrm common.IteratePrm
|
var iterPrm common.IteratePrm
|
||||||
iterPrm.IgnoreErrors = true
|
iterPrm.IgnoreErrors = true
|
||||||
iterPrm.Handler = func(elem common.IterationElement) error {
|
iterPrm.Handler = func(elem common.IterationElement) error {
|
||||||
|
|
|
@ -6,8 +6,10 @@ import (
|
||||||
oid "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/object/id"
|
oid "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/object/id"
|
||||||
)
|
)
|
||||||
|
|
||||||
const deleteOp = "DELETE"
|
const (
|
||||||
const putOp = "PUT"
|
deleteOp = "DELETE"
|
||||||
|
putOp = "PUT"
|
||||||
|
)
|
||||||
|
|
||||||
func logOp(l *logger.Logger, op string, addr oid.Address, typ string, sID []byte) {
|
func logOp(l *logger.Logger, op string, addr oid.Address, typ string, sID []byte) {
|
||||||
storagelog.Write(l,
|
storagelog.Write(l,
|
||||||
|
|
|
@ -30,7 +30,7 @@ func (e *StorageEngine) open(ctx context.Context) error {
|
||||||
defer e.mtx.Unlock()
|
defer e.mtx.Unlock()
|
||||||
|
|
||||||
var wg sync.WaitGroup
|
var wg sync.WaitGroup
|
||||||
var errCh = make(chan shardInitError, len(e.shards))
|
errCh := make(chan shardInitError, len(e.shards))
|
||||||
|
|
||||||
for id, sh := range e.shards {
|
for id, sh := range e.shards {
|
||||||
wg.Add(1)
|
wg.Add(1)
|
||||||
|
@ -75,7 +75,7 @@ func (e *StorageEngine) Init(ctx context.Context) error {
|
||||||
e.mtx.Lock()
|
e.mtx.Lock()
|
||||||
defer e.mtx.Unlock()
|
defer e.mtx.Unlock()
|
||||||
|
|
||||||
var errCh = make(chan shardInitError, len(e.shards))
|
errCh := make(chan shardInitError, len(e.shards))
|
||||||
var eg errgroup.Group
|
var eg errgroup.Group
|
||||||
if e.cfg.lowMem && e.anyShardRequiresRefill() {
|
if e.cfg.lowMem && e.anyShardRequiresRefill() {
|
||||||
eg.SetLimit(1)
|
eg.SetLimit(1)
|
||||||
|
|
|
@ -62,7 +62,7 @@ func TestInitializationFailure(t *testing.T) {
|
||||||
OpenFile: opts.openFileMetabase,
|
OpenFile: opts.openFileMetabase,
|
||||||
}),
|
}),
|
||||||
meta.WithPath(filepath.Join(t.TempDir(), "metabase")),
|
meta.WithPath(filepath.Join(t.TempDir(), "metabase")),
|
||||||
meta.WithPermissions(0700),
|
meta.WithPermissions(0o700),
|
||||||
meta.WithEpochState(epochState{})),
|
meta.WithEpochState(epochState{})),
|
||||||
shard.WithWriteCache(true),
|
shard.WithWriteCache(true),
|
||||||
shard.WithWriteCacheOptions(wcOpts),
|
shard.WithWriteCacheOptions(wcOpts),
|
||||||
|
@ -228,7 +228,6 @@ func TestPersistentShardID(t *testing.T) {
|
||||||
require.Equal(t, te.shards[1].id, newTe.shards[0].id)
|
require.Equal(t, te.shards[1].id, newTe.shards[0].id)
|
||||||
require.Equal(t, te.shards[0].id, newTe.shards[1].id)
|
require.Equal(t, te.shards[0].id, newTe.shards[1].id)
|
||||||
require.NoError(t, newTe.ng.Close(context.Background()))
|
require.NoError(t, newTe.ng.Close(context.Background()))
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestReload(t *testing.T) {
|
func TestReload(t *testing.T) {
|
||||||
|
@ -299,7 +298,7 @@ func engineWithShards(t *testing.T, path string, num int) (*StorageEngine, []str
|
||||||
blobstor.WithStorages(newStorages(filepath.Join(addPath, strconv.Itoa(id)), errSmallSize))),
|
blobstor.WithStorages(newStorages(filepath.Join(addPath, strconv.Itoa(id)), errSmallSize))),
|
||||||
shard.WithMetaBaseOptions(
|
shard.WithMetaBaseOptions(
|
||||||
meta.WithPath(filepath.Join(addPath, fmt.Sprintf("%d.metabase", id))),
|
meta.WithPath(filepath.Join(addPath, fmt.Sprintf("%d.metabase", id))),
|
||||||
meta.WithPermissions(0700),
|
meta.WithPermissions(0o700),
|
||||||
meta.WithEpochState(epochState{}),
|
meta.WithEpochState(epochState{}),
|
||||||
),
|
),
|
||||||
}
|
}
|
||||||
|
|
|
@ -143,7 +143,8 @@ func (e *StorageEngine) reportShardError(
|
||||||
sh hashedShard,
|
sh hashedShard,
|
||||||
msg string,
|
msg string,
|
||||||
err error,
|
err error,
|
||||||
fields ...zap.Field) {
|
fields ...zap.Field,
|
||||||
|
) {
|
||||||
if isLogical(err) {
|
if isLogical(err) {
|
||||||
e.log.Warn(msg,
|
e.log.Warn(msg,
|
||||||
zap.Stringer("shard_id", sh.ID()),
|
zap.Stringer("shard_id", sh.ID()),
|
||||||
|
@ -162,7 +163,8 @@ func (e *StorageEngine) reportShardErrorWithFlags(
|
||||||
block bool,
|
block bool,
|
||||||
msg string,
|
msg string,
|
||||||
err error,
|
err error,
|
||||||
fields ...zap.Field) {
|
fields ...zap.Field,
|
||||||
|
) {
|
||||||
sid := sh.ID()
|
sid := sh.ID()
|
||||||
e.log.Warn(msg, append([]zap.Field{
|
e.log.Warn(msg, append([]zap.Field{
|
||||||
zap.Stringer("shard_id", sid),
|
zap.Stringer("shard_id", sid),
|
||||||
|
|
|
@ -144,7 +144,7 @@ func newStorages(root string, smallSize uint64) []blobstor.SubStorage {
|
||||||
blobovniczatree.WithRootPath(filepath.Join(root, "blobovnicza")),
|
blobovniczatree.WithRootPath(filepath.Join(root, "blobovnicza")),
|
||||||
blobovniczatree.WithBlobovniczaShallowDepth(1),
|
blobovniczatree.WithBlobovniczaShallowDepth(1),
|
||||||
blobovniczatree.WithBlobovniczaShallowWidth(1),
|
blobovniczatree.WithBlobovniczaShallowWidth(1),
|
||||||
blobovniczatree.WithPermissions(0700)),
|
blobovniczatree.WithPermissions(0o700)),
|
||||||
Policy: func(_ *objectSDK.Object, data []byte) bool {
|
Policy: func(_ *objectSDK.Object, data []byte) bool {
|
||||||
return uint64(len(data)) < smallSize
|
return uint64(len(data)) < smallSize
|
||||||
},
|
},
|
||||||
|
@ -163,7 +163,7 @@ func newTestStorages(root string, smallSize uint64) ([]blobstor.SubStorage, *tes
|
||||||
blobovniczatree.WithRootPath(filepath.Join(root, "blobovnicza")),
|
blobovniczatree.WithRootPath(filepath.Join(root, "blobovnicza")),
|
||||||
blobovniczatree.WithBlobovniczaShallowDepth(1),
|
blobovniczatree.WithBlobovniczaShallowDepth(1),
|
||||||
blobovniczatree.WithBlobovniczaShallowWidth(1),
|
blobovniczatree.WithBlobovniczaShallowWidth(1),
|
||||||
blobovniczatree.WithPermissions(0700)),
|
blobovniczatree.WithPermissions(0o700)),
|
||||||
))
|
))
|
||||||
largeFileStorage := teststore.New(
|
largeFileStorage := teststore.New(
|
||||||
teststore.WithSubstorage(fstree.New(
|
teststore.WithSubstorage(fstree.New(
|
||||||
|
@ -205,7 +205,8 @@ func testDefaultShardOptions(t testing.TB, id int) []shard.Option {
|
||||||
shard.WithPiloramaOptions(pilorama.WithPath(filepath.Join(t.TempDir(), "pilorama"))),
|
shard.WithPiloramaOptions(pilorama.WithPath(filepath.Join(t.TempDir(), "pilorama"))),
|
||||||
shard.WithMetaBaseOptions(
|
shard.WithMetaBaseOptions(
|
||||||
meta.WithPath(filepath.Join(t.TempDir(), "metabase")),
|
meta.WithPath(filepath.Join(t.TempDir(), "metabase")),
|
||||||
meta.WithPermissions(0700),
|
meta.WithPermissions(0o700),
|
||||||
meta.WithEpochState(epochState{}),
|
meta.WithEpochState(epochState{}),
|
||||||
)}
|
),
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -59,12 +59,12 @@ func newEngineWithErrorThreshold(t testing.TB, dir string, errThreshold uint32)
|
||||||
shard.WithBlobStorOptions(blobstor.WithStorages(storages)),
|
shard.WithBlobStorOptions(blobstor.WithStorages(storages)),
|
||||||
shard.WithMetaBaseOptions(
|
shard.WithMetaBaseOptions(
|
||||||
meta.WithPath(filepath.Join(dir, fmt.Sprintf("%d.metabase", id))),
|
meta.WithPath(filepath.Join(dir, fmt.Sprintf("%d.metabase", id))),
|
||||||
meta.WithPermissions(0700),
|
meta.WithPermissions(0o700),
|
||||||
meta.WithEpochState(epochState{}),
|
meta.WithEpochState(epochState{}),
|
||||||
),
|
),
|
||||||
shard.WithPiloramaOptions(
|
shard.WithPiloramaOptions(
|
||||||
pilorama.WithPath(filepath.Join(dir, fmt.Sprintf("%d.pilorama", id))),
|
pilorama.WithPath(filepath.Join(dir, fmt.Sprintf("%d.pilorama", id))),
|
||||||
pilorama.WithPerm(0700)),
|
pilorama.WithPerm(0o700)),
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
e := te.engine
|
e := te.engine
|
||||||
|
|
|
@ -163,7 +163,6 @@ func (e *StorageEngine) Evacuate(ctx context.Context, prm EvacuateShardPrm) (*Ev
|
||||||
res := NewEvacuateShardRes()
|
res := NewEvacuateShardRes()
|
||||||
ctx = ctxOrBackground(ctx, prm.async)
|
ctx = ctxOrBackground(ctx, prm.async)
|
||||||
eg, egCtx, err := e.evacuateLimiter.TryStart(ctx, shardIDs, res)
|
eg, egCtx, err := e.evacuateLimiter.TryStart(ctx, shardIDs, res)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
@ -187,7 +186,8 @@ func ctxOrBackground(ctx context.Context, background bool) context.Context {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *StorageEngine) evacuateShards(ctx context.Context, shardIDs []string, prm EvacuateShardPrm, res *EvacuateShardRes,
|
func (e *StorageEngine) evacuateShards(ctx context.Context, shardIDs []string, prm EvacuateShardPrm, res *EvacuateShardRes,
|
||||||
shards []pooledShard, weights []float64, shardsToEvacuate map[string]*shard.Shard) error {
|
shards []pooledShard, weights []float64, shardsToEvacuate map[string]*shard.Shard,
|
||||||
|
) error {
|
||||||
var err error
|
var err error
|
||||||
ctx, span := tracing.StartSpanFromContext(ctx, "StorageEngine.evacuateShards",
|
ctx, span := tracing.StartSpanFromContext(ctx, "StorageEngine.evacuateShards",
|
||||||
trace.WithAttributes(
|
trace.WithAttributes(
|
||||||
|
@ -246,7 +246,8 @@ func (e *StorageEngine) getTotalObjectsCount(ctx context.Context, shardsToEvacua
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *StorageEngine) evacuateShard(ctx context.Context, shardID string, prm EvacuateShardPrm, res *EvacuateShardRes,
|
func (e *StorageEngine) evacuateShard(ctx context.Context, shardID string, prm EvacuateShardPrm, res *EvacuateShardRes,
|
||||||
shards []pooledShard, weights []float64, shardsToEvacuate map[string]*shard.Shard) error {
|
shards []pooledShard, weights []float64, shardsToEvacuate map[string]*shard.Shard,
|
||||||
|
) error {
|
||||||
ctx, span := tracing.StartSpanFromContext(ctx, "StorageEngine.evacuateShard",
|
ctx, span := tracing.StartSpanFromContext(ctx, "StorageEngine.evacuateShard",
|
||||||
trace.WithAttributes(
|
trace.WithAttributes(
|
||||||
attribute.String("shardID", shardID),
|
attribute.String("shardID", shardID),
|
||||||
|
@ -322,7 +323,8 @@ func (e *StorageEngine) getActualShards(shardIDs []string, handlerDefined bool)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *StorageEngine) evacuateObjects(ctx context.Context, sh *shard.Shard, toEvacuate []object.AddressWithType, prm EvacuateShardPrm, res *EvacuateShardRes,
|
func (e *StorageEngine) evacuateObjects(ctx context.Context, sh *shard.Shard, toEvacuate []object.AddressWithType, prm EvacuateShardPrm, res *EvacuateShardRes,
|
||||||
shards []pooledShard, weights []float64, shardsToEvacuate map[string]*shard.Shard) error {
|
shards []pooledShard, weights []float64, shardsToEvacuate map[string]*shard.Shard,
|
||||||
|
) error {
|
||||||
ctx, span := tracing.StartSpanFromContext(ctx, "StorageEngine.evacuateObjects",
|
ctx, span := tracing.StartSpanFromContext(ctx, "StorageEngine.evacuateObjects",
|
||||||
trace.WithAttributes(
|
trace.WithAttributes(
|
||||||
attribute.Int("objects_count", len(toEvacuate)),
|
attribute.Int("objects_count", len(toEvacuate)),
|
||||||
|
@ -378,7 +380,8 @@ func (e *StorageEngine) evacuateObjects(ctx context.Context, sh *shard.Shard, to
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *StorageEngine) tryEvacuateObjectLocal(ctx context.Context, addr oid.Address, object *objectSDK.Object, sh *shard.Shard,
|
func (e *StorageEngine) tryEvacuateObjectLocal(ctx context.Context, addr oid.Address, object *objectSDK.Object, sh *shard.Shard,
|
||||||
shards []pooledShard, weights []float64, shardsToEvacuate map[string]*shard.Shard, res *EvacuateShardRes) (bool, error) {
|
shards []pooledShard, weights []float64, shardsToEvacuate map[string]*shard.Shard, res *EvacuateShardRes,
|
||||||
|
) (bool, error) {
|
||||||
hrw.SortHasherSliceByWeightValue(shards, weights, hrw.StringHash(addr.EncodeToString()))
|
hrw.SortHasherSliceByWeightValue(shards, weights, hrw.StringHash(addr.EncodeToString()))
|
||||||
for j := range shards {
|
for j := range shards {
|
||||||
select {
|
select {
|
||||||
|
|
|
@ -39,7 +39,7 @@ func newEngineEvacuate(t *testing.T, shardNum int, objPerShard int) (*StorageEng
|
||||||
}})),
|
}})),
|
||||||
shard.WithMetaBaseOptions(
|
shard.WithMetaBaseOptions(
|
||||||
meta.WithPath(filepath.Join(dir, fmt.Sprintf("%d.metabase", id))),
|
meta.WithPath(filepath.Join(dir, fmt.Sprintf("%d.metabase", id))),
|
||||||
meta.WithPermissions(0700),
|
meta.WithPermissions(0o700),
|
||||||
meta.WithEpochState(epochState{})),
|
meta.WithEpochState(epochState{})),
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
@ -137,7 +137,7 @@ func TestEvacuateShard(t *testing.T) {
|
||||||
func TestEvacuateNetwork(t *testing.T) {
|
func TestEvacuateNetwork(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
var errReplication = errors.New("handler error")
|
errReplication := errors.New("handler error")
|
||||||
|
|
||||||
acceptOneOf := func(objects []*objectSDK.Object, max uint64) func(context.Context, oid.Address, *objectSDK.Object) error {
|
acceptOneOf := func(objects []*objectSDK.Object, max uint64) func(context.Context, oid.Address, *objectSDK.Object) error {
|
||||||
var n uint64
|
var n uint64
|
||||||
|
|
|
@ -72,9 +72,10 @@ func TestListWithCursor(t *testing.T) {
|
||||||
shard.WithPiloramaOptions(pilorama.WithPath(filepath.Join(t.TempDir(), "pilorama"))),
|
shard.WithPiloramaOptions(pilorama.WithPath(filepath.Join(t.TempDir(), "pilorama"))),
|
||||||
shard.WithMetaBaseOptions(
|
shard.WithMetaBaseOptions(
|
||||||
meta.WithPath(filepath.Join(t.TempDir(), "metabase")),
|
meta.WithPath(filepath.Join(t.TempDir(), "metabase")),
|
||||||
meta.WithPermissions(0700),
|
meta.WithPermissions(0o700),
|
||||||
meta.WithEpochState(epochState{}),
|
meta.WithEpochState(epochState{}),
|
||||||
)}
|
),
|
||||||
|
}
|
||||||
}).engine
|
}).engine
|
||||||
require.NoError(t, e.Open(context.Background()))
|
require.NoError(t, e.Open(context.Background()))
|
||||||
require.NoError(t, e.Init(context.Background()))
|
require.NoError(t, e.Init(context.Background()))
|
||||||
|
|
|
@ -48,6 +48,7 @@ func TestError(t *testing.T) {
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestNilWrap(t *testing.T) {
|
func TestNilWrap(t *testing.T) {
|
||||||
require.NoError(t, Wrap(nil))
|
require.NoError(t, Wrap(nil))
|
||||||
}
|
}
|
||||||
|
|
|
@ -69,7 +69,6 @@ func (db *DB) GetChildren(ctx context.Context, addresses []oid.Address) (map[oid
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
})
|
})
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, metaerr.Wrap(err)
|
return nil, metaerr.Wrap(err)
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,8 +10,10 @@ import (
|
||||||
"go.etcd.io/bbolt"
|
"go.etcd.io/bbolt"
|
||||||
)
|
)
|
||||||
|
|
||||||
var objectPhyCounterKey = []byte("phy_counter")
|
var (
|
||||||
var objectLogicCounterKey = []byte("logic_counter")
|
objectPhyCounterKey = []byte("phy_counter")
|
||||||
|
objectLogicCounterKey = []byte("logic_counter")
|
||||||
|
)
|
||||||
|
|
||||||
type objectType uint8
|
type objectType uint8
|
||||||
|
|
||||||
|
|
|
@ -45,7 +45,7 @@ func newDB(t testing.TB, opts ...meta.Option) *meta.DB {
|
||||||
bdb := meta.New(
|
bdb := meta.New(
|
||||||
append([]meta.Option{
|
append([]meta.Option{
|
||||||
meta.WithPath(filepath.Join(t.TempDir(), "metabase")),
|
meta.WithPath(filepath.Join(t.TempDir(), "metabase")),
|
||||||
meta.WithPermissions(0600),
|
meta.WithPermissions(0o600),
|
||||||
meta.WithEpochState(epochState{}),
|
meta.WithEpochState(epochState{}),
|
||||||
}, opts...)...,
|
}, opts...)...,
|
||||||
)
|
)
|
||||||
|
|
|
@ -98,8 +98,8 @@ func (db *DB) Delete(ctx context.Context, prm DeletePrm) (DeleteRes, error) {
|
||||||
var rawRemoved uint64
|
var rawRemoved uint64
|
||||||
var availableRemoved uint64
|
var availableRemoved uint64
|
||||||
var err error
|
var err error
|
||||||
var sizes = make([]uint64, len(prm.addrs))
|
sizes := make([]uint64, len(prm.addrs))
|
||||||
var availableSizes = make([]uint64, len(prm.addrs))
|
availableSizes := make([]uint64, len(prm.addrs))
|
||||||
|
|
||||||
err = db.boltDB.Update(func(tx *bbolt.Tx) error {
|
err = db.boltDB.Update(func(tx *bbolt.Tx) error {
|
||||||
// We need to clear slice because tx can try to execute multiple times.
|
// We need to clear slice because tx can try to execute multiple times.
|
||||||
|
|
|
@ -83,7 +83,6 @@ func (db *DB) FilterExpired(ctx context.Context, epoch uint64, addresses []oid.A
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
})
|
})
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, metaerr.Wrap(err)
|
return nil, metaerr.Wrap(err)
|
||||||
}
|
}
|
||||||
|
|
|
@ -115,7 +115,7 @@ func (db *DB) listWithCursor(tx *bbolt.Tx, result []objectcore.AddressWithType,
|
||||||
graveyardBkt := tx.Bucket(graveyardBucketName)
|
graveyardBkt := tx.Bucket(graveyardBucketName)
|
||||||
garbageBkt := tx.Bucket(garbageBucketName)
|
garbageBkt := tx.Bucket(garbageBucketName)
|
||||||
|
|
||||||
var rawAddr = make([]byte, cidSize, addressKeySize)
|
rawAddr := make([]byte, cidSize, addressKeySize)
|
||||||
|
|
||||||
loop:
|
loop:
|
||||||
for ; name != nil; name, _ = c.Next() {
|
for ; name != nil; name, _ = c.Next() {
|
||||||
|
|
|
@ -211,7 +211,6 @@ func TestAddObjectDuringListingWithCursor(t *testing.T) {
|
||||||
for _, v := range expected {
|
for _, v := range expected {
|
||||||
require.Equal(t, 1, v)
|
require.Equal(t, 1, v)
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func sortAddresses(addrWithType []object.AddressWithType) []object.AddressWithType {
|
func sortAddresses(addrWithType []object.AddressWithType) []object.AddressWithType {
|
||||||
|
|
|
@ -244,7 +244,6 @@ func freePotentialLocks(tx *bbolt.Tx, idCnr cid.ID, locker oid.ID) ([]oid.Addres
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
})
|
})
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
|
@ -101,7 +101,8 @@ func (db *DB) put(tx *bbolt.Tx,
|
||||||
obj *objectSDK.Object,
|
obj *objectSDK.Object,
|
||||||
id []byte,
|
id []byte,
|
||||||
si *objectSDK.SplitInfo,
|
si *objectSDK.SplitInfo,
|
||||||
currEpoch uint64) error {
|
currEpoch uint64,
|
||||||
|
) error {
|
||||||
cnr, ok := obj.ContainerID()
|
cnr, ok := obj.ContainerID()
|
||||||
if !ok {
|
if !ok {
|
||||||
return errors.New("missing container in object")
|
return errors.New("missing container in object")
|
||||||
|
|
|
@ -23,7 +23,7 @@ func TestVersion(t *testing.T) {
|
||||||
|
|
||||||
newDB := func(t *testing.T) *DB {
|
newDB := func(t *testing.T) *DB {
|
||||||
return New(WithPath(filepath.Join(dir, t.Name())),
|
return New(WithPath(filepath.Join(dir, t.Name())),
|
||||||
WithPermissions(0600), WithEpochState(epochStateImpl{}))
|
WithPermissions(0o600), WithEpochState(epochStateImpl{}))
|
||||||
}
|
}
|
||||||
check := func(t *testing.T, db *DB) {
|
check := func(t *testing.T, db *DB) {
|
||||||
require.NoError(t, db.boltDB.View(func(tx *bbolt.Tx) error {
|
require.NoError(t, db.boltDB.View(func(tx *bbolt.Tx) error {
|
||||||
|
|
|
@ -28,6 +28,7 @@ func (m *fstreeMetrics) SetParentID(parentID string) {
|
||||||
func (m *fstreeMetrics) SetMode(readOnly bool) {
|
func (m *fstreeMetrics) SetMode(readOnly bool) {
|
||||||
m.m.SetMode(m.shardID, m.path, readOnly)
|
m.m.SetMode(m.shardID, m.path, readOnly)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *fstreeMetrics) Close() {
|
func (m *fstreeMetrics) Close() {
|
||||||
m.m.Close(m.shardID, m.path)
|
m.m.Close(m.shardID, m.path)
|
||||||
}
|
}
|
||||||
|
@ -35,24 +36,29 @@ func (m *fstreeMetrics) Close() {
|
||||||
func (m *fstreeMetrics) Iterate(d time.Duration, success bool) {
|
func (m *fstreeMetrics) Iterate(d time.Duration, success bool) {
|
||||||
m.m.MethodDuration(m.shardID, m.path, "Iterate", d, success)
|
m.m.MethodDuration(m.shardID, m.path, "Iterate", d, success)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *fstreeMetrics) Delete(d time.Duration, success bool) {
|
func (m *fstreeMetrics) Delete(d time.Duration, success bool) {
|
||||||
m.m.MethodDuration(m.shardID, m.path, "Delete", d, success)
|
m.m.MethodDuration(m.shardID, m.path, "Delete", d, success)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *fstreeMetrics) Exists(d time.Duration, success bool) {
|
func (m *fstreeMetrics) Exists(d time.Duration, success bool) {
|
||||||
m.m.MethodDuration(m.shardID, m.path, "Exists", d, success)
|
m.m.MethodDuration(m.shardID, m.path, "Exists", d, success)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *fstreeMetrics) Put(d time.Duration, size int, success bool) {
|
func (m *fstreeMetrics) Put(d time.Duration, size int, success bool) {
|
||||||
m.m.MethodDuration(m.shardID, m.path, "Put", d, success)
|
m.m.MethodDuration(m.shardID, m.path, "Put", d, success)
|
||||||
if success {
|
if success {
|
||||||
m.m.AddPut(m.shardID, m.path, size)
|
m.m.AddPut(m.shardID, m.path, size)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *fstreeMetrics) Get(d time.Duration, size int, success bool) {
|
func (m *fstreeMetrics) Get(d time.Duration, size int, success bool) {
|
||||||
m.m.MethodDuration(m.shardID, m.path, "Get", d, success)
|
m.m.MethodDuration(m.shardID, m.path, "Get", d, success)
|
||||||
if success {
|
if success {
|
||||||
m.m.AddGet(m.shardID, m.path, size)
|
m.m.AddGet(m.shardID, m.path, size)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *fstreeMetrics) GetRange(d time.Duration, size int, success bool) {
|
func (m *fstreeMetrics) GetRange(d time.Duration, size int, success bool) {
|
||||||
m.m.MethodDuration(m.shardID, m.path, "GetRange", d, success)
|
m.m.MethodDuration(m.shardID, m.path, "GetRange", d, success)
|
||||||
if success {
|
if success {
|
||||||
|
|
|
@ -111,6 +111,7 @@ func (t *boltForest) SetMode(m mode.Mode) error {
|
||||||
t.metrics.SetMode(m)
|
t.metrics.SetMode(m)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *boltForest) Open(_ context.Context, readOnly bool) error {
|
func (t *boltForest) Open(_ context.Context, readOnly bool) error {
|
||||||
err := util.MkdirAllX(filepath.Dir(t.path), t.perm)
|
err := util.MkdirAllX(filepath.Dir(t.path), t.perm)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -137,6 +138,7 @@ func (t *boltForest) Open(_ context.Context, readOnly bool) error {
|
||||||
t.metrics.SetMode(m)
|
t.metrics.SetMode(m)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *boltForest) Init() error {
|
func (t *boltForest) Init() error {
|
||||||
if t.mode.NoMetabase() || t.db.IsReadOnly() {
|
if t.mode.NoMetabase() || t.db.IsReadOnly() {
|
||||||
return nil
|
return nil
|
||||||
|
@ -150,6 +152,7 @@ func (t *boltForest) Init() error {
|
||||||
return err
|
return err
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *boltForest) Close() error {
|
func (t *boltForest) Close() error {
|
||||||
var err error
|
var err error
|
||||||
if t.db != nil {
|
if t.db != nil {
|
||||||
|
|
|
@ -71,7 +71,8 @@ func (f *memoryForest) TreeAddByPath(_ context.Context, d CIDDescriptor, treeID
|
||||||
Parent: node,
|
Parent: node,
|
||||||
Meta: Meta{
|
Meta: Meta{
|
||||||
Time: s.timestamp(d.Position, d.Size),
|
Time: s.timestamp(d.Position, d.Size),
|
||||||
Items: []KeyValue{{Key: attr, Value: []byte(path[j])}}},
|
Items: []KeyValue{{Key: attr, Value: []byte(path[j])}},
|
||||||
|
},
|
||||||
Child: s.findSpareID(),
|
Child: s.findSpareID(),
|
||||||
})
|
})
|
||||||
lm[j-i] = op.Move
|
lm[j-i] = op.Move
|
||||||
|
@ -113,9 +114,11 @@ func (f *memoryForest) Init() error {
|
||||||
func (f *memoryForest) Open(context.Context, bool) error {
|
func (f *memoryForest) Open(context.Context, bool) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (f *memoryForest) SetMode(mode.Mode) error {
|
func (f *memoryForest) SetMode(mode.Mode) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (f *memoryForest) Close() error {
|
func (f *memoryForest) Close() error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -36,7 +36,8 @@ var providers = []struct {
|
||||||
f := NewBoltForest(
|
f := NewBoltForest(
|
||||||
append([]Option{
|
append([]Option{
|
||||||
WithPath(filepath.Join(t.TempDir(), "test.db")),
|
WithPath(filepath.Join(t.TempDir(), "test.db")),
|
||||||
WithMaxBatchSize(1)}, opts...)...)
|
WithMaxBatchSize(1),
|
||||||
|
}, opts...)...)
|
||||||
require.NoError(t, f.Open(context.Background(), false))
|
require.NoError(t, f.Open(context.Background(), false))
|
||||||
require.NoError(t, f.Init())
|
require.NoError(t, f.Init())
|
||||||
t.Cleanup(func() {
|
t.Cleanup(func() {
|
||||||
|
@ -68,7 +69,8 @@ func testForestTreeMove(t *testing.T, s Forest) {
|
||||||
|
|
||||||
meta := []KeyValue{
|
meta := []KeyValue{
|
||||||
{Key: AttributeVersion, Value: []byte("XXX")},
|
{Key: AttributeVersion, Value: []byte("XXX")},
|
||||||
{Key: AttributeFilename, Value: []byte("file.txt")}}
|
{Key: AttributeFilename, Value: []byte("file.txt")},
|
||||||
|
}
|
||||||
lm, err := s.TreeAddByPath(context.Background(), d, treeID, AttributeFilename, []string{"path", "to"}, meta)
|
lm, err := s.TreeAddByPath(context.Background(), d, treeID, AttributeFilename, []string{"path", "to"}, meta)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
require.Equal(t, 3, len(lm))
|
require.Equal(t, 3, len(lm))
|
||||||
|
@ -261,7 +263,8 @@ func testForestTreeAdd(t *testing.T, s Forest) {
|
||||||
|
|
||||||
meta := []KeyValue{
|
meta := []KeyValue{
|
||||||
{Key: AttributeVersion, Value: []byte("XXX")},
|
{Key: AttributeVersion, Value: []byte("XXX")},
|
||||||
{Key: AttributeFilename, Value: []byte("file.txt")}}
|
{Key: AttributeFilename, Value: []byte("file.txt")},
|
||||||
|
}
|
||||||
m := &Move{
|
m := &Move{
|
||||||
Parent: RootID,
|
Parent: RootID,
|
||||||
Child: RootID,
|
Child: RootID,
|
||||||
|
@ -306,7 +309,8 @@ func testForestTreeAddByPath(t *testing.T, s Forest) {
|
||||||
|
|
||||||
meta := []KeyValue{
|
meta := []KeyValue{
|
||||||
{Key: AttributeVersion, Value: []byte("XXX")},
|
{Key: AttributeVersion, Value: []byte("XXX")},
|
||||||
{Key: AttributeFilename, Value: []byte("file.txt")}}
|
{Key: AttributeFilename, Value: []byte("file.txt")},
|
||||||
|
}
|
||||||
|
|
||||||
t.Run("invalid descriptor", func(t *testing.T) {
|
t.Run("invalid descriptor", func(t *testing.T) {
|
||||||
_, err := s.TreeAddByPath(context.Background(), CIDDescriptor{cid, 0, 0}, treeID, AttributeFilename, []string{"yyy"}, meta)
|
_, err := s.TreeAddByPath(context.Background(), CIDDescriptor{cid, 0, 0}, treeID, AttributeFilename, []string{"yyy"}, meta)
|
||||||
|
@ -381,7 +385,8 @@ func testForestTreeAddByPath(t *testing.T, s Forest) {
|
||||||
testMeta(t, s, cid, treeID, oldMove.Child, oldMove.Parent,
|
testMeta(t, s, cid, treeID, oldMove.Child, oldMove.Parent,
|
||||||
Meta{Time: oldMove.Time, Items: []KeyValue{
|
Meta{Time: oldMove.Time, Items: []KeyValue{
|
||||||
{AttributeVersion, []byte("SomeValue")},
|
{AttributeVersion, []byte("SomeValue")},
|
||||||
{AttributeFilename, []byte("another")}}})
|
{AttributeFilename, []byte("another")},
|
||||||
|
}})
|
||||||
|
|
||||||
t.Run("get by path", func(t *testing.T) {
|
t.Run("get by path", func(t *testing.T) {
|
||||||
nodes, err := s.TreeGetByPath(context.Background(), cid, treeID, AttributeFilename, []string{"path", "another"}, false)
|
nodes, err := s.TreeGetByPath(context.Background(), cid, treeID, AttributeFilename, []string{"path", "another"}, false)
|
||||||
|
@ -399,7 +404,8 @@ func testForestTreeAddByPath(t *testing.T, s Forest) {
|
||||||
t.Run("empty component", func(t *testing.T) {
|
t.Run("empty component", func(t *testing.T) {
|
||||||
meta := []KeyValue{
|
meta := []KeyValue{
|
||||||
{Key: AttributeVersion, Value: []byte("XXX")},
|
{Key: AttributeVersion, Value: []byte("XXX")},
|
||||||
{Key: AttributeFilename, Value: []byte{}}}
|
{Key: AttributeFilename, Value: []byte{}},
|
||||||
|
}
|
||||||
lm, err := s.TreeAddByPath(context.Background(), d, treeID, AttributeFilename, []string{"path", "to"}, meta)
|
lm, err := s.TreeAddByPath(context.Background(), d, treeID, AttributeFilename, []string{"path", "to"}, meta)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
require.Equal(t, 1, len(lm))
|
require.Equal(t, 1, len(lm))
|
||||||
|
|
|
@ -21,7 +21,8 @@ func TestMeta_Bytes(t *testing.T) {
|
||||||
Items: []KeyValue{
|
Items: []KeyValue{
|
||||||
{"abc", []byte{1, 2, 3}},
|
{"abc", []byte{1, 2, 3}},
|
||||||
{AttributeFilename, []byte{}},
|
{AttributeFilename, []byte{}},
|
||||||
}}
|
},
|
||||||
|
}
|
||||||
|
|
||||||
data := expected.Bytes()
|
data := expected.Bytes()
|
||||||
|
|
||||||
|
@ -35,7 +36,8 @@ func TestMeta_Bytes(t *testing.T) {
|
||||||
Items: []KeyValue{
|
Items: []KeyValue{
|
||||||
{"abc", []byte{1, 2, 3}},
|
{"abc", []byte{1, 2, 3}},
|
||||||
{"xyz", []byte{5, 6, 7, 8}},
|
{"xyz", []byte{5, 6, 7, 8}},
|
||||||
}}
|
},
|
||||||
|
}
|
||||||
|
|
||||||
data := expected.Bytes()
|
data := expected.Bytes()
|
||||||
|
|
||||||
|
|
|
@ -101,7 +101,7 @@ func Test_ObjectNotFoundIfNotDeletedFromMetabase(t *testing.T) {
|
||||||
_, err = sh.Get(context.Background(), getPrm)
|
_, err = sh.Get(context.Background(), getPrm)
|
||||||
require.NoError(t, err, "failed to get")
|
require.NoError(t, err, "failed to get")
|
||||||
|
|
||||||
//inhume
|
// inhume
|
||||||
var inhumePrm InhumePrm
|
var inhumePrm InhumePrm
|
||||||
inhumePrm.MarkAsGarbage(addr)
|
inhumePrm.MarkAsGarbage(addr)
|
||||||
_, err = sh.Inhume(context.Background(), inhumePrm)
|
_, err = sh.Inhume(context.Background(), inhumePrm)
|
||||||
|
@ -110,13 +110,13 @@ func Test_ObjectNotFoundIfNotDeletedFromMetabase(t *testing.T) {
|
||||||
require.Error(t, err, "get returned error")
|
require.Error(t, err, "get returned error")
|
||||||
require.True(t, client.IsErrObjectNotFound(err), "invalid error type")
|
require.True(t, client.IsErrObjectNotFound(err), "invalid error type")
|
||||||
|
|
||||||
//storageID
|
// storageID
|
||||||
var metaStIDPrm meta.StorageIDPrm
|
var metaStIDPrm meta.StorageIDPrm
|
||||||
metaStIDPrm.SetAddress(addr)
|
metaStIDPrm.SetAddress(addr)
|
||||||
storageID, err := sh.metaBase.StorageID(context.Background(), metaStIDPrm)
|
storageID, err := sh.metaBase.StorageID(context.Background(), metaStIDPrm)
|
||||||
require.NoError(t, err, "failed to get storage ID")
|
require.NoError(t, err, "failed to get storage ID")
|
||||||
|
|
||||||
//check existence in blobstore
|
// check existence in blobstore
|
||||||
var bsExisted common.ExistsPrm
|
var bsExisted common.ExistsPrm
|
||||||
bsExisted.Address = addr
|
bsExisted.Address = addr
|
||||||
bsExisted.StorageID = storageID.StorageID()
|
bsExisted.StorageID = storageID.StorageID()
|
||||||
|
@ -124,19 +124,19 @@ func Test_ObjectNotFoundIfNotDeletedFromMetabase(t *testing.T) {
|
||||||
require.NoError(t, err, "failed to check blobstore existence")
|
require.NoError(t, err, "failed to check blobstore existence")
|
||||||
require.True(t, exRes.Exists, "invalid blobstore existence result")
|
require.True(t, exRes.Exists, "invalid blobstore existence result")
|
||||||
|
|
||||||
//drop from blobstor
|
// drop from blobstor
|
||||||
var bsDeletePrm common.DeletePrm
|
var bsDeletePrm common.DeletePrm
|
||||||
bsDeletePrm.Address = addr
|
bsDeletePrm.Address = addr
|
||||||
bsDeletePrm.StorageID = storageID.StorageID()
|
bsDeletePrm.StorageID = storageID.StorageID()
|
||||||
_, err = sh.blobStor.Delete(context.Background(), bsDeletePrm)
|
_, err = sh.blobStor.Delete(context.Background(), bsDeletePrm)
|
||||||
require.NoError(t, err, "failed to delete from blobstore")
|
require.NoError(t, err, "failed to delete from blobstore")
|
||||||
|
|
||||||
//check existence in blobstore
|
// check existence in blobstore
|
||||||
exRes, err = sh.blobStor.Exists(context.Background(), bsExisted)
|
exRes, err = sh.blobStor.Exists(context.Background(), bsExisted)
|
||||||
require.NoError(t, err, "failed to check blobstore existence")
|
require.NoError(t, err, "failed to check blobstore existence")
|
||||||
require.False(t, exRes.Exists, "invalid blobstore existence result")
|
require.False(t, exRes.Exists, "invalid blobstore existence result")
|
||||||
|
|
||||||
//get should return object not found
|
// get should return object not found
|
||||||
_, err = sh.Get(context.Background(), getPrm)
|
_, err = sh.Get(context.Background(), getPrm)
|
||||||
require.Error(t, err, "get returned no error")
|
require.Error(t, err, "get returned no error")
|
||||||
require.True(t, client.IsErrObjectNotFound(err), "invalid error type")
|
require.True(t, client.IsErrObjectNotFound(err), "invalid error type")
|
||||||
|
|
|
@ -41,7 +41,8 @@ func TestShardReload(t *testing.T) {
|
||||||
|
|
||||||
metaOpts := []meta.Option{
|
metaOpts := []meta.Option{
|
||||||
meta.WithPath(filepath.Join(p, "meta")),
|
meta.WithPath(filepath.Join(p, "meta")),
|
||||||
meta.WithEpochState(epochState{})}
|
meta.WithEpochState(epochState{}),
|
||||||
|
}
|
||||||
|
|
||||||
opts := []Option{
|
opts := []Option{
|
||||||
WithID(NewIDFromBytes([]byte{})),
|
WithID(NewIDFromBytes([]byte{})),
|
||||||
|
@ -49,7 +50,8 @@ func TestShardReload(t *testing.T) {
|
||||||
WithBlobStorOptions(blobOpts...),
|
WithBlobStorOptions(blobOpts...),
|
||||||
WithMetaBaseOptions(metaOpts...),
|
WithMetaBaseOptions(metaOpts...),
|
||||||
WithPiloramaOptions(
|
WithPiloramaOptions(
|
||||||
pilorama.WithPath(filepath.Join(p, "pilorama")))}
|
pilorama.WithPath(filepath.Join(p, "pilorama"))),
|
||||||
|
}
|
||||||
|
|
||||||
sh := New(opts...)
|
sh := New(opts...)
|
||||||
require.NoError(t, sh.Open(context.Background()))
|
require.NoError(t, sh.Open(context.Background()))
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue