github.com/lianghucheng/zrddz@v0.0.0-20200923083010-c71f680932e2/src/gopkg.in/mgo.v2/txn/chaos.go (about)

     1  package txn
     2  
     3  import (
     4  	mrand "math/rand"
     5  	"time"
     6  )
     7  
     8  var chaosEnabled = false
     9  var chaosSetting Chaos
    10  
    11  // Chaos holds parameters for the failure injection mechanism.
    12  type Chaos struct {
    13  	// KillChance is the 0.0 to 1.0 chance that a given checkpoint
    14  	// within the algorithm will raise an interruption that will
    15  	// stop the procedure.
    16  	KillChance float64
    17  
    18  	// SlowdownChance is the 0.0 to 1.0 chance that a given checkpoint
    19  	// within the algorithm will be delayed by Slowdown before
    20  	// continuing.
    21  	SlowdownChance float64
    22  	Slowdown       time.Duration
    23  
    24  	// If Breakpoint is set, the above settings will only affect the
    25  	// named breakpoint.
    26  	Breakpoint string
    27  }
    28  
    29  // SetChaos sets the failure injection parameters to c.
    30  func SetChaos(c Chaos) {
    31  	chaosSetting = c
    32  	chaosEnabled = c.KillChance > 0 || c.SlowdownChance > 0
    33  }
    34  
    35  func chaos(bpname string) {
    36  	if !chaosEnabled {
    37  		return
    38  	}
    39  	switch chaosSetting.Breakpoint {
    40  	case "", bpname:
    41  		kc := chaosSetting.KillChance
    42  		if kc > 0 && mrand.Intn(1000) < int(kc*1000) {
    43  			panic(chaosError{})
    44  		}
    45  		if bpname == "insert" {
    46  			return
    47  		}
    48  		sc := chaosSetting.SlowdownChance
    49  		if sc > 0 && mrand.Intn(1000) < int(sc*1000) {
    50  			time.Sleep(chaosSetting.Slowdown)
    51  		}
    52  	}
    53  }
    54  
    55  type chaosError struct{}
    56  
    57  func (f *flusher) handleChaos(err *error) {
    58  	v := recover()
    59  	if v == nil {
    60  		return
    61  	}
    62  	if _, ok := v.(chaosError); ok {
    63  		f.debugf("Killed by chaos!")
    64  		*err = ErrChaos
    65  		return
    66  	}
    67  	panic(v)
    68  }