mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-04-23 10:02:25 +00:00
* simv2: wip * simulation: exec adapter start/stop * simulation: add node status to exec adapter * simulation: initial simulation code * simulation: exec adapter, configure path to executable * simulation: initial docker adapter * simulation: wip kubernetes adapter * simulation: kubernetes adapter proxy * simulation: implement GetAll/StartAll/StopAll * simulation: kuberentes adapter - set env vars and resource limits * simulation: discovery test * simulation: remove port definitions within docker adapter * simulation: simplify wait for healthy loop * simulation: get nat ip addr from interface * simulation: pull docker images automatically * simulation: NodeStatus -> NodeInfo * simulation: move discovery test to example dir * simulation: example snapshot usage * simulation: add goclient specific simulation * simulation: add peer connections to snapshot * simulation: close rpc client * simulation: don't export kubernetes proxy server * simulation: merge simulation code * simulation: don't export nodemap * simulation: rename SimulationSnapshot -> Snapshot * simulation: linting fixes * simulation: add k8s available helper func * simulation: vendor * simulation: fix 'no non-test Go files' when building * simulation: remove errors from interface methods where non were returned * simulation: run getHealthInfo check in parallel
56 lines
1.2 KiB
Go
56 lines
1.2 KiB
Go
// Copyright 2014 Google Inc. All rights reserved.
|
|
// Use of this source code is governed by the Apache 2.0
|
|
// license that can be found in the LICENSE file.
|
|
|
|
package internal
|
|
|
|
// This file implements a network dialer that limits the number of concurrent connections.
|
|
// It is only used for API calls.
|
|
|
|
import (
|
|
"log"
|
|
"net"
|
|
"runtime"
|
|
"sync"
|
|
"time"
|
|
)
|
|
|
|
var limitSem = make(chan int, 100) // TODO(dsymonds): Use environment variable.
|
|
|
|
func limitRelease() {
|
|
// non-blocking
|
|
select {
|
|
case <-limitSem:
|
|
default:
|
|
// This should not normally happen.
|
|
log.Print("appengine: unbalanced limitSem release!")
|
|
}
|
|
}
|
|
|
|
func limitDial(network, addr string) (net.Conn, error) {
|
|
limitSem <- 1
|
|
|
|
// Dial with a timeout in case the API host is MIA.
|
|
// The connection should normally be very fast.
|
|
conn, err := net.DialTimeout(network, addr, 500*time.Millisecond)
|
|
if err != nil {
|
|
limitRelease()
|
|
return nil, err
|
|
}
|
|
lc := &limitConn{Conn: conn}
|
|
runtime.SetFinalizer(lc, (*limitConn).Close) // shouldn't usually be required
|
|
return lc, nil
|
|
}
|
|
|
|
type limitConn struct {
|
|
close sync.Once
|
|
net.Conn
|
|
}
|
|
|
|
func (lc *limitConn) Close() error {
|
|
defer lc.close.Do(func() {
|
|
limitRelease()
|
|
runtime.SetFinalizer(lc, nil)
|
|
})
|
|
return lc.Conn.Close()
|
|
}
|