gtoken icon indicating copy to clipboard operation
gtoken copied to clipboard

fatal error: concurrent map writes

Open Jetereting opened this issue 2 years ago • 1 comments

fatal error: concurrent map writes

https://github.com/goflyfox/gtoken/blob/master/gtoken/gtoken.go

// getToken 通过userKey获取Token
func (m *GfToken) getToken(ctx context.Context, userKey string) Resp {
	cacheKey := m.CacheKey + userKey

	userCacheResp := m.getCache(ctx, cacheKey)
	if !userCacheResp.Success() {
		return userCacheResp
	}
	userCache := gconv.Map(userCacheResp.Data)

	nowTime := gtime.Now().TimestampMilli()
	refreshTime := userCache[KeyRefreshTime]

	// 需要进行缓存超时时间刷新
	if gconv.Int64(refreshTime) == 0 || nowTime > gconv.Int64(refreshTime) {
		userCache[KeyCreateTime] = gtime.Now().TimestampMilli()
		userCache[KeyRefreshTime] = gtime.Now().TimestampMilli() + gconv.Int64(m.MaxRefresh)
		return m.setCache(ctx, cacheKey, userCache)
	}

	return Succ(userCache)
}

请问这里的 userCache 是 map 不会引起并发写的问题吗?

Jetereting avatar Aug 02 '22 06:08 Jetereting

线上出现的日志:

fatal error: concurrent map writes

goroutine 238943 [running]:
runtime.throw({0xd05f03, 0x10})
/usr/local/go/src/runtime/panic.go:1198 +0x71 fp=0xc001959080 sp=0xc001959050 pc=0x435431
runtime.mapassign_faststr(0xbfad40, 0xc001b07260, {0xcf6412, 0xa})
/usr/local/go/src/runtime/map_faststr.go:294 +0x38b fp=0xc0019590e8 sp=0xc001959080 pc=0x412e6b
github.com/goflyfox/gtoken/gtoken.(*GfToken).getToken(0x173fac0, {0xc001c78230, 0x7})
..../gfast/vendor/github.com/goflyfox/gtoken/gtoken/gtoken.go:485 +0x2f8 fp=0xc0019592a0 sp=0xc0019590e8 pc=0xa714f8
github.com/goflyfox/gtoken/gtoken.(*GfToken).validToken(0xbc5ca0, {0xc000014147, 0x24})
..../gfast/vendor/github.com/goflyfox/gtoken/gtoken/gtoken.go:457 +0x1b9 fp=0xc0019594f8 sp=0xc0019592a0 pc=0xa70cd9
github.com/goflyfox/gtoken/gtoken.(*GfToken).authMiddleware(0x173fac0, 0xc000848000)
..../gfast/vendor/github.com/goflyfox/gtoken/gtoken/gtoken.go:328 +0x15e fp=0xc001959600 sp=0xc0019594f8 pc=0xa6f87e
github.com/goflyfox/gtoken/gtoken.(*GfToken).authMiddleware-fm(0x15)
..../gfast/vendor/github.com/goflyfox/gtoken/gtoken/gtoken.go:310 +0x2c fp=0xc001959620 sp=0xc001959600 pc=0xa7570c
github.com/gogf/gf/net/ghttp.(*middleware).Next.func1.1()
..../gfast/vendor/github.com/gogf/gf/net/ghttp/ghttp_request_middleware.go:54 +0x25 fp=0xc001959638 sp=0xc001959620 pc=0x90adc5
github.com/gogf/gf/net/ghttp.niceCallFunc(0xc000d50b10)
..../gfast/vendor/github.com/gogf/gf/net/ghttp/ghttp_func.go:52 +0x3e fp=0xc001959658 sp=0xc001959638 pc=0x908e1e
github.com/gogf/gf/net/ghttp.(*middleware).Next.func1()
..../gfast/vendor/github.com/gogf/gf/net/ghttp/ghttp_request_middleware.go:53 +0xa5 fp=0xc001959730 sp=0xc001959658 pc=0x90a9e5
github.com/gogf/gf/util/gutil.TryCatch(0x0, {0xc000a117a0, 0x0, 0xc0009e4390})
..../gfast/vendor/github.com/gogf/gf/util/gutil/gutil.go:46 +0x6c fp=0xc001959770 sp=0xc001959730 pc=0x5b072c
github.com/gogf/gf/net/ghttp.(*middleware).Next(0xc00025e1c0)
..../gfast/vendor/github.com/gogf/gf/net/ghttp/ghttp_request_middleware.go:48 +0x152 fp=0xc0019597f0 sp=0xc001959770 pc=0x90a712
gfast/middleware.CORS(0xc000848000)
..../gfast/middleware/cors.go:14 +0x33 fp=0xc001959808 sp=0xc0019597f0 pc=0xb3f093
github.com/gogf/gf/net/ghttp.(*middleware).Next.func1.5()
..../gfast/vendor/github.com/gogf/gf/net/ghttp/ghttp_request_middleware.go:95 +0x2f fp=0xc001959820 sp=0xc001959808 pc=0x90ac2f
github.com/gogf/gf/net/ghttp.niceCallFunc(0x10000c000a11850)
..../gfast/vendor/github.com/gogf/gf/net/ghttp/ghttp_func.go:52 +0x3e fp=0xc001959840 sp=0xc001959820 pc=0x908e1e
github.com/gogf/gf/net/ghttp.(*middleware).Next.func1()
..../gfast/vendor/github.com/gogf/gf/net/ghttp/ghttp_request_middleware.go:94 +0x288 fp=0xc001959918 sp=0xc00195 9840 pc=0x90abc8
github.com/gogf/gf/util/gutil.TryCatch(0xcffc4b, {0xc000a11988, 0xbc5ca0, 0xc001eefd40})
..../gfast/vendor/github.com/gogf/gf/util/gutil/gutil.go:46 +0x6c fp=0xc001959958 sp=0xc001959918 pc=0x5b072c
github.com/gogf/gf/net/ghttp.(*middleware).Next(0xc00025e1c0)
..../gfast/vendor/github.com/gogf/gf/net/ghttp/ghttp_request_middleware.go:48 +0x152 fp=0xc0019599d8 sp=0xc001959958 pc=0x90a712
github.com/gogf/gf/net/ghttp.(*Server).ServeHTTP(0xc0006d3680, {0xec23b0, 0xc000420000}, 0xc000dd6100)
..../gfast/vendor/github.com/gogf/gf/net/ghttp/ghttp_server_handler.go:134 +0x48c fp=0xc001959ac0 sp=0xc0019599d8 pc=0x923cec
net/http.serverHandler.ServeHTTP({0xc000d50a50}, {0xec23b0, 0xc000420000}, 0xc000dd6100)
/usr/local/go/src/net/http/server.go:2878 +0x43b fp=0xc001959b80 sp=0xc001959ac0 pc=0x76bd9b
net/http.(*conn).serve(0xc000a18140, {0xeca7d0, 0xc000481b60})
/usr/local/go/src/net/http/server.go:1929 +0xb08 fp=0xc001959fb8 sp=0xc001959b80 pc=0x767908
net/http.(*Server).Serve·dwrap·87()
/usr/local/go/src/net/http/server.go:3033 +0x2e fp=0xc001959fe0 sp=0xc001959fb8 pc=0x76c6ee
runtime.goexit()
/usr/local/go/src/runtime/asm_amd64.s:1581 +0x1 fp=0xc001959fe8 sp=0xc001959fe0 pc=0x468561
created by net/http.(*Server).Serve
/usr/local/go/src/net/http/server.go:3033 +0x4e8

goroutine 1 [chan receive, 316 minutes]:
github.com/gogf/gf/net/ghttp.(*Server).Run(0xc0006d3680)
..../gfast/vendor/github.com/gogf/gf/net/ghttp/ghttp_server.go:319 +0x88
main.main()
..../gfast/main.go:17 +0x12f

goroutine 6 [chan send, 25 minutes]:
github.com/gogf/gf/util/grand.asyncProducingRandomBufferBytesLoop()
..../gfast/vendor/github.com/gogf/gf/util/grand/grand_buffer.go:45 +0xc5
created by github.com/gogf/gf/util/grand.init.0
..../gfast/vendor/github.com/gogf/gf/util/grand/grand_buffer.go:25 +0x25

goroutine 17 [chan receive]:
github.com/gogf/gf/os/gtimer.(*Timer).loop.func1()
..../gfast/vendor/github.com/gogf/gf/os/gtimer/gtimer_timer_loop.go:21 +0x7a
created by github.com/gogf/gf/os/gtimer.(*Timer).loop
..../gfast/vendor/github.com/gogf/gf/os/gtimer/gtimer_timer_loop.go:13 +0x5b

goroutine 75 [chan receive]:
github.com/gogf/gf/container/gqueue.(*Queue).asyncLoopFromListToChannel(0xc0006dba70)
..../gfast/vendor/github.com/gogf/gf/container/gqueue/gqueue.go:70 +0x72
created by github.com/gogf/gf/container/gqueue.New
..../gfast/vendor/github.com/gogf/gf/container/gqueue/gqueue.go:56 +0x23d

goroutine 76 [syscall]:
syscall.Syscall6(0xe8, 0x7, 0xc0001d1bec, 0x7, 0xffffffffffffffff, 0x0, 0x0)
/usr/local/go/src/syscall/asm_linux_amd64.s:43 +0x5
golang.org/x/sys/unix.EpollWait(0x2, {0xc0001d1bec, 0xc0002e21c0, 0x4638fb}, 0xc0001d1cb4)
..../gfast/vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go:56 +0x58
github.com/fsnotify/fsnotify.(*fdPoller).wait(0xc000248ce0)
..../gfast/vendor/github.com/fsnotify/fsnotify/inotify_poller.go:86 +0x7d
github.com/fsnotify/fsnotify.(*Watcher).readEvents(0xc0002442d0)
..../gfast/vendor/github.com/fsnotify/fsnotify/inotify.go:192 +0x2b0
created by github.com/fsnotify/fsnotify.NewWatcher
..../gfast/vendor/github.com/fsnotify/fsnotify/inotify.go:59 +0x1c7

goroutine 77 [select]:
github.com/gogf/gf/os/gfsnotify.(*Watcher).watchLoop.func1()
..../gfast/vendor/github.com/gogf/gf/os/gfsnotify/gfsnotify_watcher_loop.go:19 +0xde
created by github.com/gogf/gf/os/gfsnotify.(*Watcher).watchLoop
..../gfast/vendor/github.com/gogf/gf/os/gfsnotify/gfsnotify_watcher_loop.go:17 +0x5b

goroutine 78 [chan receive]:
github.com/gogf/gf/container/gqueue.(*Queue).Pop(...)
..../gfast/vendor/github.com/gogf/gf/container/gqueue/gqueue.go:111
github.com/gogf/gf/os/gfsnotify.(*Watcher).eventLoop.func1()
..../gfast/vendor/github.com/gogf/gf/os/gfsnotify/gfsnotify_watcher_loop.go:48 +0x54
created by github.com/gogf/gf/os/gfsnotify.(*Watcher).eventLoop
..../gfast/vendor/github.com/gogf/gf/os/gfsnotify/gfsnotify_watcher_loop.go:46 +0x5b

goroutine 81 [select, 316 minutes]:
database/sql.(*DB).connectionOpener(0xc00049e8f0, {0xeca728, 0xc000644040})
/usr/local/go/src/database/sql/sql.go:1196 +0x93
created by database/sql.OpenDB
/usr/local/go/src/database/sql/sql.go:794 +0x188

goroutine 98 [syscall, 316 minutes]:
os/signal.signal_recv()
/usr/local/go/src/runtime/sigqueue.go:169 +0x98
os/signal.loop()
/usr/local/go/src/os/signal/signal_unix.go:24 +0x19
created by os/signal.Notify.func1.1
/usr/local/go/src/os/signal/signal.go:151 +0x2c

goroutine 63 [chan receive, 316 minutes]:
github.com/gogf/gf/net/ghttp.handleProcessSignal()
..../gfast/vendor/github.com/gogf/gf/net/ghttp/ghttp_server_admin_unix.go:36 +0x12e
created by github.com/gogf/gf/net/ghttp.serverProcessInit
..../gfast/vendor/github.com/gogf/gf/net/ghttp/ghttp_server.go:70 +0xde

goroutine 64 [IO wait]:
internal/poll.runtime_pollWait(0x7f6e4929c530, 0x72)
/usr/local/go/src/runtime/netpoll.go:234 +0x89
internal/poll.(*pollDesc).wait(0xc000638200, 0xc000035000, 0x0)
/usr/local/go/src/internal/poll/fd_poll_runtime.go:84 +0x32
internal/poll.(*pollDesc).waitRead(...)
/usr/local/go/src/internal/poll/fd_poll_runtime.go:89
internal/poll.(*FD).Accept(0xc000638200)
/usr/local/go/src/internal/poll/fd_unix.go:402 +0x22c
net.(*netFD).accept(0xc000638200)
/usr/local/go/src/net/fd_unix.go:173 +0x35
net.(*TCPListener).accept(0xc00063c330)
/usr/local/go/src/net/tcpsock_posix.go:140 +0x28
net.(*TCPListener).Accept(0xc00063c330)
/usr/local/go/src/net/tcpsock.go:262 +0x3d
net/http.(*Server).Serve(0xc0004202a0, {0xec21a0, 0xc00063c330})
/usr/local/go/src/net/http/server.go:3001 +0x394
github.com/gogf/gf/net/ghttp.(*gracefulServer).doServe(0xc000be65a0)
..../gfast/vendor/github.com/gogf/gf/net/ghttp/ghttp_server_graceful.go:158 +0x189
github.com/gogf/gf/net/ghttp.(*gracefulServer).ListenAndServe(0xc000be65a0)
..../gfast/vendor/github.com/gogf/gf/net/ghttp/ghttp_server_graceful.go:77 +0x6f
github.com/gogf/gf/net/ghttp.(*Server).startServer.func1(0x0)
..../gfast/vendor/github.com/gogf/gf/net/ghttp/ghttp_server.go:433 +0x85
created by github.com/gogf/gf/net/ghttp.(*Server).startServer
..../gfast/vendor/github.com/gogf/gf/net/ghttp/ghttp_server.go:427 +0x28c

goroutine 238951 [IO wait]:
internal/poll.runtime_pollWait(0x7f6e4929b968, 0x72)
/usr/local/go/src/runtime/netpoll.go:234 +0x89
internal/poll.(*pollDesc).wait(0xc000f54580, 0xc000d509a1, 0x0)
/usr/local/go/src/internal/poll/fd_poll_runtime.go:84 +0x32
internal/poll.(*pollDesc).waitRead(...)
/usr/local/go/src/internal/poll/fd_poll_runtime.go:89
internal/poll.(*FD).Read(0xc000f54580, {0xc000d509a1, 0x1, 0x1})
/usr/local/go/src/internal/poll/fd_unix.go:167 +0x25a
net.(*netFD).Read(0xc000f54580, {0xc000d509a1, 0x7992162c40e155, 0xc0007b1728})
/usr/local/go/src/net/fd_posix.go:56 +0x29
net.(*conn).Read(0xc0019c0048, {0xc000d509a1, 0x85acf5, 0xc000487a00})
/usr/local/go/src/net/net.go:183 +0x45
net/http.(*connReader).backgroundRead(0xc000d50990)
/usr/local/go/src/net/http/server.go:672 +0x3f
created by net/http.(*connReader).startBackgroundRead
/usr/local/go/src/net/http/server.go:668 +0xcf

goroutine 238942 [runnable]:
internal/reflectlite.typedmemmove(0xc432c0, 0xc001f521c0, 0xc0004ba200)
/usr/local/go/src/runtime/mbarrier.go:191 +0x38
internal/reflectlite.Swapper.func9(0xc000a56c98, 0x2)
/usr/local/go/src/internal/reflectlite/swapper.go:73 +0x6f
sort.insertionSort_func({0xc000a56e58, 0xc0006da750}, 0x0, 0x5)
/usr/local/go/src/sort/zfuncversion.go:13 +0x70
sort.quickSort_func({0xc000a56e58, 0xc0006da750}, 0xc001ba0d08, 0x0, 0x4625b9)
/usr/local/go/src/sort/zfuncversion.go:158 +0x185
sort.Slice({0xbb73a0, 0xc001ba0d08}, 0x5)
/usr/local/go/src/sort/slice.go:20 +0x9f
encoding/json.mapEncoder.encode({0x0}, 0xc000638400, {0xbfad40, 0xc001b07260, 0xbfad40}, {0x68, 0x68})
/usr/local/go/src/encoding/json/encode.go:806 +0x485
encoding/json.(*encodeState).reflectValue(0xc000a56fc8, {0xbfad40, 0xc001b07260, 0x1}, {0x20, 0xd2})
/usr/local/go/src/encoding/json/encode.go:360 +0x78
encoding/json.(*encodeState).marshal(0xcccc20, {0xbfad40, 0xc001b07260}, {0xcd, 0x38})
/usr/local/go/src/encoding/json/encode.go:332 +0xfa
encoding/json.Marshal({0xbfad40, 0xc001b07260})
/usr/local/go/src/encoding/json/encode.go:161 +0x45
github.com/gogf/gf/internal/json.Marshal(...)
..../gfast/vendor/github.com/gogf/gf/internal/json/json.go:21
github.com/gogf/gf/util/gconv.String({0xbfad40, 0xc001b07260})
..../gfast/vendor/github.com/gogf/gf/util/gconv/gconv.go:463 +0x6ee
github.com/goflyfox/gtoken/gtoken.(*GfToken).getToken(0x173fac0, {0xc001f4c150, 0x7})
..../gfast/vendor/github.com/goflyfox/gtoken/gtoken/gtoken.go:487 +0x465
github.com/goflyfox/gtoken/gtoken.(*GfToken).validToken(0xbc5ca0, {0xc001f46007, 0x16})
..../gfast/vendor/github.com/goflyfox/gtoken/gtoken/gtoken.go:457 +0x1b9
github.com/goflyfox/gtoken/gtoken.(*GfToken).authMiddleware(0x173fac0, 0xc0004ba000)
..../gfast/vendor/github.com/goflyfox/gtoken/gtoken/gtoken.go:328 +0x15e
github.com/gogf/gf/net/ghttp.(*middleware).Next.func1.1()
..../gfast/vendor/github.com/gogf/gf/net/ghttp/ghttp_request_middleware.go:54 +0x25
github.com/gogf/gf/net/ghttp.niceCallFunc(0xc0006da4b0)
..../gfast/vendor/github.com/gogf/gf/net/ghttp/ghttp_func.go:52 +0x3e
github.com/gogf/gf/net/ghttp.(*middleware).Next.func1()
..../gfast/vendor/github.com/gogf/gf/net/ghttp/ghttp_request_middleware.go:53 +0xa5
github.com/gogf/gf/util/gutil.TryCatch(0x0, {0xc000a0e7a0, 0x0, 0xc001f1e030})
..../gfast/vendor/github.com/gogf/gf/util/gutil/gutil.go:46 +0x6c
github.com/gogf/gf/net/ghttp.(*middleware).Next(0xc000caa060)
..../gfast/vendor/github.com/gogf/gf/net/ghttp/ghttp_request_middleware.go:48 +0x152
gfast/middleware.CORS(0xc0004ba000)
..../gfast/middleware/cors.go:14 +0x33
github.com/gogf/gf/net/ghttp.(*middleware).Next.func1.5()
..../gfast/vendor/github.com/gogf/gf/net/ghttp/ghttp_request_middleware.go:95 +0x2f
github.com/gogf/gf/net/ghttp.niceCallFunc(0xc000a0e850)
..../gfast/vendor/github.com/gogf/gf/net/ghttp/ghttp_func.go:52 +0x3e
github.com/gogf/gf/net/ghttp.(*middleware).Next.func1()
..../gfast/vendor/github.com/gogf/gf/net/ghttp/ghttp_request_middleware.go:94 +0x288
github.com/gogf/gf/util/gutil.TryCatch(0xcffc4b, {0xc000a0e988, 0xbc5ca0, 0xc000e70c40})
..../gfast/vendor/github.com/gogf/gf/util/gutil/gutil.go:46 +0x6c
github.com/gogf/gf/net/ghttp.(*middleware).Next(0xc000caa060)
..../gfast/vendor/github.com/gogf/gf/net/ghttp/ghttp_request_middleware.go:48 +0x152
github.com/gogf/gf/net/ghttp.(*Server).ServeHTTP(0xc0006d3680, {0xec23b0, 0xc00031e000}, 0xc000dd6000)
..../gfast/vendor/github.com/gogf/gf/net/ghttp/ghttp_server_handler.go:134 +0x48c
net/http.serverHandler.ServeHTTP({0xc000d50990}, {0xec23b0, 0xc00031e000}, 0xc000dd6000)
/usr/local/go/src/net/http/server.go:2878 +0x43b
net/http.(*conn).serve(0xc000a180a0, {0xeca7d0, 0xc000481b60})
/usr/local/go/src/net/http/server.go:1929 +0xb08
created by net/http.(*Server).Serve
/usr/local/go/src/net/http/server.go:3033 +0x4e8

goroutine 238944 [IO wait]:
internal/poll.runtime_pollWait(0x7f6e4929bb38, 0x72)
/usr/local/go/src/runtime/netpoll.go:234 +0x89
internal/poll.(*pollDesc).wait(0xc000f54600, 0xc000d50a61, 0x0)
/usr/local/go/src/internal/poll/fd_poll_runtime.go:84 +0x32
internal/poll.(*pollDesc).waitRead(...)
/usr/local/go/src/internal/poll/fd_poll_runtime.go:89
internal/poll.(*FD).Read(0xc000f54600, {0xc000d50a61, 0x1, 0x1})
/usr/local/go/src/internal/poll/fd_unix.go:167 +0x25a
net.(*netFD).Read(0xc000f54600, {0xc000d50a61, 0x799215d2dab39e, 0xc0002d9f28})
/usr/local/go/src/net/fd_posix.go:56 +0x29
net.(*conn).Read(0xc0019c0050, {0xc000d50a61, 0x85acf5, 0xc00025a0f0})
/usr/local/go/src/net/net.go:183 +0x45
net/http.(*connReader).backgroundRead(0xc000d50a50)
/usr/local/go/src/net/http/server.go:672 +0x3f
created by net/http.(*connReader).startBackgroundRead
/usr/local/go/src/net/http/server.go:668 +0xcf

Jetereting avatar Aug 02 '22 06:08 Jetereting