Comments (8)
Thanks for opening your first issue here! π Be sure to follow the issue template! If you need help or want to chat with us, join us on Discord https://gofiber.io/discord
from fiber.
Bug Description
I have a data race, when I call
*fiber.App.Shutdown()
methods and have some unprocessed requests , which handlers uses a request ctxSnippet of data race message:
Previous read at 0x00c00023d1f8 by goroutine 45: github.com/valyala/fasthttp.(*RequestCtx).Done() ~/go/pkg/mod/github.com/valyala/[email protected]/server.go:2726 +0x6a context.(*cancelCtx).propagateCancel.func2() /usr/local/go/src/context/context.go:511 +0x62
How to Reproduce
- Handler that uses request ctx for needed funcs
- Run app with -race flag
- Do some requests to server and start shutdown
- See data race by
*fiber.RequestCtx
Expected Behavior
I think this data race was not in plan
Fiber Version
2.52.4
Code Snippet (optional)
func (h *Handler) CreateTopic(c *fiber.Ctx) error { topic := new(feedback.Topic) if err := c.BodyParser(topic); err != nil { return err } id, err := h.feedbackService.CreateTopic(c.Context(), topic) if err != nil { return err } return c.Status(fiber.StatusCreated).JSON(map[string]string{"id": id}) }Checklist:
- I agree to follow Fiber's Code of Conduct.
- I have checked for existing issues that describe my problem prior to opening this one.
- I understand that improperly formatted bug reports may be closed without explanation.
You have to use this method, I think, because it works fine for me, and I'm using Go 1.22.1
example:
// waitForShutdownSignal blocks execution until an OS interrupt or SIGTERM signal is received,
// then it gracefully shuts down the Fiber app within the specified timeout.
func waitForShutdownSignal(shutdownTimeout time.Duration, app *fiber.App, db database.Service) {
// Setting up signal capturing.
quit := make(chan os.Signal, 1)
signal.Notify(quit, os.Interrupt, syscall.SIGTERM)
// Blocking until a signal is received.
sig := <-quit
Logger.LogInfof("Shutting down server... reason: %v", sig)
// Start graceful shutdown in a separate goroutine.
go func() {
// Shutdown the Fiber app
if err := app.Shutdown(); err != nil {
Logger.LogErrorf("Server forced to shutdown: %v", err)
}
// Clean up resources and close the database connection
cleanup(db)
}()
// Create a timer that will wait for the shutdownTimeout to elapse
shutdownTimer := time.NewTimer(shutdownTimeout)
defer shutdownTimer.Stop()
// Wait for the timeout to elapse
<-shutdownTimer.C
Logger.LogInfo("Server exiting")
}
logs:
$ go run cmd/api/main.go
2024/03/31 14:44:15 [H0llyW00dzZ] [INFO] Starting server on :8080
βββββββββββββββββββββββββββββββββββββββββββββββββββββ
β H0llyW00dzZ β
β Fiber v2.52.4 β
β http://127.0.0.1:8080 β
β (bound on host 0.0.0.0 and port 8080) β
β β
β Handlers ............ 534 Processes ........... 1 β
β Prefork ....... Disabled PID .............. 6860 β
βββββββββββββββββββββββββββββββββββββββββββββββββββββ
2024/03/31 14:44:22 [H0llyW00dzZ] [INFO] Shutting down server... reason: interrupt
2024/03/31 14:44:23 [H0llyW00dzZ] [INFO] Disconnected from database: defaultdb
2024/03/31 14:44:23 [H0llyW00dzZ] [INFO] Database connection closed.
2024/03/31 14:44:27 [H0llyW00dzZ] [INFO] Server exiting
from fiber.
with -race flag:
$ go run cmd/api/main.go -race flag
2024/03/31 15:05:12 [H0llyW00dzZ] [INFO] Starting server on :8080
βββββββββββββββββββββββββββββββββββββββββββββββββββββ
β H0llyW00dzZ β
β Fiber v2.52.4 β
β http://127.0.0.1:8080 β
β (bound on host 0.0.0.0 and port 8080) β
β β
β Handlers ............ 534 Processes ........... 1 β
β Prefork ....... Disabled PID ............. 16576 β
βββββββββββββββββββββββββββββββββββββββββββββββββββββ
2024/03/31 15:05:22 [H0llyW00dzZ] [INFO] Shutting down server... reason: interrupt
2024/03/31 15:05:22 [H0llyW00dzZ] [INFO] Disconnected from database: defaultdb
2024/03/31 15:05:22 [H0llyW00dzZ] [INFO] Database connection closed.
2024/03/31 15:05:27 [H0llyW00dzZ] [INFO] Server exiting
from fiber.
Doesn't running with -race
make your program super slow?
from fiber.
Doesn't running with
-race
make your program super slow?
It is only for tests
from fiber.
with -race flag:
$ go run cmd/api/main.go -race flag 2024/03/31 15:05:12 [H0llyW00dzZ] [INFO] Starting server on :8080 βββββββββββββββββββββββββββββββββββββββββββββββββββββ β H0llyW00dzZ β β Fiber v2.52.4 β β http://127.0.0.1:8080 β β (bound on host 0.0.0.0 and port 8080) β β β β Handlers ............ 534 Processes ........... 1 β β Prefork ....... Disabled PID ............. 16576 β βββββββββββββββββββββββββββββββββββββββββββββββββββββ 2024/03/31 15:05:22 [H0llyW00dzZ] [INFO] Shutting down server... reason: interrupt 2024/03/31 15:05:22 [H0llyW00dzZ] [INFO] Disconnected from database: defaultdb 2024/03/31 15:05:22 [H0llyW00dzZ] [INFO] Database connection closed. 2024/03/31 15:05:27 [H0llyW00dzZ] [INFO] Server exiting
I send about 10 requests to a method that uses the request context for further steps, and immediately run the Shutdown method on the interrupt signal (ShutdownWithContext has similar behavior). I accidentally noticed this when app running with the -race flag.
So I can fix this using context package in handler, but without request ctx as a parent
from fiber.
hi bro, Have you determined this is a bug?
from fiber.
hi bro, Have you determined this is a bug?
Not entirely sure, but looks like not exactly expected behavior. What do you think?
Itβs just that in some places you want to use this request context in case it is interrupted, and a similar problem arises every other time - and only when calling Shutdovn (the case is still the same - about 10 requests or more, then instant strart Shutdovn)
from fiber.
Related Issues (20)
- π [Bug]: Prefork Not Working on Fiber v3 HOT 2
- π [Proposal]: shutdown procedure
- π [Bug]: incorrect routing when adding a default layout HOT 4
- π [Bug]: Middleware Monitor "CPU Usage" is a "static value". HOT 2
- π [Bug]: Appending handlers screws up routing HOT 2
- π€ [Question]: get param from path for proxy pass request HOT 1
- π [Bug]: Abort Signal HOT 5
- π€ [Question]: Enable DisableHeaderNormalizing config will occur wrong cors middleware behaviour HOT 11
- π€ [Question]: Question on ETag Docs HOT 1
- π€ [Question]: Does Fiber handle each request in different goroutines? HOT 2
- π [Feature] [v2]: Add a function to get the session expiry HOT 5
- π [Bug]: setting a Logger that access TLSConnectionState() will break when `app.Server().MaxConnsPerIP` is set to a value HOT 9
- π€ [Question]: Fiber http with Cloudflare ssl reverse leading to 525, SSL handshake failed HOT 2
- π€ [Question] Is Fiber going to be used for Rust? HOT 3
- proxy.Balancer middleware should handle http backend servers when using app.ListenTLS HOT 2
- π€ [Question]: How to get the form data from the html form object? HOT 1
- π [Proposal]: Add support for zstd compression
- π [Proposal]: Add support for CHIPS (Cookies Having Independent Partitioned State)
- π [Bug]: incorrect selection of the error handler if one of the sub apps is mounted on "/" HOT 2
- π€ [Question]: gofiber v3 rc release date? HOT 2
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
π Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. πππ
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google β€οΈ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from fiber.