17
17
package adapters
18
18
19
19
import (
20
- "crypto/rand"
21
20
"errors"
22
21
"fmt"
23
22
"math"
24
23
"net"
25
- "os"
26
24
"sync"
27
- "syscall"
28
25
29
26
"github.com/ethereum/go-ethereum/event"
30
27
"github.com/ethereum/go-ethereum/log"
31
28
"github.com/ethereum/go-ethereum/node"
32
29
"github.com/ethereum/go-ethereum/p2p"
33
30
"github.com/ethereum/go-ethereum/p2p/discover"
31
+ "github.com/ethereum/go-ethereum/p2p/simulations/pipes"
34
32
"github.com/ethereum/go-ethereum/rpc"
35
33
)
36
34
@@ -49,7 +47,7 @@ type SimAdapter struct {
49
47
// the adapter uses a net.Pipe for in-memory simulated network connections
50
48
func NewSimAdapter (services map [string ]ServiceFunc ) * SimAdapter {
51
49
return & SimAdapter {
52
- pipe : netPipe ,
50
+ pipe : pipes . NetPipe ,
53
51
nodes : make (map [discover.NodeID ]* SimNode ),
54
52
services : services ,
55
53
}
@@ -61,15 +59,15 @@ func NewSimAdapter(services map[string]ServiceFunc) *SimAdapter {
61
59
// the adapter uses a OS socketpairs for in-memory simulated network connections
62
60
func NewSocketAdapter (services map [string ]ServiceFunc ) * SimAdapter {
63
61
return & SimAdapter {
64
- pipe : socketPipe ,
62
+ pipe : pipes . SocketPipe ,
65
63
nodes : make (map [discover.NodeID ]* SimNode ),
66
64
services : services ,
67
65
}
68
66
}
69
67
70
68
func NewTCPAdapter (services map [string ]ServiceFunc ) * SimAdapter {
71
69
return & SimAdapter {
72
- pipe : tcpPipe ,
70
+ pipe : pipes . TCPPipe ,
73
71
nodes : make (map [discover.NodeID ]* SimNode ),
74
72
services : services ,
75
73
}
@@ -348,34 +346,6 @@ func (sn *SimNode) NodeInfo() *p2p.NodeInfo {
348
346
return server .NodeInfo ()
349
347
}
350
348
351
- // socketPipe creates an in process full duplex pipe based on OS sockets
352
- // credit to @lmars & Flynn
353
- // https://github.com/flynn/flynn/blob/master/host/containerinit/init.go#L743-L749
354
- // using this in large simulations requires raising OS's max open file limit
355
- func socketPipe () (net.Conn , net.Conn , error ) {
356
- pair , err := syscall .Socketpair (syscall .AF_UNIX , syscall .SOCK_STREAM , 0 )
357
- if err != nil {
358
- return nil , nil , err
359
- }
360
- nameb := make ([]byte , 8 )
361
- _ , err = rand .Read (nameb )
362
- if err != nil {
363
- return nil , nil , err
364
- }
365
- f1 := os .NewFile (uintptr (pair [0 ]), string (nameb )+ ".out" )
366
- f2 := os .NewFile (uintptr (pair [1 ]), string (nameb )+ ".in" )
367
- pipe1 , err := net .FileConn (f1 )
368
- if err != nil {
369
- return nil , nil , err
370
- }
371
- pipe2 , err := net .FileConn (f2 )
372
- if err != nil {
373
- return nil , nil , err
374
- }
375
-
376
- return pipe1 , pipe2 , nil
377
- }
378
-
379
349
func setSocketBuffer (conn net.Conn , socketReadBuffer int , socketWriteBuffer int ) error {
380
350
switch v := conn .(type ) {
381
351
case * net.UnixConn :
@@ -390,64 +360,3 @@ func setSocketBuffer(conn net.Conn, socketReadBuffer int, socketWriteBuffer int)
390
360
}
391
361
return nil
392
362
}
393
-
394
- // netPipe wraps net.Pipe in a signature returning an error
395
- func netPipe () (net.Conn , net.Conn , error ) {
396
- p1 , p2 := net .Pipe ()
397
- return p1 , p2 , nil
398
- }
399
-
400
- // tcpPipe creates an in process full duplex pipe based on a localhost TCP socket
401
- func tcpPipe () (net.Conn , net.Conn , error ) {
402
- type result struct {
403
- conn net.Conn
404
- err error
405
- }
406
-
407
- cl := make (chan result )
408
- cd := make (chan result )
409
-
410
- start := make (chan net.Addr )
411
-
412
- go func (res chan result , start chan net.Addr ) {
413
- // resolve
414
- addr , err := net .ResolveTCPAddr ("tcp" , "localhost:0" )
415
- if err != nil {
416
- res <- result {err : err }
417
- return
418
- }
419
- // listen
420
- l , err := net .ListenTCP ("tcp" , addr )
421
- if err != nil {
422
- res <- result {err : err }
423
- return
424
- }
425
- start <- l .Addr ()
426
- c , err := l .AcceptTCP ()
427
- if err != nil {
428
- res <- result {err : err }
429
- return
430
- }
431
- res <- result {conn : c }
432
- }(cl , start )
433
-
434
- go func (res chan result , start chan net.Addr ) {
435
- addr := <- start
436
- c , err := net .DialTCP ("tcp" , nil , addr .(* net.TCPAddr ))
437
- if err != nil {
438
- res <- result {err : err }
439
- return
440
- }
441
- res <- result {conn : c }
442
- }(cd , start )
443
-
444
- a := <- cl
445
- if a .err != nil {
446
- return nil , nil , a .err
447
- }
448
- b := <- cd
449
- if b .err != nil {
450
- return nil , nil , b .err
451
- }
452
- return a .conn , b .conn , nil
453
- }
0 commit comments