From 435c055488df2bc2404cfd3e994c72ddebc60854 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=9B=BD=E5=BF=A0?= Date: Thu, 13 Oct 2022 20:08:56 +0800 Subject: [PATCH] log panic full stack in boltdb recover block (#7410) --- pkg/storage/stores/shipper/util/util.go | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/pkg/storage/stores/shipper/util/util.go b/pkg/storage/stores/shipper/util/util.go index 54e32f5d6c..6f26c8da26 100644 --- a/pkg/storage/stores/shipper/util/util.go +++ b/pkg/storage/stores/shipper/util/util.go @@ -2,6 +2,8 @@ package util import ( "fmt" + "os" + "runtime" "runtime/debug" "unsafe" @@ -11,6 +13,7 @@ import ( "github.com/grafana/loki/pkg/storage/stores/series/index" ) +const maxStackSize = 8 * 1024 const sep = "\xff" func BuildIndexFileName(tableName, uploader, dbName string) string { @@ -48,6 +51,7 @@ func safeOpenBoltDbFile(path string, ret chan *result) { defer func() { if r := recover(); r != nil { + logPanic(r) res.err = fmt.Errorf("recovered from panic opening boltdb file: %v", r) } @@ -85,3 +89,10 @@ func GetUnsafeBytes(s string) []byte { func GetUnsafeString(buf []byte) string { return *((*string)(unsafe.Pointer(&buf))) } + +func logPanic(p interface{}) { + stack := make([]byte, maxStackSize) + stack = stack[:runtime.Stack(stack, true)] + // keep a multiline stack + fmt.Fprintf(os.Stderr, "panic: %v\n%s", p, stack) +}