gtsocial-umbx

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README | LICENSE

commit 2f22780800915b5d5262aea1754ecce44f752db7
parent a156188b3eb5cb3da44aa1b7452265f5fa38a607
Author: kim <89579420+NyaaaWhatsUpDoc@users.noreply.github.com>
Date:   Thu, 29 Sep 2022 11:02:12 +0100

[chore] simplify generating log entry caller information (#863)

* 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>
Diffstat:
Minternal/api/s2s/user/inboxpost_test.go | 9---------
Minternal/log/caller.go | 74++++++++++++++++++++++----------------------------------------------------
Dinternal/log/caller_test.go | 54------------------------------------------------------
3 files changed, 22 insertions(+), 115 deletions(-)

diff --git a/internal/api/s2s/user/inboxpost_test.go b/internal/api/s2s/user/inboxpost_test.go @@ -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()) diff --git a/internal/log/caller.go b/internal/log/caller.go @@ -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 } diff --git a/internal/log/caller_test.go b/internal/log/caller_test.go @@ -1,54 +0,0 @@ -package log_test - -import ( - "runtime" - "strings" - "testing" - - "codeberg.org/gruf/go-atomics" - "github.com/superseriousbusiness/gotosocial/internal/log" -) - -// noopt exists to prevent certain optimisations during benching. -var noopt = atomics.NewString() - -func BenchmarkCaller(b *testing.B) { - b.RunParallel(func(pb *testing.PB) { - for pb.Next() { - name := log.Caller(2) - noopt.Store(name) - } - }) -} - -func BenchmarkCallerNoCache(b *testing.B) { - b.RunParallel(func(pb *testing.PB) { - for pb.Next() { - var rpc [1]uintptr - - // Fetch pcs of callers - n := runtime.Callers(2, rpc[:]) - - if n > 0 { - // Fetch frame info for caller pc - frame, _ := runtime.CallersFrames(rpc[:]).Next() - - if frame.PC != 0 { - name := frame.Function - - // Drop all but the package name and function name, no mod path - if idx := strings.LastIndex(name, "/"); idx >= 0 { - name = name[idx+1:] - } - - // Drop any generic type parameter markers - if idx := strings.Index(name, "[...]"); idx >= 0 { - name = name[:idx] + name[idx+5:] - } - - noopt.Store(name) - } - } - } - }) -}