github.com/grafana/pyroscope@v1.18.0/pkg/metastore/discovery/kuberesolver/util.go (about) 1 package kuberesolver 2 3 import ( 4 "runtime/debug" 5 "time" 6 7 "google.golang.org/grpc/grpclog" 8 ) 9 10 func until(f func(), initialPeriod, maxPeriod time.Duration, stopCh <-chan struct{}) { 11 select { 12 case <-stopCh: 13 return 14 default: 15 } 16 period := initialPeriod 17 for { 18 func() { 19 defer handleCrash() 20 f() 21 }() 22 select { 23 case <-stopCh: 24 return 25 case <-time.After(period): 26 if period*2 <= maxPeriod { 27 period *= 2 28 } else { 29 period = initialPeriod 30 } 31 } 32 } 33 } 34 35 // HandleCrash simply catches a crash and logs an error. Meant to be called via defer. 36 func handleCrash() { 37 if r := recover(); r != nil { 38 callers := string(debug.Stack()) 39 grpclog.Errorf("kuberesolver: recovered from panic: %#v (%v)\n%v", r, r, callers) 40 } 41 }