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  }