New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
storagenode: decline uploads when there are too many live requests #2397
Changes from all commits
4659477
89031cb
8f0105a
4593416
492c009
48ef87b
5bc671c
f6895c0
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -7,6 +7,7 @@ import ( | |
"context" | ||
"io" | ||
"os" | ||
"sync/atomic" | ||
"time" | ||
|
||
"github.com/golang/protobuf/ptypes" | ||
|
@@ -55,6 +56,7 @@ type OldConfig struct { | |
// Config defines parameters for piecestore endpoint. | ||
type Config struct { | ||
ExpirationGracePeriod time.Duration `help:"how soon before expiration date should things be considered expired" default:"48h0m0s"` | ||
MaxConcurrentRequests int `help:"how many concurrent requests are allowed, before uploads are rejected." default:"6"` | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Maybe we want to define a devDefault and a releaseDefault? |
||
OrderLimitGracePeriod time.Duration `help:"how long after OrderLimit creation date are OrderLimits no longer accepted" default:"1h0m0s"` | ||
|
||
Monitor monitor.Config | ||
|
@@ -75,6 +77,8 @@ type Endpoint struct { | |
orders orders.DB | ||
usage bandwidth.DB | ||
usedSerials UsedSerials | ||
|
||
liveRequests int32 | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. we should make this be one of the first struct fields, so arm alignment is better guaranteed (https://golang.org/pkg/sync/atomic/#pkg-note-BUG) There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Wasn't this an issue for There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. oh yeah good point, maybe worth testing on an arm device |
||
} | ||
|
||
// NewEndpoint creates a new piecestore endpoint. | ||
|
@@ -92,13 +96,18 @@ func NewEndpoint(log *zap.Logger, signer signing.Signer, trust *trust.Pool, moni | |
orders: orders, | ||
usage: usage, | ||
usedSerials: usedSerials, | ||
|
||
liveRequests: 0, | ||
}, nil | ||
} | ||
|
||
// Delete handles deleting a piece on piece store. | ||
func (endpoint *Endpoint) Delete(ctx context.Context, delete *pb.PieceDeleteRequest) (_ *pb.PieceDeleteResponse, err error) { | ||
defer mon.Task()(&ctx)(&err) | ||
|
||
atomic.AddInt32(&endpoint.liveRequests, 1) | ||
defer atomic.AddInt32(&endpoint.liveRequests, -1) | ||
|
||
if delete.Limit.Action != pb.PieceAction_DELETE { | ||
return nil, Error.New("expected delete action got %v", delete.Limit.Action) // TODO: report grpc status unauthorized or bad request | ||
} | ||
|
@@ -129,6 +138,15 @@ func (endpoint *Endpoint) Delete(ctx context.Context, delete *pb.PieceDeleteRequ | |
func (endpoint *Endpoint) Upload(stream pb.Piecestore_UploadServer) (err error) { | ||
ctx := stream.Context() | ||
defer mon.Task()(&ctx)(&err) | ||
|
||
liveRequests := atomic.AddInt32(&endpoint.liveRequests, 1) | ||
defer atomic.AddInt32(&endpoint.liveRequests, -1) | ||
|
||
if int(liveRequests) > endpoint.config.MaxConcurrentRequests { | ||
endpoint.log.Error("upload rejected, too many requests", zap.Int32("live requests", liveRequests)) | ||
return status.Error(codes.Unavailable, "storage node overloaded") | ||
} | ||
|
||
startTime := time.Now().UTC() | ||
|
||
// TODO: set connection timeouts | ||
|
@@ -322,6 +340,10 @@ func (endpoint *Endpoint) Upload(stream pb.Piecestore_UploadServer) (err error) | |
func (endpoint *Endpoint) Download(stream pb.Piecestore_DownloadServer) (err error) { | ||
ctx := stream.Context() | ||
defer mon.Task()(&ctx)(&err) | ||
|
||
atomic.AddInt32(&endpoint.liveRequests, 1) | ||
defer atomic.AddInt32(&endpoint.liveRequests, -1) | ||
|
||
startTime := time.Now().UTC() | ||
|
||
// TODO: set connection timeouts | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Leaving testplanet to 100, because having this lower will probably break some tests.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Worth testing where the limit is, in another PR of course.