Non-durable SSE streams (#7986)

* make sse streams non-durable

Signed-off-by: jkoberg <jkoberg@owncloud.com>

* bump reva

Signed-off-by: jkoberg <jkoberg@owncloud.com>

---------

Signed-off-by: jkoberg <jkoberg@owncloud.com>
This commit is contained in:
kobergj
2023-12-18 11:47:25 +01:00
committed by GitHub
parent c7500fead5
commit 377a23ee7d
31 changed files with 173 additions and 60 deletions
@@ -228,7 +228,7 @@ func publisherFromConfig(m map[string]interface{}) (events.Publisher, error) {
if ok {
tlsCert = val.(string)
}
return stream.NatsFromConfig(m["name"].(string), stream.NatsConfig{
return stream.NatsFromConfig(m["name"].(string), false, stream.NatsConfig{
Endpoint: m["address"].(string),
Cluster: m["clusterID"].(string),
EnableTLS: m["enable-tls"].(bool),
@@ -1267,5 +1267,5 @@ func estreamFromConfig(c eventconfig) (events.Stream, error) {
return nil, nil
}
return stream.NatsFromConfig("storageprovider", stream.NatsConfig(c))
return stream.NatsFromConfig("storageprovider", false, stream.NatsConfig(c))
}
@@ -80,7 +80,7 @@ func New(m map[string]interface{}, log *zerolog.Logger) (global.Service, error)
if conf.NatsAddress == "" || conf.NatsClusterID == "" {
log.Warn().Msg("missing or incomplete nats configuration. Events will not be published.")
} else {
s, err := stream.NatsFromConfig("dataprovider", stream.NatsConfig{
s, err := stream.NatsFromConfig("dataprovider", false, stream.NatsConfig{
Endpoint: conf.NatsAddress,
Cluster: conf.NatsClusterID,
EnableTLS: conf.NatsEnableTLS,
+10 -3
View File
@@ -25,7 +25,7 @@ type NatsConfig struct {
}
// NatsFromConfig returns a nats stream from the given config
func NatsFromConfig(connName string, cfg NatsConfig) (events.Stream, error) {
func NatsFromConfig(connName string, disableDurability bool, cfg NatsConfig) (events.Stream, error) {
var tlsConf *tls.Config
if cfg.EnableTLS {
var rootCAPool *x509.CertPool
@@ -48,13 +48,20 @@ func NatsFromConfig(connName string, cfg NatsConfig) (events.Stream, error) {
RootCAs: rootCAPool,
}
}
return Nats(
opts := []natsjs.Option{
natsjs.TLSConfig(tlsConf),
natsjs.Address(cfg.Endpoint),
natsjs.ClusterID(cfg.Cluster),
natsjs.SynchronousPublish(true),
natsjs.Name(connName),
)
}
if disableDurability {
opts = append(opts, natsjs.DisableDurableStreams())
}
return Nats(opts...)
}
+40
View File
@@ -17,4 +17,44 @@ var (
Name: "reva_upload_active",
Help: "Number of active uploads",
})
// UploadProcessing is the number of uploads in processing
UploadProcessing = promauto.NewGauge(prometheus.GaugeOpts{
Name: "reva_upload_processing",
Help: "Number of uploads in processing",
})
// UploadSessionsInitiated is the number of upload sessions that have been initiated
UploadSessionsInitiated = promauto.NewCounter(prometheus.CounterOpts{
Name: "reva_upload_sessions_initiated",
Help: "Number of uploads sessions that were initiated",
})
// UploadSessionsBytesReceived is the number of upload sessions that have received all bytes
UploadSessionsBytesReceived = promauto.NewCounter(prometheus.CounterOpts{
Name: "reva_upload_sessions_bytes_received",
Help: "Number of uploads sessions that have received all bytes",
})
// UploadSessionsFinalized is the number of upload sessions that have received all bytes
UploadSessionsFinalized = promauto.NewCounter(prometheus.CounterOpts{
Name: "reva_upload_sessions_finalized",
Help: "Number of uploads sessions that have successfully completed",
})
// UploadSessionsAborted is the number of upload sessions that have been aborted
UploadSessionsAborted = promauto.NewCounter(prometheus.CounterOpts{
Name: "reva_upload_sessions_aborted",
Help: "Number of uploads sessions that have aborted by postprocessing",
})
// UploadSessionsDeleted is the number of upload sessions that have been deleted
UploadSessionsDeleted = promauto.NewCounter(prometheus.CounterOpts{
Name: "reva_upload_sessions_deleted",
Help: "Number of uploads sessions that have been deleted by postprocessing",
})
// UploadSessionsRestarted is the number of upload sessions that have been restarted
UploadSessionsRestarted = promauto.NewCounter(prometheus.CounterOpts{
Name: "reva_upload_sessions_restarted",
Help: "Number of uploads sessions that have been restarted by postprocessing",
})
// UploadSessionsScanned is the number of upload sessions that have been scanned by antivirus
UploadSessionsScanned = promauto.NewCounter(prometheus.CounterOpts{
Name: "reva_upload_sessions_scanned",
Help: "Number of uploads sessions that have been scanned by antivirus",
})
)
+1 -1
View File
@@ -175,7 +175,7 @@ func NewDefault(m map[string]interface{}) (share.Manager, error) {
var es events.Stream
if c.Events.Endpoint != "" {
es, err = stream.NatsFromConfig("jsoncs3-share-manager", stream.NatsConfig(c.Events))
es, err = stream.NatsFromConfig("jsoncs3-share-manager", false, stream.NatsConfig(c.Events))
if err != nil {
return nil, err
}
@@ -42,6 +42,7 @@ import (
"github.com/cs3org/reva/v2/pkg/events"
"github.com/cs3org/reva/v2/pkg/logger"
"github.com/cs3org/reva/v2/pkg/rgrpc/todo/pool"
"github.com/cs3org/reva/v2/pkg/rhttp/datatx/metrics"
"github.com/cs3org/reva/v2/pkg/rhttp/datatx/utils/download"
"github.com/cs3org/reva/v2/pkg/storage"
"github.com/cs3org/reva/v2/pkg/storage/cache"
@@ -268,14 +269,18 @@ func (fs *Decomposedfs) Postprocessing(ch <-chan events.Event) {
case events.PPOutcomeAbort:
failed = true
keepUpload = true
metrics.UploadSessionsAborted.Inc()
case events.PPOutcomeContinue:
if err := up.Finalize(); err != nil {
log.Error().Err(err).Str("uploadID", ev.UploadID).Msg("could not finalize upload")
keepUpload = true // should we keep the upload when assembling failed?
failed = true
} else {
metrics.UploadSessionsFinalized.Inc()
}
case events.PPOutcomeDelete:
failed = true
metrics.UploadSessionsDeleted.Inc()
}
getParent := func() *node.Node {
@@ -344,6 +349,9 @@ func (fs *Decomposedfs) Postprocessing(ch <-chan events.Event) {
log.Error().Err(err).Str("uploadID", ev.UploadID).Msg("could not create url")
continue
}
metrics.UploadSessionsRestarted.Inc()
// restart postprocessing
if err := events.Publish(ctx, fs.stream, events.BytesReceived{
UploadID: up.Info.ID,
@@ -471,6 +479,8 @@ func (fs *Decomposedfs) Postprocessing(ch <-chan events.Event) {
continue
}
metrics.UploadSessionsScanned.Inc()
// remove cache entry in gateway
fs.cache.RemoveStatContext(ctx, ev.ExecutingUser.GetId(), &provider.ResourceId{SpaceId: n.SpaceID, OpaqueId: n.ID})
default:
@@ -41,6 +41,7 @@ import (
ctxpkg "github.com/cs3org/reva/v2/pkg/ctx"
"github.com/cs3org/reva/v2/pkg/errtypes"
"github.com/cs3org/reva/v2/pkg/mime"
"github.com/cs3org/reva/v2/pkg/rhttp/datatx/metrics"
"github.com/cs3org/reva/v2/pkg/storage/utils/ace"
"github.com/cs3org/reva/v2/pkg/storage/utils/decomposedfs/metadata"
"github.com/cs3org/reva/v2/pkg/storage/utils/decomposedfs/metadata/prefixes"
@@ -1220,6 +1221,9 @@ func (n *Node) FindStorageSpaceRoot(ctx context.Context) error {
// UnmarkProcessing removes the processing flag from the node
func (n *Node) UnmarkProcessing(ctx context.Context, uploadID string) error {
// we currently have to decrease the counter for every processing run to match the incrases
metrics.UploadProcessing.Sub(1)
v, _ := n.XattrString(ctx, prefixes.StatusPrefix)
if v != ProcessingStatus+uploadID {
// file started another postprocessing later - do not remove
@@ -34,6 +34,7 @@ import (
"github.com/cs3org/reva/v2/pkg/appctx"
ctxpkg "github.com/cs3org/reva/v2/pkg/ctx"
"github.com/cs3org/reva/v2/pkg/errtypes"
"github.com/cs3org/reva/v2/pkg/rhttp/datatx/metrics"
"github.com/cs3org/reva/v2/pkg/storage"
"github.com/cs3org/reva/v2/pkg/storage/utils/chunking"
"github.com/cs3org/reva/v2/pkg/storage/utils/decomposedfs/node"
@@ -215,6 +216,8 @@ func (fs *Decomposedfs) InitiateUpload(ctx context.Context, ref *provider.Refere
info, _ = upload.GetInfo(ctx)
metrics.UploadSessionsInitiated.Inc()
return map[string]string{
"simple": info.ID,
"tus": info.ID,
@@ -39,6 +39,7 @@ import (
ctxpkg "github.com/cs3org/reva/v2/pkg/ctx"
"github.com/cs3org/reva/v2/pkg/errtypes"
"github.com/cs3org/reva/v2/pkg/events"
"github.com/cs3org/reva/v2/pkg/rhttp/datatx/metrics"
"github.com/cs3org/reva/v2/pkg/storage/utils/decomposedfs/lookup"
"github.com/cs3org/reva/v2/pkg/storage/utils/decomposedfs/metadata/prefixes"
"github.com/cs3org/reva/v2/pkg/storage/utils/decomposedfs/node"
@@ -265,6 +266,11 @@ func (upload *Upload) FinishUpload(_ context.Context) error {
return err
}
// increase the processing counter for every started processing
// will be decreased in Cleanup()
metrics.UploadProcessing.Inc()
metrics.UploadSessionsBytesReceived.Inc()
upload.Node = n
if upload.pub != nil {
@@ -295,6 +301,7 @@ func (upload *Upload) FinishUpload(_ context.Context) error {
log.Error().Err(err).Msg("failed to upload")
return err
}
metrics.UploadSessionsFinalized.Inc()
}
return upload.tp.Propagate(upload.Ctx, n, upload.SizeDiff)