# [Know Issue] 开启 prepared plan cache, tidb-server 重启，报 concurrent map writes

## Key Words

tidb, concurrent map writes, 重启, tidb_stderr.log

## Description

tidb-server 频繁重启，tidb.log 中无异常日志，tidb_stderr.log 有 fatal error: concurrent map writes 的报错。  
报错栈如下：  

```log
fatal error: concurrent map writes.

goroutine 16752325358 [running]:
runtime.throw({0x3d1dd6f?, 0xc0493fd398?))
        /usr/local/go/src/runtime/panic.go:992 +0x71 fp=0xc032452af0 sp=0xc032452ac0 pc=0x1488591
runtime.mapassign_fast64(0x3cb4a007, 0xc291ef81507, 0x0)
        /usr/local/go/src/runtime/map_fast 64.go: 102 +0x2c5 fp=0xc032452b28 sp=0xc032452afo pc=0x1462ee5
github.com/pingcap/tidb/sessionctx/stmtctx.(*StatementContext).GetOrStoreStmtCache(...)
        /home/jenkins/agent/workspace/build-common/go/src/github.com/pingcap/tidb/sessionctx/stmtctx/stmtctx.go:302
github.com/pingcap/tidb/sessionctx/variable.glob..func9(0xc000641300)
        /home/jenkins/agent/workspace/build-common/go/src/github.com/pingcap/tidb/sessionctx/variable/sysvar.go:77 +0x113 fp=0xc032452b80 sp=0xc032452b28 pc=0x21ac653
github.com/pingcap/tidb/sessionctx/variable.(*SysVar).GetSessionFromHook(0x5d785a0, 0xc000641300)
        /home/jenkins/agent/workspace/build-common/go/src/github.com/pingcap/tidb/sessionctx/variable/variable.go:172 +0x44 fp=0xc032452bd0 sp=0xc032452b80 pc=0x21b9ac4
github.com/pingcap/tidb/sessionctx/variable.GetSessionOrGlobalSystemVar(0xc000641300,(0x3cf8096, 0x9))
        /home/jenkins/agent/workspace/build-common/go/src/github.com/pingcap/tidb/sessionctx/variable/varsutil.go:180 +0x1a8 fp=0xc032452c30 sp=0xc032452bd0 pc=0x21bd088
github.com/pingcap/tidb/expression.getStmtTimestamp((0x42ee4f8, 0xc069292240))
        /home/jenkins/agent/workspace/build-common/go/src/github.com/pingcap/tidb/expression/helper.go:168 +0x65 fp=0xc032452c80 sp=0xc032452c30 pc=0x2447bc5
github.com/pingcap/tidb/expression.evalNowWithFsp((0x42ee418, 0xc069292240), 0xc001c93b002)
        /home/jenkins/agent/workspace/build-common/go/src/github.com/pingcap/tidb/expression/builtin_time.go:2510 +0x2c fp=0xc032452ce0 sp=0xc032452c80 pc=0x23a810c
github.com/pingcap/tidb/expression.(*builtinNowWithoutArgSig).evalTime(0x02,(0x602, 0xc000680c00?))
        /home/jenkins/agent/workspace/build-common/go/src/github.com/pingcap/tidb/expression/builtin_time.go:2584 +0x26 fp=0xc032452d08 sp=0xc032452ce0 pc=0x23a84c6
github.com/pingcap/tidb/expression.(*ScalarFunction).EvalTime(...)
        /home/jenkins/agent/workspace/build-common/go/src/github.com/pingcap/tidb/expression/scalar_function.go:422
github.com/pingcap/tidb/expression.(*ScalarFunction).Eval(0xc0aac68280,(0x02, 0x145c007?))
        /home/jenkins/agent/workspace/build-common/go/src/github.com/pingcap/tidb/expression/scalar_function.go:366 +0x4df fp=0xc032452e30 sp=0xc032452d08 pc=0x2449ebf
github.com/pingcap/tidb/expression.(*Constant).getLazyDatum(0x2030002,(0x02, 0x2030002))
        /home/jenkins/agent/workspace/build-common/go/src/github.com/pingcap/tidb/expression/constant.go:189 +0xaf fp=0xc032452f38 sp=0xc032452e30 pc=0x241a38f
github.com/pingcap/tidb/expression.(*Constant).Eval(0xc0ec538b40,(0x0, 0x0?})
        /home/jenkins/agent/workspace/build-common/go/src/github.com/pingcap/tidb/expression/constant.go:197 +0x98 fp=0xc032453080 sp=0xc032452f38 pc=0x241a618
github.com/pingcap/tidb/expression.PbConverter.conorCorColToPBExpr(((0x4289320, 0xc06b2bc5a0), 0xc00064ffc0),(0x42ede30, 0xc0ec538b40))
        /home/jenkins/agent/workspace/build-common/go/src/github.com/pingcap/tidb/expression/expr_to_pb.go:79 +0xac fp=0xc0324532a0 sp=0xc032453080 pc=0x243918c
github.com/pingcap/tidb/expression.PbConverter.ExprToPB(((0x42893202, 0xc06b2bc5a0?), 0xc00064ffc0?),(0x42ede302, 0xc0ec538b40?))
```

## Root Cause

TiDB 开启 prepared plan cache，由于代码缺陷，对 stmtCache map[StmtCacheKey]interface{} 同时进行写入，导致 tidb-server 报 fatal error 重启。

## Diagnostic Steps

tidb-server 开启 prepared plan cache，对应参数为 show variables like 'tidb_enable_prepared_plan_cache';
tidb-server 频繁重启，tidb.log 无异常，tidb_stderr.log 有 fatal error: concurrent map writes 的报错，且与 Description 中截图调用栈一致。

## Resolution

升级到非受影响版本

## Workaround

关闭 prepared plan cache，方法 set global tidb_enable_prepared_plan_cache = 0;

## Affected Versions

- 5.3.x
- 5.4.0 ~ 5.4.2
- 6.0.x
- 6.1.0
- 6.2.x
- 6.3.x
