grafana/pkg/services/store/storage_disk.go
Artur Wierzbicki 9f0b6a5754
Storage: refactor filtering, improve performance (#47403)
* Storage: refactor filtering, improve performance

* added a comment to `newpathfilter`

* after merge fixes
2022-04-21 23:27:43 +04:00

92 lines
2.1 KiB
Go

package store
import (
"context"
"fmt"
"strings"
"github.com/grafana/grafana-plugin-sdk-go/data"
"github.com/grafana/grafana/pkg/infra/filestorage"
"gocloud.dev/blob"
)
const rootStorageTypeDisk = "disk"
type rootStorageDisk struct {
baseStorageRuntime
settings *StorageLocalDiskConfig
}
func newDiskStorage(prefix string, name string, cfg *StorageLocalDiskConfig) *rootStorageDisk {
if cfg == nil {
cfg = &StorageLocalDiskConfig{}
}
meta := RootStorageMeta{
Config: RootStorageConfig{
Type: rootStorageTypeDisk,
Prefix: prefix,
Name: name,
Disk: cfg,
},
}
if prefix == "" {
meta.Notice = append(meta.Notice, data.Notice{
Severity: data.NoticeSeverityError,
Text: "Missing prefix",
})
}
if cfg.Path == "" {
meta.Notice = append(meta.Notice, data.Notice{
Severity: data.NoticeSeverityError,
Text: "Missing path configuration",
})
}
s := &rootStorageDisk{}
if meta.Notice == nil {
path := fmt.Sprintf("file://%s", cfg.Path)
bucket, err := blob.OpenBucket(context.Background(), path)
if err != nil {
grafanaStorageLogger.Warn("error loading storage", "prefix", prefix, "err", err)
meta.Notice = append(meta.Notice, data.Notice{
Severity: data.NoticeSeverityError,
Text: "Failed to initialize storage",
})
} else {
s.store = filestorage.NewCdkBlobStorage(grafanaStorageLogger,
bucket, "",
filestorage.NewPathFilter(cfg.Roots, nil, nil, nil))
meta.Ready = true // exists!
}
}
s.meta = meta
s.settings = cfg
return s
}
func (s *rootStorageDisk) Sync() error {
return nil // already in sync
}
// with local disk user metadata and messages are lost
func (s *rootStorageDisk) Write(ctx context.Context, cmd *WriteValueRequest) (*WriteValueResponse, error) {
byteAray := []byte(cmd.Body)
path := cmd.Path
if !strings.HasPrefix(path, filestorage.Delimiter) {
path = filestorage.Delimiter + path
}
err := s.store.Upsert(ctx, &filestorage.UpsertFileCommand{
Path: path,
Contents: byteAray,
})
if err != nil {
return nil, err
}
return &WriteValueResponse{Code: 200}, nil
}