Skip to content

Fixing race condition in concurrent writing of 'cachedSessions' map. #151

Merged
TwistedHardware merged 1 commit intouadmin:masterfrom
Baber-Jan:fixingRaceConditionInLoadSession
Oct 30, 2023
Merged

Fixing race condition in concurrent writing of 'cachedSessions' map. #151
TwistedHardware merged 1 commit intouadmin:masterfrom
Baber-Jan:fixingRaceConditionInLoadSession

Conversation

@Baber-Jan
Copy link
Copy Markdown
Contributor

@Baber-Jan Baber-Jan commented Oct 30, 2023

It is used to keep active sessions in memory. However, it loadSession function in session.go was creating race condition.
cachedSessions = map[string]Session{} for _, s := range sList { Preload(&s) Preload(&s.User) cachedSessions[s.Key] = s }
This part was modfying a global variable(shared) and was causing race conditions.
So, I added a Read and Write Mutex Lock and protected its read and write access (can have multiple reads).

The code changes were tested locally on the system (with our own application) and they worked(succesfully able to do multiple logins at the same time)

Below is the error trace:

WARNING: DATA RACE --(this when bulding with --race)
Write at 0x00c0000a0ba0 by goroutine 150506:
runtime.mapassign()
/usr/local/go/src/runtime/map.go:578 +0x0
github.com/uadmin/uadmin.loadSessions()
/media/HDD/GoProjects/pkg/mod/github.com/uadmin/[email protected]/session.go:90 +0x32f
github.com/uadmin/uadmin.(*User).Save()
/media/HDD/GoProjects/pkg/mod/github.com/uadmin/[email protected]/user.go:60 +0x61b
github.com/uadmin/uadmin.(*User).Login()
/media/HDD/GoProjects/pkg/mod/github.com/uadmin/[email protected]/user.go:103 +0x7c4
github.com/karazapp/back-end/models/KarazCareModel.Login()
/media/HDD/Karaz/back-end/models/KarazCareModel/member.go:53 +0x169
github.com/karazapp/back-end/api/KarazCareApi.Login()
/media/HDD/Karaz/back-end/api/KarazCareApi/login.go:39 +0x2b4
github.com/karazapp/back-end/routes/KarazCareHandler.KarazCareHandler()
/media/HDD/Karaz/back-end/routes/KarazCareHandler/karazCareHandler.go:16 +0x125
github.com/karazapp/back-end/routes.MiddlewareAuth()
/media/HDD/Karaz/back-end/routes/MiddlewareAuth.go:168 +0x2033
net/http.HandlerFunc.ServeHTTP()
/usr/local/go/src/net/http/server.go:2122 +0x4d
github.com/getsentry/sentry-go/http.(*Handler).handle.func1()
/media/HDD/GoProjects/pkg/mod/github.com/getsentry/[email protected]/http/sentryhttp.go:103 +0x52e
github.com/uadmin/uadmin.Handler.func1()
/media/HDD/GoProjects/pkg/mod/github.com/uadmin/[email protected]/handler.go:107 +0x1257
net/http.HandlerFunc.ServeHTTP()
/usr/local/go/src/net/http/server.go:2122 +0x4d
net/http.(*ServeMux).ServeHTTP()
/usr/local/go/src/net/http/server.go:2500 +0xc5
net/http.serverHandler.ServeHTTP()
/usr/local/go/src/net/http/server.go:2936 +0x682
net/http.(*conn).serve()
/usr/local/go/src/net/http/server.go:1995 +0xbd4
net/http.(*Server).Serve.func3()
/usr/local/go/src/net/http/server.go:3089 +0x58

Previous write at 0x00c0000a0ba0 by goroutine 150634:
runtime.mapassign()
/usr/local/go/src/runtime/map.go:578 +0x0
github.com/uadmin/uadmin.loadSessions()
/media/HDD/GoProjects/pkg/mod/github.com/uadmin/[email protected]/session.go:90 +0x32f
github.com/uadmin/uadmin.(*User).Save()
/media/HDD/GoProjects/pkg/mod/github.com/uadmin/[email protected]/user.go:60 +0x61b
github.com/uadmin/uadmin.(*User).Login()
/media/HDD/GoProjects/pkg/mod/github.com/uadmin/[email protected]/user.go:103 +0x7c4
github.com/karazapp/back-end/models/KarazCareModel.Login()
/media/HDD/Karaz/back-end/models/KarazCareModel/member.go:53 +0x169
github.com/karazapp/back-end/api/KarazCareApi.Login()
/media/HDD/Karaz/back-end/api/KarazCareApi/login.go:39 +0x2b4
github.com/karazapp/back-end/routes/KarazCareHandler.KarazCareHandler()
/media/HDD/Karaz/back-end/routes/KarazCareHandler/karazCareHandler.go:16 +0x125
github.com/karazapp/back-end/routes.MiddlewareAuth()
/media/HDD/Karaz/back-end/routes/MiddlewareAuth.go:168 +0x2033
net/http.HandlerFunc.ServeHTTP()
/usr/local/go/src/net/http/server.go:2122 +0x4d
github.com/getsentry/sentry-go/http.(*Handler).handle.func1()
/media/HDD/GoProjects/pkg/mod/github.com/getsentry/[email protected]/http/sentryhttp.go:103 +0x52e
github.com/uadmin/uadmin.Handler.func1()
/media/HDD/GoProjects/pkg/mod/github.com/uadmin/[email protected]/handler.go:107 +0x1257
net/http.HandlerFunc.ServeHTTP()
/usr/local/go/src/net/http/server.go:2122 +0x4d
net/http.(*ServeMux).ServeHTTP()
/usr/local/go/src/net/http/server.go:2500 +0xc5
net/http.serverHandler.ServeHTTP()
/usr/local/go/src/net/http/server.go:2936 +0x682
net/http.(*conn).serve()
/usr/local/go/src/net/http/server.go:1995 +0xbd4
net/http.(*Server).Serve.func3()
/usr/local/go/src/net/http/server.go:3089 +0x58

Goroutine 150506 (running) created at:
net/http.(*Server).Serve()
/usr/local/go/src/net/http/server.go:3089 +0x817
net/http.(*Server).ListenAndServe()
/usr/local/go/src/net/http/server.go:2988 +0xc4
net/http.ListenAndServe()
/usr/local/go/src/net/http/server.go:3242 +0x8b7
github.com/uadmin/uadmin.StartServer()
/media/HDD/GoProjects/pkg/mod/github.com/uadmin/[email protected]/server.go:78 +0x71f
github.com/karazapp/back-end/Main.Start()
/media/HDD/Karaz/back-end/Main/maininit.go:422 +0x3e86
main.main()
/media/HDD/Karaz/back-end/main.go:12 +0x24

Goroutine 150634 (running) created at:
net/http.(*Server).Serve()
/usr/local/go/src/net/http/server.go:3089 +0x817
net/http.(*Server).ListenAndServe()
/usr/local/go/src/net/http/server.go:2988 +0xc4
net/http.ListenAndServe()
/usr/local/go/src/net/http/server.go:3242 +0x8b7
github.com/uadmin/uadmin.StartServer()
/media/HDD/GoProjects/pkg/mod/github.com/uadmin/[email protected]/server.go:78 +0x71f
github.com/karazapp/back-end/Main.Start()
/media/HDD/Karaz/back-end/Main/maininit.go:422 +0x3e86
main.main()
/media/HDD/Karaz/back-end/main.go:12 +0x24

fatal error: concurrent map writes --- (This was happening when trying to login and it was crashing the server )

goroutine 150491 [running]:
github.com/uadmin/uadmin.loadSessions()
/media/HDD/GoProjects/pkg/mod/github.com/uadmin/[email protected]/session.go:90 +0x330
github.com/uadmin/uadmin.(*User).Save(0xc000e4f900)
/media/HDD/GoProjects/pkg/mod/github.com/uadmin/[email protected]/user.go:60 +0x61c
github.com/uadmin/uadmin.(*User).Login(0xc000e4f900, {0xc0019ffbbb, 0x5}, {0x0, 0x0})
/media/HDD/GoProjects/pkg/mod/github.com/uadmin/[email protected]/user.go:103 +0x7c5
github.com/karazapp/back-end/models/KarazCareModel.Login({0xc0019ffba1, 0xf}, {0xc0019ffbbb, 0x5})
/media/HDD/Karaz/back-end/models/KarazCareModel/member.go:53 +0x16a
github.com/karazapp/back-end/api/KarazCareApi.Login({0x1c84490, 0xc000b41bc0}, 0x1c78990?)
/media/HDD/Karaz/back-end/api/KarazCareApi/login.go:39 +0x2b5
github.com/karazapp/back-end/routes/KarazCareHandler.KarazCareHandler({0x1c84490, 0xc000b41bc0}, 0xc000e4f800)
/media/HDD/Karaz/back-end/routes/KarazCareHandler/karazCareHandler.go:16 +0x126
github.com/karazapp/back-end/routes.MiddlewareAuth({0x1c84490, 0xc000b41bc0}, 0xc000ed4700)
/media/HDD/Karaz/back-end/routes/MiddlewareAuth.go:168 +0x2034
net/http.HandlerFunc.ServeHTTP(0x1857538, {0x1c84490, 0xc000b41bc0}, 0xb?)
/usr/local/go/src/net/http/server.go:2122 +0x4e
github.com/getsentry/sentry-go/http.(*Handler).handle.func1({0x1c84490, 0xc000b41bc0}, 0xc000ed4600)
/media/HDD/GoProjects/pkg/mod/github.com/getsentry/[email protected]/http/sentryhttp.go:103 +0x52f
github.com/uadmin/uadmin.Handler.func1({0x1c84a60?, 0xc000eb8460}, 0xc000ed4500)
/media/HDD/GoProjects/pkg/mod/github.com/uadmin/[email protected]/handler.go:107 +0x1258
net/http.HandlerFunc.ServeHTTP(0xc000a2ffe0, {0x1c84a60, 0xc000eb8460}, 0x0?)
/usr/local/go/src/net/http/server.go:2122 +0x4e
net/http.(*ServeMux).ServeHTTP(0x0?, {0x1c84a60, 0xc000eb8460}, 0xc000ed4500)
/usr/local/go/src/net/http/server.go:2500 +0xc6
net/http.serverHandler.ServeHTTP({0x1c82240?}, {0x1c84a60, 0xc000eb8460}, 0xc000ed4500)
/usr/local/go/src/net/http/server.go:2936 +0x683
net/http.(*conn).serve(0xc0009c6ab0, {0x1c856e8, 0xc000e8cf30})
/usr/local/go/src/net/http/server.go:1995 +0xbd5
created by net/http.(*Server).Serve
/usr/local/go/src/net/http/server.go:3089 +0x818

goroutine 1 [IO wait]:
internal/poll.runtime_pollWait(0x7f7ba59a47b8, 0x72)
/usr/local/go/src/runtime/netpoll.go:306 +0x89
internal/poll.(*pollDesc).wait(0xc000a21498, 0x43b101?, 0x0)
/usr/local/go/src/internal/poll/fd_poll_runtime.go:84 +0xbd
internal/poll.(*pollDesc).waitRead(...)
/usr/local/go/src/internal/poll/fd_poll_runtime.go:89
internal/poll.(*FD).Accept(0xc000a21480)
/usr/local/go/src/internal/poll/fd_unix.go:614 +0x425
net.(*netFD).accept(0xc000a21480)
/usr/local/go/src/net/fd_unix.go:172 +0x4a
net.(*TCPListener).accept(0xc0016acf60)
/usr/local/go/src/net/tcpsock_posix.go:148 +0x45
net.(*TCPListener).Accept(0xc0016acf60)
/usr/local/go/src/net/tcpsock.go:297 +0x68
net/http.(*Server).Serve(0xc00024e1e0, {0x1c84850, 0xc0016acf60})
/usr/local/go/src/net/http/server.go:3059 +0x5a7
net/http.(*Server).ListenAndServe(0xc00024e1e0)
/usr/local/go/src/net/http/server.go:2988 +0xc5
net/http.ListenAndServe(...)
/usr/local/go/src/net/http/server.go:3242
github.com/uadmin/uadmin.StartServer()
/media/HDD/GoProjects/pkg/mod/github.com/uadmin/[email protected]/server.go:78 +0x8b8
github.com/karazapp/back-end/Main.Start()
/media/HDD/Karaz/back-end/Main/maininit.go:422 +0x3e87
main.main()
/media/HDD/Karaz/back-end/main.go:12 +0x25

goroutine 4 [select, 69 minutes]:
database/sql.(*DB).connectionOpener(0xc0004aedd0, {0x1c85640, 0xc000188410})
/usr/local/go/src/database/sql/sql.go:1218 +0xf3
created by database/sql.OpenDB
/usr/local/go/src/database/sql/sql.go:791 +0x30d

goroutine 136125 [select, 3 minutes]:
github.com/go-sql-driver/mysql.(*mysqlConn).startWatcher.func1()
/media/HDD/GoProjects/pkg/mod/github.com/go-sql-driver/[email protected]/connection.go:614 +0x113
created by github.com/go-sql-driver/mysql.(*mysqlConn).startWatcher
/media/HDD/GoProjects/pkg/mod/github.com/go-sql-driver/[email protected]/connection.go:611 +0x1c5

goroutine 150580 [IO wait]:
internal/poll.runtime_pollWait(0x7f7ba59a44e8, 0x72)
/usr/local/go/src/runtime/netpoll.go:306 +0x89
internal/poll.(*pollDesc).wait(0xc000d5c018, 0xc0007f8461?, 0x0)
/usr/local/go/src/internal/poll/fd_poll_runtime.go:84 +0xbd
internal/poll.(*pollDesc).waitRead(...)
/usr/local/go/src/internal/poll/fd_poll_runtime.go:89
internal/poll.(*FD).Read(0xc000d5c000, {0xc0007f8461, 0x1, 0x1})
/usr/local/go/src/internal/poll/fd_unix.go:167 +0x405
net.(*netFD).Read(0xc000d5c000, {0xc0007f8461, 0x1, 0x1})
/usr/local/go/src/net/fd_posix.go:55 +0x51
net.(*conn).Read(0xc000f66000, {0xc0007f8461, 0x1, 0x1})
/usr/local/go/src/net/net.go:183 +0xb1
net/http.(*connReader).backgroundRead(0xc0007f8450)
/usr/local/go/src/net/http/server.go:674 +0x79
created by net/http.(*connReader).startBackgroundRead
/usr/local/go/src/net/http/server.go:670 +0x1a7

goroutine 158787 [runnable]:
github.com/uadmin/uadmin.SetMetric.func1()
/media/HDD/GoProjects/pkg/mod/github.com/uadmin/[email protected]/metrics.go:49
runtime.goexit()
/usr/local/go/src/runtime/asm_amd64.s:1598 +0x1
created by github.com/uadmin/uadmin.SetMetric
/media/HDD/GoProjects/pkg/mod/github.com/uadmin/[email protected]/metrics.go:49 +0xba

goroutine 139689 [IO wait, 1 minutes]:
internal/poll.runtime_pollWait(0x7f7ba59a48a8, 0x72)
/usr/local/go/src/runtime/netpoll.go:306 +0x89
internal/poll.(*pollDesc).wait(0xc000c5c398, 0xc000fee000?, 0x0)
/usr/local/go/src/internal/poll/fd_poll_runtime.go:84 +0xbd
internal/poll.(*pollDesc).waitRead(...)
/usr/local/go/src/internal/poll/fd_poll_runtime.go:89
internal/poll.(*FD).Read(0xc000c5c380, {0xc000fee000, 0x1000, 0x1000})
/usr/local/go/src/internal/poll/fd_unix.go:167 +0x405
net.(*netFD).Read(0xc000c5c380, {0xc000fee000, 0x1000, 0x1000})
/usr/local/go/src/net/fd_posix.go:55 +0x51
net.(*conn).Read(0xc0014fc2a8, {0xc000fee000, 0x1000, 0x1000})
/usr/local/go/src/net/net.go:183 +0xb1
net/http.(*connReader).Read(0xc0007f9b30, {0xc000fee000, 0x1000, 0x1000})
/usr/local/go/src/net/http/server.go:782 +0x23b
bufio.(*Reader).fill(0xc001a39e00)
/usr/local/go/src/bufio/bufio.go:106 +0x2ab
bufio.(*Reader).Peek(0xc001a39e00, 0x4)
/usr/local/go/src/bufio/bufio.go:144 +0xd2
net/http.(*conn).serve(0xc0009b2990, {0x1c856e8, 0xc000e8cf30})
/usr/local/go/src/net/http/server.go:2030 +0xe28
created by net/http.(*Server).Serve
/usr/local/go/src/net/http/server.go:3089 +0x818

goroutine 10368 [select, 1 minutes]:
github.com/go-co-op/gocron.(*executor).start(0xc0006da400)
/media/HDD/GoProjects/pkg/mod/github.com/go-co-op/[email protected]/executor.go:46 +0x18f
created by github.com/go-co-op/gocron.(*Scheduler).start
/media/HDD/GoProjects/pkg/mod/github.com/go-co-op/[email protected]/scheduler.go:89 +0xb7

goroutine 139709 [IO wait, 1 minutes]:
internal/poll.runtime_pollWait(0x7f7ba59a4998, 0x72)
/usr/local/go/src/runtime/netpoll.go:306 +0x89
internal/poll.(*pollDesc).wait(0xc000716518, 0xc001088000?, 0x0)
/usr/local/go/src/internal/poll/fd_poll_runtime.go:84 +0xbd
internal/poll.(*pollDesc).waitRead(...)
/usr/local/go/src/internal/poll/fd_poll_runtime.go:89
internal/poll.(*FD).Read(0xc000716500, {0xc001088000, 0x1000, 0x1000})
/usr/local/go/src/internal/poll/fd_unix.go:167 +0x405
net.(*netFD).Read(0xc000716500, {0xc001088000, 0x1000, 0x1000})
/usr/local/go/src/net/fd_posix.go:55 +0x51
net.(*conn).Read(0xc000c5eab0, {0xc001088000, 0x1000, 0x1000})
/usr/local/go/src/net/net.go:183 +0xb1
net/http.(*connReader).Read(0xc0007a3ce0, {0xc001088000, 0x1000, 0x1000})
/usr/local/go/src/net/http/server.go:782 +0x23b
bufio.(*Reader).fill(0xc00161bd40)
/usr/local/go/src/bufio/bufio.go:106 +0x2ab
bufio.(*Reader).Peek(0xc00161bd40, 0x4)
/usr/local/go/src/bufio/bufio.go:144 +0xd2
net/http.(*conn).serve(0xc00061fd40, {0x1c856e8, 0xc000e8cf30})
/usr/local/go/src/net/http/server.go:2030 +0xe28
created by net/http.(*Server).Serve
/usr/local/go/src/net/http/server.go:3089 +0x818

goroutine 150495 [runnable]:
runtime.Gosched(...)
/usr/local/go/src/runtime/proc.go:321
github.com/uadmin/uadmin.loadSessions()
/media/HDD/GoProjects/pkg/mod/github.com/uadmin/[email protected]/session.go:90 +0x330
github.com/uadmin/uadmin.(*User).Save(0xc00116c900)
/media/HDD/GoProjects/pkg/mod/github.com/uadmin/[email protected]/user.go:60 +0x61c
github.com/uadmin/uadmin.(*User).Login(0xc00116c900, {0xc000d8a6db, 0x5}, {0x0, 0x0})
/media/HDD/GoProjects/pkg/mod/github.com/uadmin/[email protected]/user.go:103 +0x7c5
github.com/karazapp/back-end/models/KarazCareModel.Login({0xc000d8a6c1, 0xf}, {0xc000d8a6db, 0x5})
/media/HDD/Karaz/back-end/models/KarazCareModel/member.go:53 +0x16a
github.com/karazapp/back-end/api/KarazCareApi.Login({0x1c84490, 0xc000b40080}, 0x1c78990?)
/media/HDD/Karaz/back-end/api/KarazCareApi/login.go:39 +0x2b5
github.com/karazapp/back-end/routes/KarazCareHandler.KarazCareHandler({0x1c84490, 0xc000b40080}, 0xc00116c800)
/media/HDD/Karaz/back-end/routes/KarazCareHandler/karazCareHandler.go:16 +0x126
github.com/karazapp/back-end/routes.MiddlewareAuth({0x1c84490, 0xc000b40080}, 0xc000c94100)
/media/HDD/Karaz/back-end/routes/MiddlewareAuth.go:168 +0x2034
net/http.HandlerFunc.ServeHTTP(0x1857538, {0x1c84490, 0xc000b40080}, 0xb?)
/usr/local/go/src/net/http/server.go:2122 +0x4e
github.com/getsentry/sentry-go/http.(*Handler).handle.func1({0x1c84490, 0xc000b40080}, 0xc000c94000)
/media/HDD/GoProjects/pkg/mod/github.com/getsentry/[email protected]/http/sentryhttp.go:103 +0x52f
github.com/uadmin/uadmin.Handler.func1({0x1c84a60?, 0xc000eb8000}, 0xc00116c000)
/media/HDD/GoProjects/pkg/mod/github.com/uadmin/[email protected]/handler.go:107 +0x1258
net/http.HandlerFunc.ServeHTTP(0xc000a2ffe0, {0x1c84a60, 0xc000eb8000}, 0x0?)
/usr/local/go/src/net/http/server.go:2122 +0x4e
net/http.(*ServeMux).ServeHTTP(0x0?, {0x1c84a60, 0xc000eb8000}, 0xc00116c000)
/usr/local/go/src/net/http/server.go:2500 +0xc6
net/http.serverHandler.ServeHTTP({0x1c82240?}, {0x1c84a60, 0xc000eb8000}, 0xc00116c000)
/usr/local/go/src/net/http/server.go:2936 +0x683
net/http.(*conn).serve(0xc0009c6090, {0x1c856e8, 0xc000e8cf30})
/usr/local/go/src/net/http/server.go:1995 +0xbd5
created by net/http.(*Server).Serve
/usr/local/go/src/net/http/server.go:3089 +0x818

goroutine 12098 [IO wait, 1 minutes]:
internal/poll.runtime_pollWait(0x7f7ba59a4d58, 0x72)
/usr/local/go/src/runtime/netpoll.go:306 +0x89
internal/poll.(*pollDesc).wait(0xc00086c698, 0xc0004bb000?, 0x0)
/usr/local/go/src/internal/poll/fd_poll_runtime.go:84 +0xbd
internal/poll.(*pollDesc).waitRead(...)
/usr/local/go/src/internal/poll/fd_poll_runtime.go:89
internal/poll.(*FD).Read(0xc00086c680, {0xc0004bb000, 0x1800, 0x1800})
/usr/local/go/src/internal/poll/fd_unix.go:167 +0x405
net.(*netFD).Read(0xc00086c680, {0xc0004bb000, 0x1800, 0x1800})
/usr/local/go/src/net/fd_posix.go:55 +0x51
net.(*conn).Read(0xc00018b070, {0xc0004bb000, 0x1800, 0x1800})
/usr/local/go/src/net/net.go:183 +0xb1
crypto/tls.(*atLeastReader).Read(0xc0010cf6b0, {0xc0004bb000, 0x1800, 0x1800})
/usr/local/go/src/crypto/tls/conn.go:788 +0x86
bytes.(*Buffer).ReadFrom(0xc001798990, {0x1c7b580, 0xc0010cf6b0})
/usr/local/go/src/bytes/buffer.go:202 +0x113
crypto/tls.(*Conn).readFromUntil(0xc001798700, {0x1c7c980?, 0xc00018b070}, 0x5)
/usr/local/go/src/crypto/tls/conn.go:810 +0x1f3
crypto/tls.(*Conn).readRecordOrCCS(0xc001798700, 0x0)
/usr/local/go/src/crypto/tls/conn.go:617 +0x417
crypto/tls.(*Conn).readRecord(...)
/usr/local/go/src/crypto/tls/conn.go:583
crypto/tls.(*Conn).Read(0xc001798700, {0xc000779000, 0x1000, 0x100010000008b?})
/usr/local/go/src/crypto/tls/conn.go:1316 +0x29d
bufio.(*Reader).Read(0xc001503da0, {0xc001d0e4a0, 0x9, 0x9})
/usr/local/go/src/bufio/bufio.go:237 +0x4f3
io.ReadAtLeast({0x1c7b3a0, 0xc001503da0}, {0xc001d0e4a0, 0x9, 0x9}, 0x9)
/usr/local/go/src/io/io.go:332 +0xde
io.ReadFull(...)
/usr/local/go/src/io/io.go:351
net/http.http2readFrameHeader({0xc001d0e4a0?, 0x9?, 0x9?}, {0x1c7b3a0?, 0xc001503da0?})
/usr/local/go/src/net/http/h2_bundle.go:1567 +0x96
net/http.(*http2Framer).ReadFrame(0xc001d0e460)
/usr/local/go/src/net/http/h2_bundle.go:1831 +0x10f
net/http.(*http2clientConnReadLoop).run(0xc0011f9f98)
/usr/local/go/src/net/http/h2_bundle.go:9187 +0x1f9
net/http.(*http2ClientConn).readLoop(0xc000248480)
/usr/local/go/src/net/http/h2_bundle.go:9082 +0xab
created by net/http.(*http2Transport).newClientConn
/usr/local/go/src/net/http/h2_bundle.go:7779 +0x191f

goroutine 23817 [sleep]:
time.Sleep(0x2540be400)
/usr/local/go/src/runtime/time.go:195 +0x135
github.com/uadmin/uadmin.abTestService()
/media/HDD/GoProjects/pkg/mod/github.com/uadmin/[email protected]/services.go:21 +0x31
created by github.com/uadmin/uadmin.init.0.func1
/media/HDD/GoProjects/pkg/mod/github.com/uadmin/[email protected]/services.go:12 +0x4e

goroutine 139495 [IO wait, 1 minutes]:
internal/poll.runtime_pollWait(0x7f7ba59a4b78, 0x72)
/usr/local/go/src/runtime/netpoll.go:306 +0x89
internal/poll.(*pollDesc).wait(0xc0004d3198, 0xc000191000?, 0x0)
/usr/local/go/src/internal/poll/fd_poll_runtime.go:84 +0xbd
internal/poll.(*pollDesc).waitRead(...)
/usr/local/go/src/internal/poll/fd_poll_runtime.go:89
internal/poll.(*FD).Read(0xc0004d3180, {0xc000191000, 0x1000, 0x1000})
/usr/local/go/src/internal/poll/fd_unix.go:167 +0x405
net.(*netFD).Read(0xc0004d3180, {0xc000191000, 0x1000, 0x1000})
/usr/local/go/src/net/fd_posix.go:55 +0x51
net.(*conn).Read(0xc000015090, {0xc000191000, 0x1000, 0x1000})
/usr/local/go/src/net/net.go:183 +0xb1
net/http.(*connReader).Read(0xc000a66ae0, {0xc000191000, 0x1000, 0x1000})
/usr/local/go/src/net/http/server.go:782 +0x23b
bufio.(*Reader).fill(0xc000ca4480)
/usr/local/go/src/bufio/bufio.go:106 +0x2ab
bufio.(*Reader).Peek(0xc000ca4480, 0x4)
/usr/local/go/src/bufio/bufio.go:144 +0xd2
net/http.(*conn).serve(0xc0006662d0, {0x1c856e8, 0xc000e8cf30})
/usr/local/go/src/net/http/server.go:2030 +0xe28
created by net/http.(*Server).Serve
/usr/local/go/src/net/http/server.go:3089 +0x818

goroutine 139656 [IO wait, 3 minutes]:
internal/poll.runtime_pollWait(0x7f7ba59a4f38, 0x72)
/usr/local/go/src/runtime/netpoll.go:306 +0x89
internal/poll.(*pollDesc).wait(0xc0009e0618, 0xc000e1e000?, 0x0)
/usr/local/go/src/internal/poll/fd_poll_runtime.go:84 +0xbd
internal/poll.(*pollDesc).waitRead(...)
/usr/local/go/src/internal/poll/fd_poll_runtime.go:89
internal/poll.(*FD).Read(0xc0009e0600, {0xc000e1e000, 0x1000, 0x1000})
/usr/local/go/src/internal/poll/fd_unix.go:167 +0x405
net.(*netFD).Read(0xc0009e0600, {0xc000e1e000, 0x1000, 0x1000})
/usr/local/go/src/net/fd_posix.go:55 +0x51
net.(*conn).Read(0xc0006f0270, {0xc000e1e000, 0x1000, 0x1000})
/usr/local/go/src/net/net.go:183 +0xb1
net/http.(*connReader).Read(0xc000a498f0, {0xc000e1e000, 0x1000, 0x1000})
/usr/local/go/src/net/http/server.go:782 +0x23b
bufio.(*Reader).fill(0xc000bcb740)
/usr/local/go/src/bufio/bufio.go:106 +0x2ab
bufio.(*Reader).Peek(0xc000bcb740, 0x4)
/usr/local/go/src/bufio/bufio.go:144 +0xd2
net/http.(*conn).serve(0xc0006f86c0, {0x1c856e8, 0xc000e8cf30})
/usr/local/go/src/net/http/server.go:2030 +0xe28
created by net/http.(*Server).Serve
/usr/local/go/src/net/http/server.go:3089 +0x818

goroutine 138835 [select, 3 minutes]:
github.com/go-sql-driver/mysql.(*mysqlConn).startWatcher.func1()
/media/HDD/GoProjects/pkg/mod/github.com/go-sql-driver/[email protected]/connection.go:614 +0x113
created by github.com/go-sql-driver/mysql.(*mysqlConn).startWatcher
/media/HDD/GoProjects/pkg/mod/github.com/go-sql-driver/[email protected]/connection.go:611 +0x1c5

goroutine 139655 [IO wait, 3 minutes]:
internal/poll.runtime_pollWait(0x7f7ba59a5028, 0x72)
/usr/local/go/src/runtime/netpoll.go:306 +0x89
internal/poll.(*pollDesc).wait(0xc0009e0598, 0xc000e1a000?, 0x0)
/usr/local/go/src/internal/poll/fd_poll_runtime.go:84 +0xbd
internal/poll.(*pollDesc).waitRead(...)
/usr/local/go/src/internal/poll/fd_poll_runtime.go:89
internal/poll.(*FD).Read(0xc0009e0580, {0xc000e1a000, 0x1000, 0x1000})
/usr/local/go/src/internal/poll/fd_unix.go:167 +0x405
net.(*netFD).Read(0xc0009e0580, {0xc000e1a000, 0x1000, 0x1000})
/usr/local/go/src/net/fd_posix.go:55 +0x51
net.(*conn).Read(0xc0006f0268, {0xc000e1a000, 0x1000, 0x1000})
/usr/local/go/src/net/net.go:183 +0xb1
net/http.(*connReader).Read(0xc000a49800, {0xc000e1a000, 0x1000, 0x1000})
/usr/local/go/src/net/http/server.go:782 +0x23b
bufio.(*Reader).fill(0xc000bcb6e0)
/usr/local/go/src/bufio/bufio.go:106 +0x2ab
bufio.(*Reader).Peek(0xc000bcb6e0, 0x4)
/usr/local/go/src/bufio/bufio.go:144 +0xd2
net/http.(*conn).serve(0xc0006f8630, {0x1c856e8, 0xc000e8cf30})
/usr/local/go/src/net/http/server.go:2030 +0xe28
created by net/http.(*Server).Serve
/usr/local/go/src/net/http/server.go:3089 +0x818

goroutine 139678 [IO wait, 3 minutes]:
internal/poll.runtime_pollWait(0x7f7ba59a4c68, 0x72)
/usr/local/go/src/runtime/netpoll.go:306 +0x89
internal/poll.(*pollDesc).wait(0xc000143a98, 0xc0009a4000?, 0x0)
/usr/local/go/src/internal/poll/fd_poll_runtime.go:84 +0xbd
internal/poll.(*pollDesc).waitRead(...)
/usr/local/go/src/internal/poll/fd_poll_runtime.go:89
internal/poll.(*FD).Read(0xc000143a80, {0xc0009a4000, 0x1000, 0x1000})
/usr/local/go/src/internal/poll/fd_unix.go:167 +0x405
net.(*netFD).Read(0xc000143a80, {0xc0009a4000, 0x1000, 0x1000})
/usr/local/go/src/net/fd_posix.go:55 +0x51
net.(*conn).Read(0xc000c5e8d0, {0xc0009a4000, 0x1000, 0x1000})
/usr/local/go/src/net/net.go:183 +0xb1
net/http.(*connReader).Read(0xc000412e10, {0xc0009a4000, 0x1000, 0x1000})
/usr/local/go/src/net/http/server.go:782 +0x23b
bufio.(*Reader).fill(0xc00161a600)
/usr/local/go/src/bufio/bufio.go:106 +0x2ab
bufio.(*Reader).Peek(0xc00161a600, 0x4)
/usr/local/go/src/bufio/bufio.go:144 +0xd2
net/http.(*conn).serve(0xc00061f560, {0x1c856e8, 0xc000e8cf30})
/usr/local/go/src/net/http/server.go:2030 +0xe28
created by net/http.(*Server).Serve
/usr/local/go/src/net/http/server.go:3089 +0x818

goroutine 153901 [IO wait]:
internal/poll.runtime_pollWait(0x7f7ba59a43f8, 0x72)
/usr/local/go/src/runtime/netpoll.go:306 +0x89
internal/poll.(*pollDesc).wait(0xc00086c718, 0xc000896d31?, 0x0)
/usr/local/go/src/internal/poll/fd_poll_runtime.go:84 +0xbd
internal/poll.(*pollDesc).waitRead(...)
/usr/local/go/src/internal/poll/fd_poll_runtime.go:89
internal/poll.(*FD).Read(0xc00086c700, {0xc000896d31, 0x1, 0x1})
/usr/local/go/src/internal/poll/fd_unix.go:167 +0x405
net.(*netFD).Read(0xc00086c700, {0xc000896d31, 0x1, 0x1})
/usr/local/go/src/net/fd_posix.go:55 +0x51
net.(*conn).Read(0xc000c5e200, {0xc000896d31, 0x1, 0x1})
/usr/local/go/src/net/net.go:183 +0xb1
net/http.(*connReader).backgroundRead(0xc000896d20)
/usr/local/go/src/net/http/server.go:674 +0x79
created by net/http.(*connReader).startBackgroundRead
/usr/local/go/src/net/http/server.go:670 +0x1a7

goroutine 153900 [runnable]:
golang.org/x/crypto/blowfish.encryptBlock(0x24855224, 0x8e0c6ce8, 0xc000e6f300)
/media/HDD/GoProjects/pkg/mod/golang.org/x/[email protected]/blowfish/block.go:115 +0x103f
golang.org/x/crypto/blowfish.ExpandKey({0xc000d9e2d0, 0x10, 0x90?}, 0xc000e6f300)
/media/HDD/GoProjects/pkg/mod/golang.org/x/[email protected]/blowfish/block.go:62 +0x349
golang.org/x/crypto/bcrypt.expensiveBlowfishSetup({0xc00133e050, 0x48, 0x230b5e0?}, 0xc, {0xc000d9e2a0, 0x16, 0x18})
/media/HDD/GoProjects/pkg/mod/golang.org/x/[email protected]/bcrypt/bcrypt.go:237 +0x1f3
golang.org/x/crypto/bcrypt.bcrypt({0xc00133e050, 0x48, 0x50}, 0xc, {0xc000d9e2a0, 0x16, 0x18})
/media/HDD/GoProjects/pkg/mod/golang.org/x/[email protected]/bcrypt/bcrypt.go:200 +0x128
golang.org/x/crypto/bcrypt.CompareHashAndPassword({0xc001a281c0, 0x3c, 0x40}, {0xc00133e050, 0x48, 0x50})
/media/HDD/GoProjects/pkg/mod/golang.org/x/[email protected]/bcrypt/bcrypt.go:114 +0xfe
github.com/uadmin/uadmin.verifyPassword({0xc001a28140, 0x3c}, {0xc0015d0c0b, 0x5})
/media/HDD/GoProjects/pkg/mod/github.com/uadmin/[email protected]/auth.go:787 +0xf6
github.com/uadmin/uadmin.(*User).Login(0xc001a50500, {0xc0015d0c0b, 0x5}, {0x0, 0x0})
/media/HDD/GoProjects/pkg/mod/github.com/uadmin/[email protected]/user.go:79 +0x9d
github.com/karazapp/back-end/models/KarazCareModel.Login({0xc0015d0bf1, 0xf}, {0xc0015d0c0b, 0x5})
/media/HDD/Karaz/back-end/models/KarazCareModel/member.go:53 +0x16a
github.com/karazapp/back-end/api/KarazCareApi.Login({0x1c84490, 0xc0016b0200}, 0x1c78990?)
/media/HDD/Karaz/back-end/api/KarazCareApi/login.go:39 +0x2b5
github.com/karazapp/back-end/routes/KarazCareHandler.KarazCareHandler({0x1c84490, 0xc0016b0200}, 0xc001a50400)
/media/HDD/Karaz/back-end/routes/KarazCareHandler/karazCareHandler.go:16 +0x126
github.com/karazapp/back-end/routes.MiddlewareAuth({0x1c84490, 0xc0016b0200}, 0xc0017f0800)
/media/HDD/Karaz/back-end/routes/MiddlewareAuth.go:168 +0x2034
net/http.HandlerFunc.ServeHTTP(0x1857538, {0x1c84490, 0xc0016b0200}, 0xb?)
/usr/local/go/src/net/http/server.go:2122 +0x4e
github.com/getsentry/sentry-go/http.(*Handler).handle.func1({0x1c84490, 0xc0016b0200}, 0xc0017f0700)
/media/HDD/GoProjects/pkg/mod/github.com/getsentry/[email protected]/http/sentryhttp.go:103 +0x52f
github.com/uadmin/uadmin.Handler.func1({0x1c84a60?, 0xc000eb80e0}, 0xc001a63e00)
/media/HDD/GoProjects/pkg/mod/github.com/uadmin/[email protected]/handler.go:107 +0x1258
net/http.HandlerFunc.ServeHTTP(0xc000a2ffe0, {0x1c84a60, 0xc000eb80e0}, 0x0?)
/usr/local/go/src/net/http/server.go:2122 +0x4e
net/http.(*ServeMux).ServeHTTP(0x0?, {0x1c84a60, 0xc000eb80e0}, 0xc001a63e00)
/usr/local/go/src/net/http/server.go:2500 +0xc6
net/http.serverHandler.ServeHTTP({0x1c82240?}, {0x1c84a60, 0xc000eb80e0}, 0xc001a63e00)
/usr/local/go/src/net/http/server.go:2936 +0x683
net/http.(*conn).serve(0xc0006f8480, {0x1c856e8, 0xc000e8cf30})
/usr/local/go/src/net/http/server.go:1995 +0xbd5
created by net/http.(*Server).Serve
/usr/local/go/src/net/http/server.go:3089 +0x818

goroutine 150517 [IO wait, 1 minutes]:
internal/poll.runtime_pollWait(0x7f7b6d524188, 0x72)
/usr/local/go/src/runtime/netpoll.go:306 +0x89
internal/poll.(*pollDesc).wait(0xc000ddc398, 0xc000896e81?, 0x0)
/usr/local/go/src/internal/poll/fd_poll_runtime.go:84 +0xbd
internal/poll.(*pollDesc).waitRead(...)
/usr/local/go/src/internal/poll/fd_poll_runtime.go:89
internal/poll.(*FD).Read(0xc000ddc380, {0xc000896e81, 0x1, 0x1})
/usr/local/go/src/internal/poll/fd_unix.go:167 +0x405
net.(*netFD).Read(0xc000ddc380, {0xc000896e81, 0x1, 0x1})
/usr/local/go/src/net/fd_posix.go:55 +0x51
net.(*conn).Read(0xc000c5f6d0, {0xc000896e81, 0x1, 0x1})
/usr/local/go/src/net/net.go:183 +0xb1
net/http.(*connReader).backgroundRead(0xc000896e70)
/usr/local/go/src/net/http/server.go:674 +0x79
created by net/http.(*connReader).startBackgroundRead
/usr/local/go/src/net/http/server.go:670 +0x1a7

…It is used to keep active sessions in memory. However, it loadSession function in session.go was creating race condition. So, I added a Read and Write Mutex Lock and protected its read and write access (can have multiple reads).
@TwistedHardware
Copy link
Copy Markdown
Collaborator

LGTM

@TwistedHardware TwistedHardware merged commit 63ed75f into uadmin:master Oct 30, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants