Skip to content

Commit 0a0bc89

Browse files
authored
Merge pull request #174 from anyproto/go-1679-gateway-close-fix-context
fix gateway chan limiter
2 parents 4900394 + ab36d17 commit 0a0bc89

File tree

1 file changed

+21
-9
lines changed

1 file changed

+21
-9
lines changed

pkg/lib/gateway/gateway.go

+21-9
Original file line numberDiff line numberDiff line change
@@ -185,10 +185,11 @@ func (g *gateway) stopServer() error {
185185

186186
if g.isServerStarted {
187187
g.isServerStarted = false
188-
ctx, cancel := context.WithTimeout(context.Background(), time.Second*5)
188+
// don't wait for the server shutdown because we don't care for the requests to interrupt
189+
ctx, cancel := context.WithTimeout(context.Background(), time.Duration(0))
189190
defer cancel()
190-
if err := g.server.Shutdown(ctx); err != nil {
191-
return err
191+
if err := g.server.Shutdown(ctx); err != nil && !errors.Is(err, context.DeadlineExceeded) {
192+
log.Errorf("gateway stop error: %s", err.Error())
192193
}
193194
if err := g.listener.Close(); err != nil && !errors.Is(err, net.ErrClosed) {
194195
return err
@@ -209,10 +210,16 @@ func (g *gateway) readLimitCh() {
209210

210211
// fileHandler gets file meta from the DB, gets the corresponding data from the IPFS and decrypts it
211212
func (g *gateway) fileHandler(w http.ResponseWriter, r *http.Request) {
212-
g.limitCh <- struct{}{}
213-
defer g.readLimitCh()
213+
select {
214+
case g.limitCh <- struct{}{}:
215+
defer g.readLimitCh()
216+
case <-r.Context().Done():
217+
// exit fast in case context is already done(e.g. server stopped or client canceled)
218+
return
219+
}
214220
enableCors(w)
215-
ctx, cancel := context.WithTimeout(context.Background(), getFileTimeout)
221+
222+
ctx, cancel := context.WithTimeout(r.Context(), getFileTimeout)
216223
defer cancel()
217224
file, reader, err := g.getFile(ctx, r)
218225
if err != nil {
@@ -249,11 +256,16 @@ func (g *gateway) getFile(ctx context.Context, r *http.Request) (files.File, io.
249256

250257
// imageHandler gets image meta from the DB, gets the corresponding data from the IPFS and decrypts it
251258
func (g *gateway) imageHandler(w http.ResponseWriter, r *http.Request) {
252-
g.limitCh <- struct{}{}
253-
defer g.readLimitCh()
259+
select {
260+
case g.limitCh <- struct{}{}:
261+
defer g.readLimitCh()
262+
case <-r.Context().Done():
263+
// exit fast in case context is already done(e.g. server stopped or client canceled)
264+
return
265+
}
254266
enableCors(w)
255267

256-
ctx, cancel := context.WithTimeout(context.Background(), getFileTimeout)
268+
ctx, cancel := context.WithTimeout(r.Context(), getFileTimeout)
257269
defer cancel()
258270

259271
file, reader, err := g.getImage(ctx, r)

0 commit comments

Comments
 (0)