From f1345e827d3f359f1426ee2868bd8d1b04152726 Mon Sep 17 00:00:00 2001 From: Alex Sharov Date: Tue, 20 Jul 2021 15:34:04 +0700 Subject: [PATCH] remove ipc package (#2405) * remove ipc package * remove ipc package * remove ipc package * remove ipc --- go.mod | 3 +- go.sum | 5 +- internal/cmdtest/test_cmd.go | 294 ----------------------------------- internal/ethapi/addrlock.go | 53 ------- node/node.go | 15 -- node/rpcstack.go | 45 ------ rpc/client.go | 2 - rpc/client_test.go | 32 ---- rpc/constants_unix.go | 33 ---- rpc/constants_unix_nocgo.go | 25 --- rpc/endpoints.go | 35 ----- rpc/ipc.go | 17 -- rpc/ipc_js.go | 37 ----- rpc/ipc_unix.go | 54 ------- rpc/ipc_windows.go | 48 ------ 15 files changed, 3 insertions(+), 695 deletions(-) delete mode 100644 internal/cmdtest/test_cmd.go delete mode 100644 internal/ethapi/addrlock.go delete mode 100644 rpc/constants_unix.go delete mode 100644 rpc/constants_unix_nocgo.go delete mode 100644 rpc/ipc_js.go delete mode 100644 rpc/ipc_unix.go delete mode 100644 rpc/ipc_windows.go diff --git a/go.mod b/go.mod index 36764c78b..970876d1b 100644 --- a/go.mod +++ b/go.mod @@ -60,7 +60,7 @@ require ( github.com/urfave/cli v1.22.5 github.com/valyala/fastjson v1.6.3 github.com/wcharczuk/go-chart v2.0.1+incompatible - go.uber.org/atomic v1.8.0 + go.uber.org/atomic v1.9.0 golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e golang.org/x/sync v0.0.0-20201207232520-09787c993a3a golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1 @@ -70,7 +70,6 @@ require ( google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0 google.golang.org/protobuf v1.27.1 gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 - gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce gopkg.in/olebedev/go-duktape.v3 v3.0.0-20200619000410-60c24ae608a6 pgregory.net/rapid v0.4.6 ) diff --git a/go.sum b/go.sum index b1932ced9..4aefb6bd3 100644 --- a/go.sum +++ b/go.sum @@ -1047,8 +1047,8 @@ go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= -go.uber.org/atomic v1.8.0 h1:CUhrE4N1rqSE6FM9ecihEjRkLQu8cDfgDyoOs83mEY4= -go.uber.org/atomic v1.8.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE= +go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= @@ -1464,7 +1464,6 @@ gopkg.in/go-playground/validator.v9 v9.29.1/go.mod h1:+c9/zcJMFNgbLvly1L1V+PpxWd gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce h1:+JknDZhAj8YMt7GC73Ei8pv4MzjDUNPHgQWJdtMAaDU= gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:5AcXVHNjg+BDxry382+8OKon8SEWiKktQR07RKPsv1c= gopkg.in/olebedev/go-duktape.v3 v3.0.0-20200619000410-60c24ae608a6 h1:a6cXbcDDUkSBlpnkWV1bJ+vv3mOgQEltEJ2rPxroVu0= gopkg.in/olebedev/go-duktape.v3 v3.0.0-20200619000410-60c24ae608a6/go.mod h1:uAJfkITjFhyEEuUfm7bsmCZRbW5WRq8s9EY8HZ6hCns= diff --git a/internal/cmdtest/test_cmd.go b/internal/cmdtest/test_cmd.go deleted file mode 100644 index 292fec809..000000000 --- a/internal/cmdtest/test_cmd.go +++ /dev/null @@ -1,294 +0,0 @@ -// Copyright 2017 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package cmdtest - -import ( - "bufio" - "bytes" - "fmt" - "io" - "io/ioutil" - "os" - "os/exec" - "regexp" - "strings" - "sync" - "sync/atomic" - "syscall" - "testing" - "text/template" - "time" - - "github.com/docker/docker/pkg/reexec" -) - -func NewTestCmd(t *testing.T, data interface{}) *TestCmd { - return &TestCmd{T: t, Data: data} -} - -type TestCmd struct { - // For total convenience, all testing methods are available. - *testing.T - - Func template.FuncMap - Data interface{} - Cleanup func() - - cmd *exec.Cmd - stdout *bufio.Reader - stdin io.WriteCloser - stderr *testlogger - // Err will contain the process exit error or interrupt signal error - Err error -} - -var id int32 - -// Run exec's the current binary using name as argv[0] which will trigger the -// reexec init function for that name (e.g. "geth-test" in cmd/geth/run_test.go) -func (tt *TestCmd) Run(name string, args ...string) { - id1 := atomic.AddInt32(&id, 1) - tt.stderr = &testlogger{t: tt.T, name: fmt.Sprintf("%d", id1)} - tt.cmd = &exec.Cmd{ - Path: reexec.Self(), - Args: append([]string{name}, args...), - Stderr: tt.stderr, - } - stdout, err := tt.cmd.StdoutPipe() - if err != nil { - tt.Fatal(err) - } - tt.stdout = bufio.NewReader(stdout) - if tt.stdin, err = tt.cmd.StdinPipe(); err != nil { - tt.Fatal(err) - } - if err := tt.cmd.Start(); err != nil { - tt.Fatal(err) - } -} - -// InputLine writes the given text to the child's stdin. -// This method can also be called from an expect template, e.g.: -// -// geth.expect(`Passphrase: {{.InputLine "password"}}`) -func (tt *TestCmd) InputLine(s string) string { - io.WriteString(tt.stdin, s+"\n") - return "" -} - -func (tt *TestCmd) SetTemplateFunc(name string, fn interface{}) { - if tt.Func == nil { - tt.Func = make(map[string]interface{}) - } - tt.Func[name] = fn -} - -// Expect runs its argument as a template, then expects the -// child process to output the result of the template within 5s. -// -// If the template starts with a newline, the newline is removed -// before matching. -func (tt *TestCmd) Expect(tplsource string) { - // Generate the expected output by running the template. - tpl := template.Must(template.New("").Funcs(tt.Func).Parse(tplsource)) - wantbuf := new(bytes.Buffer) - if err := tpl.Execute(wantbuf, tt.Data); err != nil { - panic(err) - } - // Trim exactly one newline at the beginning. This makes tests look - // much nicer because all expect strings are at column 0. - want := bytes.TrimPrefix(wantbuf.Bytes(), []byte("\n")) - if err := tt.matchExactOutput(want); err != nil { - tt.Fatal(err) - } - tt.Logf("Matched stdout text:\n%s", want) -} - -func (tt *TestCmd) matchExactOutput(want []byte) error { - buf := make([]byte, len(want)) - n := 0 - tt.withKillTimeout(func() { n, _ = io.ReadFull(tt.stdout, buf) }) - buf = buf[:n] - if n < len(want) || !bytes.Equal(buf, want) { - // Grab any additional buffered output in case of mismatch - // because it might help with debugging. - buf = append(buf, make([]byte, tt.stdout.Buffered())...) - tt.stdout.Read(buf[n:]) - // Find the mismatch position. - for i := 0; i < n; i++ { - if want[i] != buf[i] { - return fmt.Errorf("output mismatch at ā—Š:\n---------------- (stdout text)\n%sā—Š%s\n---------------- (expected text)\n%s", - buf[:i], buf[i:n], want) - } - } - if n < len(want) { - return fmt.Errorf("not enough output, got until ā—Š:\n---------------- (stdout text)\n%s\n---------------- (expected text)\n%sā—Š%s", - buf, want[:n], want[n:]) - } - } - return nil -} - -// ExpectRegexp expects the child process to output text matching the -// given regular expression within 5s. -// -// Note that an arbitrary amount of output may be consumed by the -// regular expression. This usually means that expect cannot be used -// after ExpectRegexp. -func (tt *TestCmd) ExpectRegexp(regex string) (*regexp.Regexp, []string) { - regex = strings.TrimPrefix(regex, "\n") - var ( - re = regexp.MustCompile(regex) - rtee = &runeTee{in: tt.stdout} - matches []int - ) - tt.withKillTimeout(func() { matches = re.FindReaderSubmatchIndex(rtee) }) - output := rtee.buf.Bytes() - if matches == nil { - tt.Fatalf("Output did not match:\n---------------- (stdout text)\n%s\n---------------- (regular expression)\n%s", - output, regex) - return re, nil - } - tt.Logf("Matched stdout text:\n%s", output) - var submatches []string - for i := 0; i < len(matches); i += 2 { - submatch := string(output[matches[i]:matches[i+1]]) - submatches = append(submatches, submatch) - } - return re, submatches -} - -// ExpectExit expects the child process to exit within 5s without -// printing any additional text on stdout. -func (tt *TestCmd) ExpectExit() { - var output []byte - tt.withKillTimeout(func() { - output, _ = ioutil.ReadAll(tt.stdout) - }) - tt.WaitExit() - if tt.Cleanup != nil { - tt.Cleanup() - } - if len(output) > 0 { - tt.Errorf("Unmatched stdout text:\n%s", output) - } -} - -func (tt *TestCmd) WaitExit() { - tt.Err = tt.cmd.Wait() -} - -func (tt *TestCmd) Interrupt() { - tt.Err = tt.cmd.Process.Signal(os.Interrupt) -} - -// ExitStatus exposes the process' OS exit code -// It will only return a valid value after the process has finished. -func (tt *TestCmd) ExitStatus() int { - if tt.Err != nil { - exitErr := tt.Err.(*exec.ExitError) - if exitErr != nil { - if status, ok := exitErr.Sys().(syscall.WaitStatus); ok { - return status.ExitStatus() - } - } - } - return 0 -} - -// StderrText returns any stderr output written so far. -// The returned text holds all log lines after ExpectExit has -// returned. -func (tt *TestCmd) StderrText() string { - tt.stderr.mu.Lock() - defer tt.stderr.mu.Unlock() - return tt.stderr.buf.String() -} - -func (tt *TestCmd) CloseStdin() { - tt.stdin.Close() -} - -func (tt *TestCmd) Kill() { - tt.cmd.Process.Kill() - if tt.Cleanup != nil { - tt.Cleanup() - } -} - -func (tt *TestCmd) withKillTimeout(fn func()) { - timeout := time.AfterFunc(10*time.Second, func() { - tt.Log("killing the child process (timeout)") - tt.Kill() - }) - defer timeout.Stop() - fn() -} - -// testlogger logs all written lines via t.Log and also -// collects them for later inspection. -type testlogger struct { - t *testing.T - mu sync.Mutex - buf bytes.Buffer - name string -} - -func (tl *testlogger) Write(b []byte) (n int, err error) { - lines := bytes.Split(b, []byte("\n")) - for _, line := range lines { - if len(line) > 0 { - tl.t.Logf("(stderr:%v) %s", tl.name, line) - } - } - tl.mu.Lock() - tl.buf.Write(b) - tl.mu.Unlock() - return len(b), err -} - -// runeTee collects text read through it into buf. -type runeTee struct { - in interface { - io.Reader - io.ByteReader - io.RuneReader - } - buf bytes.Buffer -} - -func (rtee *runeTee) Read(b []byte) (n int, err error) { - n, err = rtee.in.Read(b) - rtee.buf.Write(b[:n]) - return n, err -} - -func (rtee *runeTee) ReadRune() (r rune, size int, err error) { - r, size, err = rtee.in.ReadRune() - if err == nil { - rtee.buf.WriteRune(r) - } - return r, size, err -} - -func (rtee *runeTee) ReadByte() (b byte, err error) { - b, err = rtee.in.ReadByte() - if err == nil { - rtee.buf.WriteByte(b) - } - return b, err -} diff --git a/internal/ethapi/addrlock.go b/internal/ethapi/addrlock.go deleted file mode 100644 index 64708ea7a..000000000 --- a/internal/ethapi/addrlock.go +++ /dev/null @@ -1,53 +0,0 @@ -// Copyright 2017 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package ethapi - -import ( - "sync" - - "github.com/ledgerwatch/erigon/common" -) - -type AddrLocker struct { - mu sync.Mutex - locks map[common.Address]*sync.Mutex -} - -// lock returns the lock of the given address. -func (l *AddrLocker) lock(address common.Address) *sync.Mutex { - l.mu.Lock() - defer l.mu.Unlock() - if l.locks == nil { - l.locks = make(map[common.Address]*sync.Mutex) - } - if _, ok := l.locks[address]; !ok { - l.locks[address] = new(sync.Mutex) - } - return l.locks[address] -} - -// LockAddr locks an account's mutex. This is used to prevent another tx getting the -// same nonce until the lock is released. The mutex prevents the (an identical nonce) from -// being read again during the time that the first transaction is being signed. -func (l *AddrLocker) LockAddr(address common.Address) { - l.lock(address).Lock() -} - -// UnlockAddr unlocks the mutex of the given account. -func (l *AddrLocker) UnlockAddr(address common.Address) { - l.lock(address).Unlock() -} diff --git a/node/node.go b/node/node.go index 1048b0e2c..f471e2ca7 100644 --- a/node/node.go +++ b/node/node.go @@ -51,7 +51,6 @@ type Node struct { rpcAPIs []rpc.API // List of APIs currently provided by the node http *httpServer // ws *httpServer // - ipc *ipcServer // Stores information about the ipc http server inprocHandler *rpc.Server // In-process RPC request handler to process the API requests rpcAllowList rpc.AllowList // list of RPC methods explicitly allowed for this RPC node @@ -120,7 +119,6 @@ func New(conf *Config) (*Node, error) { // Configure RPC servers. node.http = newHTTPServer(node.log, conf.HTTPTimeouts) node.ws = newHTTPServer(node.log, rpc.DefaultHTTPTimeouts) - node.ipc = newIPCServer(node.log, conf.IPCEndpoint()) // Check for uncaught crashes from the previous boot and notify the user if // there are any //debug.CheckForCrashes(conf.DataDir) @@ -311,13 +309,6 @@ func (n *Node) startRPC() error { return err } - // Configure IPC. - if n.ipc.endpoint != "" { - if err := n.ipc.start(n.rpcAPIs); err != nil { - return err - } - } - // Configure HTTP. if n.config.HTTPHost != "" { config := httpConfig{ @@ -366,7 +357,6 @@ func (n *Node) wsServerForPort(port int) *httpServer { func (n *Node) stopRPC() { n.http.stop() n.ws.stop() - n.ipc.stop() //nolint:errcheck n.stopInProc() } @@ -483,11 +473,6 @@ func (n *Node) InstanceDir() string { return n.config.instanceDir() } -// IPCEndpoint retrieves the current IPC endpoint used by the protocol stack. -func (n *Node) IPCEndpoint() string { - return n.ipc.endpoint -} - // HTTPEndpoint returns the URL of the HTTP server. Note that this URL does not // contain the JSON-RPC path prefix set by HTTPPathPrefix. func (n *Node) HTTPEndpoint() string { diff --git a/node/rpcstack.go b/node/rpcstack.go index d2d18a650..3ca2d2477 100644 --- a/node/rpcstack.go +++ b/node/rpcstack.go @@ -478,51 +478,6 @@ func newGzipHandler(next http.Handler) http.Handler { }) } -type ipcServer struct { - log log.Logger - endpoint string - - mu sync.Mutex - listener net.Listener - srv *rpc.Server -} - -func newIPCServer(log log.Logger, endpoint string) *ipcServer { - return &ipcServer{log: log, endpoint: endpoint} -} - -// Start starts the httpServer's http.Server -func (is *ipcServer) start(apis []rpc.API) error { - is.mu.Lock() - defer is.mu.Unlock() - - if is.listener != nil { - return nil // already running - } - listener, srv, err := rpc.StartIPCEndpoint(is.endpoint, apis) - if err != nil { - is.log.Warn("IPC opening failed", "url", is.endpoint, "error", err) - return err - } - is.log.Info("IPC endpoint opened", "url", is.endpoint) - is.listener, is.srv = listener, srv - return nil -} - -func (is *ipcServer) stop() error { - is.mu.Lock() - defer is.mu.Unlock() - - if is.listener == nil { - return nil // not running - } - err := is.listener.Close() - is.srv.Stop() - is.listener, is.srv = nil, nil - is.log.Info("IPC endpoint closed", "url", is.endpoint) - return err -} - // RegisterApisFromWhitelist checks the given modules' availability, generates a whitelist based on the allowed modules, // and then registers all of the APIs exposed by the services. func RegisterApisFromWhitelist(apis []rpc.API, modules []string, srv *rpc.Server, exposeAll bool) error { diff --git a/rpc/client.go b/rpc/client.go index 13fcbf6c2..aed444239 100644 --- a/rpc/client.go +++ b/rpc/client.go @@ -179,8 +179,6 @@ func DialContext(ctx context.Context, rawurl string) (*Client, error) { return DialWebsocket(ctx, rawurl, "") case "stdio": return DialStdIO(ctx) - case "": - return DialIPC(ctx, rawurl) default: return nil, fmt.Errorf("no known transport for URL scheme %q", u.Scheme) } diff --git a/rpc/client_test.go b/rpc/client_test.go index 8784a63df..b9a5472dd 100644 --- a/rpc/client_test.go +++ b/rpc/client_test.go @@ -23,7 +23,6 @@ import ( "net" "net/http" "net/http/httptest" - "os" "reflect" "runtime" "strings" @@ -157,7 +156,6 @@ func TestClientNotify(t *testing.T) { // func TestClientCancelInproc(t *testing.T) { testClientCancel("inproc", t) } func TestClientCancelWebsocket(t *testing.T) { testClientCancel("ws", t) } func TestClientCancelHTTP(t *testing.T) { testClientCancel("http", t) } -func TestClientCancelIPC(t *testing.T) { testClientCancel("ipc", t) } // This test checks that requests made through CallContext can be canceled by canceling // the context. @@ -195,10 +193,6 @@ func testClientCancel(transport string, t *testing.T) { c, hs := httpTestClient(server, transport, fl) defer hs.Close() client = c - case "ipc": - c, l := ipcTestClient(server, fl) - defer l.Close() - client = c default: panic("unknown transport: " + transport) } @@ -601,32 +595,6 @@ func httpTestClient(srv *Server, transport string, fl *flakeyListener) (*Client, return client, hs } -func ipcTestClient(srv *Server, fl *flakeyListener) (*Client, net.Listener) { - // Listen on a random endpoint. - endpoint := fmt.Sprintf("go-ethereum-test-ipc-%d-%d", os.Getpid(), rand.Int63()) - if runtime.GOOS == "windows" { - endpoint = `\\.\pipe\` + endpoint - } else { - endpoint = os.TempDir() + "/" + endpoint - } - l, err := ipcListen(endpoint) - if err != nil { - panic(err) - } - // Connect the listener to the server. - if fl != nil { - fl.Listener = l - l = fl - } - go srv.ServeListener(l) - // Connect the client. - client, err := Dial(endpoint) - if err != nil { - panic(err) - } - return client, l -} - // flakeyListener kills accepted connections after a random timeout. type flakeyListener struct { net.Listener diff --git a/rpc/constants_unix.go b/rpc/constants_unix.go deleted file mode 100644 index 2f98d6499..000000000 --- a/rpc/constants_unix.go +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright 2019 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -// +build darwin dragonfly freebsd linux nacl netbsd openbsd solaris - -package rpc - -/* -#include - -int max_socket_path_size() { -struct sockaddr_un s; -return sizeof(s.sun_path); -} -*/ -import "C" - -var ( - max_path_size = C.max_socket_path_size() -) diff --git a/rpc/constants_unix_nocgo.go b/rpc/constants_unix_nocgo.go deleted file mode 100644 index ecb231f92..000000000 --- a/rpc/constants_unix_nocgo.go +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright 2019 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -// +build !cgo,!windows - -package rpc - -var ( - // On Linux, sun_path is 108 bytes in size - // see http://man7.org/linux/man-pages/man7/unix.7.html - max_path_size = 108 -) diff --git a/rpc/endpoints.go b/rpc/endpoints.go index 1b6062405..c902fcd3d 100644 --- a/rpc/endpoints.go +++ b/rpc/endpoints.go @@ -15,38 +15,3 @@ // along with the go-ethereum library. If not, see . package rpc - -import ( - "net" - "strings" - - "github.com/ledgerwatch/erigon/log" -) - -// StartIPCEndpoint starts an IPC endpoint. -func StartIPCEndpoint(ipcEndpoint string, apis []API) (net.Listener, *Server, error) { - // Register all the APIs exposed by the services. - var ( - handler = NewServer(50) - regMap = make(map[string]struct{}) - registered []string - ) - for _, api := range apis { - if err := handler.RegisterName(api.Namespace, api.Service); err != nil { - log.Info("IPC registration failed", "namespace", api.Namespace, "error", err) - return nil, nil, err - } - if _, ok := regMap[api.Namespace]; !ok { - registered = append(registered, api.Namespace) - regMap[api.Namespace] = struct{}{} - } - } - log.Debug("IPCs registered", "namespaces", strings.Join(registered, ",")) - // All APIs registered, start the IPC listener. - listener, err := ipcListen(ipcEndpoint) - if err != nil { - return nil, nil, err - } - go handler.ServeListener(listener) - return listener, handler, nil -} diff --git a/rpc/ipc.go b/rpc/ipc.go index bd115063c..136807708 100644 --- a/rpc/ipc.go +++ b/rpc/ipc.go @@ -17,7 +17,6 @@ package rpc import ( - "context" "net" "github.com/ledgerwatch/erigon/log" @@ -38,19 +37,3 @@ func (s *Server) ServeListener(l net.Listener) error { go s.ServeCodec(NewCodec(conn), 0) } } - -// DialIPC create a new IPC client that connects to the given endpoint. On Unix it assumes -// the endpoint is the full path to a unix socket, and Windows the endpoint is an -// identifier for a named pipe. -// -// The context is used for the initial connection establishment. It does not -// affect subsequent interactions with the client. -func DialIPC(ctx context.Context, endpoint string) (*Client, error) { - return newClient(ctx, func(ctx context.Context) (ServerCodec, error) { - conn, err := newIPCConnection(ctx, endpoint) - if err != nil { - return nil, err - } - return NewCodec(conn), err - }) -} diff --git a/rpc/ipc_js.go b/rpc/ipc_js.go deleted file mode 100644 index 7e7554a76..000000000 --- a/rpc/ipc_js.go +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright 2018 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -// +build js - -package rpc - -import ( - "context" - "errors" - "net" -) - -var errNotSupported = errors.New("rpc: not supported") - -// ipcListen will create a named pipe on the given endpoint. -func ipcListen(endpoint string) (net.Listener, error) { - return nil, errNotSupported -} - -// newIPCConnection will connect to a named pipe with the given endpoint as name. -func newIPCConnection(ctx context.Context, endpoint string) (net.Conn, error) { - return nil, errNotSupported -} diff --git a/rpc/ipc_unix.go b/rpc/ipc_unix.go deleted file mode 100644 index e93a909e7..000000000 --- a/rpc/ipc_unix.go +++ /dev/null @@ -1,54 +0,0 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -// +build darwin dragonfly freebsd linux nacl netbsd openbsd solaris - -package rpc - -import ( - "context" - "fmt" - "net" - "os" - "path/filepath" - - "github.com/ledgerwatch/erigon/log" -) - -// ipcListen will create a Unix socket on the given endpoint. -func ipcListen(endpoint string) (net.Listener, error) { - if len(endpoint) > int(max_path_size) { - log.Warn(fmt.Sprintf("The ipc endpoint is longer than %d characters. ", max_path_size), - "endpoint", endpoint) - } - - // Ensure the IPC path exists and remove any previous leftover - if err := os.MkdirAll(filepath.Dir(endpoint), 0751); err != nil { - return nil, err - } - os.Remove(endpoint) - l, err := net.Listen("unix", endpoint) - if err != nil { - return nil, err - } - os.Chmod(endpoint, 0600) - return l, nil -} - -// newIPCConnection will connect to a Unix socket on the given endpoint. -func newIPCConnection(ctx context.Context, endpoint string) (net.Conn, error) { - return new(net.Dialer).DialContext(ctx, "unix", endpoint) -} diff --git a/rpc/ipc_windows.go b/rpc/ipc_windows.go deleted file mode 100644 index ca56a3ce4..000000000 --- a/rpc/ipc_windows.go +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -// +build windows - -package rpc - -import ( - "context" - "net" - "time" - - "gopkg.in/natefinch/npipe.v2" -) - -// This is used if the dialing context has no deadline. It is much smaller than the -// defaultDialTimeout because named pipes are local and there is no need to wait so long. -const defaultPipeDialTimeout = 2 * time.Second - -// ipcListen will create a named pipe on the given endpoint. -func ipcListen(endpoint string) (net.Listener, error) { - return npipe.Listen(endpoint) -} - -// newIPCConnection will connect to a named pipe with the given endpoint as name. -func newIPCConnection(ctx context.Context, endpoint string) (net.Conn, error) { - timeout := defaultPipeDialTimeout - if deadline, ok := ctx.Deadline(); ok { - timeout = deadline.Sub(time.Now()) - if timeout < 0 { - timeout = 0 - } - } - return npipe.DialTimeout(endpoint, timeout) -}