From ab5923572984651af05a47755109642bfc529cb5 Mon Sep 17 00:00:00 2001 From: Austin Clements Date: Thu, 25 Aug 2016 11:50:50 -0400 Subject: [PATCH] runtime: consistency check for G rescan position Issue #17099 shows a failure that indicates we rescanned a stack twice concurrently during mark termination, which suggests that the rescan list became inconsistent. Add a simple check when we dequeue something from the rescan list that it claims to be at the index where we found it. Change-Id: I6a267da4154a2e7b7d430cb4056e6bae978eaf62 Reviewed-on: https://go-review.googlesource.com/29280 Run-TryBot: Austin Clements TryBot-Result: Gobot Gobot Reviewed-by: Rick Hudson --- src/runtime/mgcmark.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/runtime/mgcmark.go b/src/runtime/mgcmark.go index a4f25ac48f..003073f42f 100644 --- a/src/runtime/mgcmark.go +++ b/src/runtime/mgcmark.go @@ -199,6 +199,11 @@ func markroot(gcw *gcWork, i uint32) { gp = allgs[i-baseStacks] } else if baseRescan <= i && i < end { gp = work.rescan.list[i-baseRescan].ptr() + if gp.gcRescan != int32(i-baseRescan) { + // Looking for issue #17099. + println("runtime: gp", gp, "found at rescan index", i-baseRescan, "but should be at", gp.gcRescan) + throw("bad g rescan index") + } } else { throw("markroot: bad index") } -- 2.48.1