cache stack repr computation

This commit is contained in:
vyzo 2021-06-29 16:50:54 +03:00
parent 57e25ae1cd
commit 7307eb54dc

View File

@ -27,7 +27,7 @@ type debugLog struct {
readMx, writeMx, moveMx, stackMx sync.Mutex readMx, writeMx, moveMx, stackMx sync.Mutex
readLog, writeLog, moveLog, stackLog *os.File readLog, writeLog, moveLog, stackLog *os.File
readCnt, writeCnt, moveCnt, stackCnt int readCnt, writeCnt, moveCnt, stackCnt int
stackMap map[string]struct{} stackMap map[string]string
} }
func openDebugLog(path string) (*debugLog, error) { func openDebugLog(path string) (*debugLog, error) {
@ -76,7 +76,7 @@ func openDebugLog(path string) (*debugLog, error) {
writeLog: writeFile, writeLog: writeFile,
moveLog: moveFile, moveLog: moveFile,
stackLog: stackFile, stackLog: stackFile,
stackMap: make(map[string]struct{}), stackMap: make(map[string]string),
}, nil }, nil
} }
@ -320,20 +320,19 @@ func (d *debugLog) getStack() string {
sk := d.getNormalizedStackTrace() sk := d.getNormalizedStackTrace()
hash := sha256.Sum256([]byte(sk)) hash := sha256.Sum256([]byte(sk))
key := string(hash[:]) key := string(hash[:])
repr := hex.EncodeToString(hash[:])
d.stackMx.Lock() d.stackMx.Lock()
_, ok := d.stackMap[key] repr, ok := d.stackMap[key]
if !ok { if !ok {
repr = hex.EncodeToString(hash[:])
d.stackMap[key] = repr
d.stackCnt++
_, err := fmt.Fprintf(d.stackLog, "%s\n%s\n", repr, sk) _, err := fmt.Fprintf(d.stackLog, "%s\n%s\n", repr, sk)
if err != nil { if err != nil {
log.Warnf("error writing stack trace: %s", err) log.Warnf("error writing stack trace for %s: %s", repr, err)
} }
} }
d.stackMap[key] = struct{}{}
d.stackCnt++
d.stackMx.Unlock() d.stackMx.Unlock()
return repr return repr