[server] Streamline storage backend access, fix init error

This commit is contained in:
Abhishek Shroff
2025-06-07 22:43:57 +05:30
parent 1c3fc828fa
commit ab634fb3b9
4 changed files with 27 additions and 11 deletions

View File

@@ -7,8 +7,8 @@ db:
nomigrate: false # Do not auto-migrate schema (dev)
trace: false # Trace queries (dev)
fs:
storage: storage
storage:
location: storage
user:
password:

View File

@@ -10,6 +10,7 @@ import (
"github.com/google/uuid"
"github.com/jackc/pgx/v5"
"github.com/jackc/pgx/v5/pgtype"
"github.com/shroff/phylum/server/internal/storage"
)
type ResourceBindConflictResolution int32
@@ -276,7 +277,7 @@ func (f filesystem) createResourceVersion(id, versionID uuid.UUID, size int64, m
"size": size,
"mime_type": mimeType,
"sha256": sha256,
"storage": "_",
"storage": storage.DefaultBackendName,
}
_, err := f.db.Exec(q, args)
return err

View File

@@ -28,8 +28,8 @@ func (v Version) OpenRead(start, length int) (io.ReadCloser, error) {
if v.Storage == "" {
return nil, errors.New("unknown storage backend")
}
if b := storage.GetBackend(v.Storage); b == nil {
return nil, errors.New("storage backend not found: " + v.Storage)
if b, err := storage.GetBackend(v.Storage); err != nil {
return nil, errors.New("failed to read " + v.ID.String() + ": " + err.Error())
} else {
return b.OpenRead(v.ID.String(), start, length)
}

View File

@@ -3,6 +3,7 @@ package storage
import (
"encoding/json"
"errors"
"fmt"
"os"
"path"
@@ -12,6 +13,9 @@ import (
)
var Cfg Config
const DefaultBackendName = "_"
var defaultBackend LocalBackend
var backends map[string]Backend
@@ -22,8 +26,15 @@ type BackendConfig struct {
}
func Initialize(db db.Handler) error {
if err := os.Chmod(Cfg.Location, 0700); err != nil {
return errors.New("failed to set permissions: " + err.Error())
if err := os.MkdirAll(Cfg.Location, 0700); err != nil {
return errors.New("failed to create storage location(" + Cfg.Location + "): " + err.Error())
} else {
if stat, err := os.Stat(Cfg.Location); err != nil {
return errors.New("failed to stat storage location(" + Cfg.Location + "): " + err.Error())
} else if stat.Mode()&0xfff != 0700 {
return errors.New("storage location does not have correct permissions (0700): " + fmt.Sprintf("%o", stat.Mode()&0xfff))
}
}
if restoredBackends, err := restoreBackends(db); err != nil {
return errors.New("failed to restore backends: " + err.Error())
@@ -42,11 +53,15 @@ func DefaultBackend() LocalBackend {
return defaultBackend
}
func GetBackend(name string) Backend {
if name == "_" {
return defaultBackend
func GetBackend(name string) (Backend, error) {
if name == DefaultBackendName {
return defaultBackend, nil
}
if b, ok := backends[name]; !ok {
return nil, errors.New("no storage backend named \"" + name + "\"")
} else {
return b, nil
}
return backends[name]
}
func ListBackends() map[string]Backend {