ce26616647
We have to adapt the live accounting to allow the packages that use it to differentiate about errors for being able to ignore them and make our satellite resilient to Redis downtime. For differentiating errors we should make changes in the live accounting but also in the storage/redis.Client, however, we may need to do some dirty workarounds or break other parts of the implementation that depends on it. On the other hand we want to get rid of the storage/redis.Client because it has more functionality that the one that we are using and some process has been started to remove it. Hence, we have refactored the live accounting to directly use the Redis client library for later on (in a future commit) adapt the satellite for being resilient to Redis downtime. Last but not least, a test for expired bandwidth keys have been added and with it a bug was spotted and fix it. Change-Id: Ibd191522cd20f6a9a15e5ccb7beb83a678e530ff
55 lines
1.8 KiB
Go
55 lines
1.8 KiB
Go
// Copyright (C) 2019 Storj Labs, Inc.
|
|
// See LICENSE for copying information.
|
|
|
|
package live
|
|
|
|
import (
|
|
"strings"
|
|
"time"
|
|
|
|
"github.com/spacemonkeygo/monkit/v3"
|
|
"github.com/zeebo/errs"
|
|
"go.uber.org/zap"
|
|
|
|
"storj.io/storj/satellite/accounting"
|
|
)
|
|
|
|
var (
|
|
// Error is the default error class for live-accounting.
|
|
Error = errs.Class("live-accounting")
|
|
mon = monkit.Package()
|
|
)
|
|
|
|
// Config contains configurable values for the live accounting service.
|
|
type Config struct {
|
|
StorageBackend string `help:"what to use for storing real-time accounting data"`
|
|
BandwidthCacheTTL time.Duration `default:"5m" help:"bandwidth cache key time to live"`
|
|
}
|
|
|
|
// NewCache creates a new accounting.Cache instance using the type specified backend in
|
|
// the provided config.
|
|
//
|
|
// The cache instance may be returned despite of returning the
|
|
// accounting.ErrSystemOrNetError because some backends allows to reconnect on
|
|
// each operation if the connection was not established or it was disconnected,
|
|
// which is what it could happen at the moment to instance it and the cache will
|
|
// work one the backend system will be reachable later on.
|
|
// For this reason, the components that uses the cache should operate despite
|
|
// the backend is not responding successfully although their service is
|
|
// degraded.
|
|
func NewCache(log *zap.Logger, config Config) (accounting.Cache, error) {
|
|
parts := strings.SplitN(config.StorageBackend, ":", 2)
|
|
var backendType string
|
|
if len(parts) == 0 || parts[0] == "" {
|
|
return nil, Error.New("please specify a backend for live accounting")
|
|
}
|
|
|
|
backendType = parts[0]
|
|
switch backendType {
|
|
case "redis":
|
|
return newRedisLiveAccounting(config.StorageBackend)
|
|
default:
|
|
return nil, Error.New("unrecognized live accounting backend specifier %q. Currently only redis is supported", backendType)
|
|
}
|
|
}
|