Skip to content

Commit

Permalink
[chore] simplify generating log entry caller information (#863)
Browse files Browse the repository at this point in the history
* vastly simplify logging caller information

Signed-off-by: kim <grufwub@gmail.com>

* fix failing test due to multiple calls to processor.Start()

Signed-off-by: kim <grufwub@gmail.com>

Signed-off-by: kim <grufwub@gmail.com>
  • Loading branch information
NyaaaWhatsUpDoc committed Sep 29, 2022
1 parent a156188 commit 2f22780
Show file tree
Hide file tree
Showing 3 changed files with 22 additions and 115 deletions.
9 changes: 0 additions & 9 deletions internal/api/s2s/user/inboxpost_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -292,15 +292,6 @@ func (suite *InboxPostTestSuite) TestPostUpdate() {
federator := testrig.NewTestFederator(suite.db, tc, suite.storage, suite.mediaManager, fedWorker)
emailSender := testrig.NewEmailSender("../../../../web/template/", nil)
processor := testrig.NewTestProcessor(suite.db, suite.storage, federator, emailSender, suite.mediaManager, clientWorker, fedWorker)
if err := processor.Start(); err != nil {
panic(err)
}
defer func() {
if err := processor.Stop(); err != nil {
panic(err)
}
}()

userModule := user.New(processor).(*user.Module)
suite.NoError(processor.Start())

Expand Down
74 changes: 22 additions & 52 deletions internal/log/caller.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,69 +21,39 @@ package log
import (
"runtime"
"strings"
"sync"
)

var (
// fnCache is a cache of PCs to their calculated function names.
fnCache = map[uintptr]string{}

// strCache is a cache of strings to the originally allocated version
// of that string contents. so we don't have hundreds of the same instances
// of string floating around in memory.
strCache = map[string]string{}

// cacheMu protects fnCache and strCache.
cacheMu sync.Mutex
)

// Caller fetches the calling function name, skipping 'depth'. Results are cached per PC.
func Caller(depth int) string {
var rpc [1]uintptr

// Fetch pcs of callers
n := runtime.Callers(depth, rpc[:])
var pcs [1]uintptr

if n > 0 {
// Look for value in cache
cacheMu.Lock()
fn, ok := fnCache[rpc[0]]
cacheMu.Unlock()
// Fetch calling function using calldepth
_ = runtime.Callers(depth, pcs[:])
fn := runtime.FuncForPC(pcs[0])

if ok {
return fn
}

// Fetch frame info for caller pc
frame, _ := runtime.CallersFrames(rpc[:]).Next()
if fn == nil {
return ""
}

if frame.PC != 0 {
name := frame.Function
// return formatted name
return callername(fn)
}

// Drop all but the package name and function name, no mod path
if idx := strings.LastIndex(name, "/"); idx >= 0 {
name = name[idx+1:]
}
// callername generates a human-readable calling function name.
func callername(fn *runtime.Func) string {
name := fn.Name()

// Drop any generic type parameter markers
if idx := strings.Index(name, "[...]"); idx >= 0 {
name = name[:idx] + name[idx+5:]
}
// Drop all but the package name and function name, no mod path
if idx := strings.LastIndex(name, "/"); idx >= 0 {
name = name[idx+1:]
}

// Cache this func name
cacheMu.Lock()
fn, ok := strCache[name]
if !ok {
// Cache ptr to this allocated str
strCache[name] = name
fn = name
}
fnCache[rpc[0]] = fn
cacheMu.Unlock()
const params = `[...]`

return fn
}
// Drop any generic type parameter markers
if idx := strings.Index(name, params); idx >= 0 {
name = name[:idx] + name[idx+len(params):]
}

return "???"
return name
}
54 changes: 0 additions & 54 deletions internal/log/caller_test.go

This file was deleted.

0 comments on commit 2f22780

Please sign in to comment.