graceful connection errors
retrying with exponential backoff
This commit is contained in:
		
							parent
							
								
									bb7ffbddfc
								
							
						
					
					
						commit
						21a41cccf5
					
				|  | @ -2,7 +2,6 @@ package pixelflut | |||
| 
 | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"log" | ||||
| 	"math/rand" | ||||
| 	"net" | ||||
| 	"sync" | ||||
|  | @ -74,30 +73,51 @@ func initPerfReporter() *Performance { | |||
| } | ||||
| 
 | ||||
| // bombAddress writes the given message via plain TCP to the given address,
 | ||||
| // as fast as possible, until stop is closed.
 | ||||
| // as fast as possible, until stop is closed. retries with exponential backoff on network errors.
 | ||||
| func bombAddress(message []byte, address string, maxOffsetX, maxOffsetY int, stop chan bool, wg *sync.WaitGroup) { | ||||
| 	wg.Add(1) | ||||
| 	defer wg.Done() | ||||
| 	conn, err := net.Dial("tcp", address) | ||||
| 	if err != nil { | ||||
| 		log.Fatal(err) | ||||
| 
 | ||||
| 	timeoutMin := 100 * time.Millisecond | ||||
| 	timeoutMax := 10 * time.Second | ||||
| 	timeout := 200 * time.Millisecond | ||||
| 
 | ||||
| 	for { | ||||
| 		conn, err := net.Dial("tcp", address) | ||||
| 		if err != nil { | ||||
| 			// this was a network error, retry!
 | ||||
| 			fmt.Printf("[net] error: %s. retrying in %s\n", err, timeout) | ||||
| 			time.Sleep(timeout) | ||||
| 			timeout *= 2 | ||||
| 			if timeout > timeoutMax { | ||||
| 				timeout = timeoutMax | ||||
| 			} | ||||
| 			continue | ||||
| 		} | ||||
| 
 | ||||
| 		fmt.Printf("[net] bombing %s with new connection\n", address) | ||||
| 
 | ||||
| 		err = bombConn(message, maxOffsetX, maxOffsetY, conn, stop) | ||||
| 		conn.Close() | ||||
| 		timeout = timeoutMin | ||||
| 		if err == nil { | ||||
| 			break // we're supposed to exit
 | ||||
| 		} | ||||
| 	} | ||||
| 	defer conn.Close() | ||||
| 	bombConn(message, maxOffsetX, maxOffsetY, conn, stop) | ||||
| } | ||||
| 
 | ||||
| func bombConn(message []byte, maxOffsetX, maxOffsetY int, conn net.Conn, stop chan bool) { | ||||
| func bombConn(message []byte, maxOffsetX, maxOffsetY int, conn net.Conn, stop chan bool) error { | ||||
| 	PerformanceReporter.connsReporter <- 1 | ||||
| 	defer func() { PerformanceReporter.connsReporter <- -1 }() | ||||
| 
 | ||||
| 	var msg = make([]byte, len(message)+16) // leave some space for offset cmd
 | ||||
| 	msg = message | ||||
| 	randOffset := maxOffsetX > 1 && maxOffsetY > 0 | ||||
| 	randOffset := maxOffsetX > 0 && maxOffsetY > 0 | ||||
| 
 | ||||
| 	for { | ||||
| 		select { | ||||
| 		case <-stop: | ||||
| 			return | ||||
| 			return nil | ||||
| 		default: | ||||
| 			if randOffset { | ||||
| 				msg = append( | ||||
|  | @ -107,7 +127,7 @@ func bombConn(message []byte, maxOffsetX, maxOffsetY int, conn net.Conn, stop ch | |||
| 			} | ||||
| 			b, err := conn.Write(msg) | ||||
| 			if err != nil { | ||||
| 				log.Fatal(err) | ||||
| 				return err | ||||
| 			} | ||||
| 			if PerformanceReporter.Enabled { | ||||
| 				PerformanceReporter.bytesReporter <- b | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue