From 269c5c71072f9e17e6387f853d626bff1160db5c Mon Sep 17 00:00:00 2001 From: Jeffrey Wilcke Date: Wed, 19 Aug 2015 21:46:01 +0200 Subject: [PATCH] Revert "fdtrack: temporary hack for tracking file descriptor usage" This reverts commit 5c949d3b3ba81ea0563575b19a7b148aeac4bf61. --- .../src/github.com/huin/goupnp/httpu/httpu.go | 4 - .../src/github.com/huin/goupnp/soap/soap.go | 14 --- .../github.com/jackpal/go-nat-pmp/natpmp.go | 4 - .../goleveldb/leveldb/storage/file_storage.go | 5 - cmd/geth/main.go | 4 - fdtrack/fdtrack.go | 112 ------------------ fdtrack/fdusage.go | 29 ----- fdtrack/fdusage_darwin.go | 72 ----------- fdtrack/fdusage_linux.go | 53 --------- p2p/dial.go | 2 - p2p/discover/udp.go | 3 - p2p/metrics.go | 8 +- p2p/server.go | 3 +- rpc/comms/http.go | 2 - rpc/comms/ipc_unix.go | 6 +- 15 files changed, 7 insertions(+), 314 deletions(-) delete mode 100644 fdtrack/fdtrack.go delete mode 100644 fdtrack/fdusage.go delete mode 100644 fdtrack/fdusage_darwin.go delete mode 100644 fdtrack/fdusage_linux.go diff --git a/Godeps/_workspace/src/github.com/huin/goupnp/httpu/httpu.go b/Godeps/_workspace/src/github.com/huin/goupnp/httpu/httpu.go index 3f4606af0..862c3def4 100644 --- a/Godeps/_workspace/src/github.com/huin/goupnp/httpu/httpu.go +++ b/Godeps/_workspace/src/github.com/huin/goupnp/httpu/httpu.go @@ -9,8 +9,6 @@ import ( "net/http" "sync" "time" - - "github.com/ethereum/go-ethereum/fdtrack" ) // HTTPUClient is a client for dealing with HTTPU (HTTP over UDP). Its typical @@ -27,7 +25,6 @@ func NewHTTPUClient() (*HTTPUClient, error) { if err != nil { return nil, err } - fdtrack.Open("upnp") return &HTTPUClient{conn: conn}, nil } @@ -36,7 +33,6 @@ func NewHTTPUClient() (*HTTPUClient, error) { func (httpu *HTTPUClient) Close() error { httpu.connLock.Lock() defer httpu.connLock.Unlock() - fdtrack.Close("upnp") return httpu.conn.Close() } diff --git a/Godeps/_workspace/src/github.com/huin/goupnp/soap/soap.go b/Godeps/_workspace/src/github.com/huin/goupnp/soap/soap.go index 786ce6fa8..815610734 100644 --- a/Godeps/_workspace/src/github.com/huin/goupnp/soap/soap.go +++ b/Godeps/_workspace/src/github.com/huin/goupnp/soap/soap.go @@ -7,12 +7,9 @@ import ( "encoding/xml" "fmt" "io/ioutil" - "net" "net/http" "net/url" "reflect" - - "github.com/ethereum/go-ethereum/fdtrack" ) const ( @@ -29,17 +26,6 @@ type SOAPClient struct { func NewSOAPClient(endpointURL url.URL) *SOAPClient { return &SOAPClient{ EndpointURL: endpointURL, - HTTPClient: http.Client{ - Transport: &http.Transport{ - Dial: func(network, addr string) (net.Conn, error) { - c, err := net.Dial(network, addr) - if c != nil { - c = fdtrack.WrapConn("upnp", c) - } - return c, err - }, - }, - }, } } diff --git a/Godeps/_workspace/src/github.com/jackpal/go-nat-pmp/natpmp.go b/Godeps/_workspace/src/github.com/jackpal/go-nat-pmp/natpmp.go index b165c784e..8ce4e8342 100644 --- a/Godeps/_workspace/src/github.com/jackpal/go-nat-pmp/natpmp.go +++ b/Godeps/_workspace/src/github.com/jackpal/go-nat-pmp/natpmp.go @@ -5,8 +5,6 @@ import ( "log" "net" "time" - - "github.com/ethereum/go-ethereum/fdtrack" ) // Implement the NAT-PMP protocol, typically supported by Apple routers and open source @@ -104,8 +102,6 @@ func (n *Client) rpc(msg []byte, resultSize int) (result []byte, err error) { if err != nil { return } - fdtrack.Open("natpmp") - defer fdtrack.Close("natpmp") defer conn.Close() result = make([]byte, resultSize) diff --git a/Godeps/_workspace/src/github.com/syndtr/goleveldb/leveldb/storage/file_storage.go b/Godeps/_workspace/src/github.com/syndtr/goleveldb/leveldb/storage/file_storage.go index 6d44f74b3..46cc9d070 100644 --- a/Godeps/_workspace/src/github.com/syndtr/goleveldb/leveldb/storage/file_storage.go +++ b/Godeps/_workspace/src/github.com/syndtr/goleveldb/leveldb/storage/file_storage.go @@ -18,7 +18,6 @@ import ( "sync" "time" - "github.com/ethereum/go-ethereum/fdtrack" "github.com/syndtr/goleveldb/leveldb/util" ) @@ -370,8 +369,6 @@ func (fw fileWrap) Close() error { err := fw.File.Close() if err != nil { f.fs.log(fmt.Sprintf("close %s.%d: %v", f.Type(), f.Num(), err)) - } else { - fdtrack.Close("leveldb") } return err } @@ -403,7 +400,6 @@ func (f *file) Open() (Reader, error) { return nil, err } ok: - fdtrack.Open("leveldb") f.open = true f.fs.open++ return fileWrap{of, f}, nil @@ -422,7 +418,6 @@ func (f *file) Create() (Writer, error) { if err != nil { return nil, err } - fdtrack.Open("leveldb") f.open = true f.fs.open++ return fileWrap{of, f}, nil diff --git a/cmd/geth/main.go b/cmd/geth/main.go index 2dc3c438f..07c4daf60 100644 --- a/cmd/geth/main.go +++ b/cmd/geth/main.go @@ -37,7 +37,6 @@ import ( "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/eth" "github.com/ethereum/go-ethereum/ethdb" - "github.com/ethereum/go-ethereum/fdtrack" "github.com/ethereum/go-ethereum/logger" "github.com/ethereum/go-ethereum/logger/glog" "github.com/ethereum/go-ethereum/metrics" @@ -546,9 +545,6 @@ func startEth(ctx *cli.Context, eth *eth.Ethereum) { // Start Ethereum itself utils.StartEthereum(eth) - // Start logging file descriptor stats. - fdtrack.Start() - am := eth.AccountManager() account := ctx.GlobalString(utils.UnlockedAccountFlag.Name) accounts := strings.Split(account, " ") diff --git a/fdtrack/fdtrack.go b/fdtrack/fdtrack.go deleted file mode 100644 index 2f5ab57f4..000000000 --- a/fdtrack/fdtrack.go +++ /dev/null @@ -1,112 +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 . - -// Package fdtrack logs statistics about open file descriptors. -package fdtrack - -import ( - "fmt" - "net" - "sort" - "sync" - "time" - - "github.com/ethereum/go-ethereum/logger/glog" -) - -var ( - mutex sync.Mutex - all = make(map[string]int) -) - -func Open(desc string) { - mutex.Lock() - all[desc] += 1 - mutex.Unlock() -} - -func Close(desc string) { - mutex.Lock() - defer mutex.Unlock() - if c, ok := all[desc]; ok { - if c == 1 { - delete(all, desc) - } else { - all[desc]-- - } - } -} - -func WrapListener(desc string, l net.Listener) net.Listener { - Open(desc) - return &wrappedListener{l, desc} -} - -type wrappedListener struct { - net.Listener - desc string -} - -func (w *wrappedListener) Accept() (net.Conn, error) { - c, err := w.Listener.Accept() - if err == nil { - c = WrapConn(w.desc, c) - } - return c, err -} - -func (w *wrappedListener) Close() error { - err := w.Listener.Close() - if err == nil { - Close(w.desc) - } - return err -} - -func WrapConn(desc string, conn net.Conn) net.Conn { - Open(desc) - return &wrappedConn{conn, desc} -} - -type wrappedConn struct { - net.Conn - desc string -} - -func (w *wrappedConn) Close() error { - err := w.Conn.Close() - if err == nil { - Close(w.desc) - } - return err -} - -func Start() { - go func() { - for range time.Tick(15 * time.Second) { - mutex.Lock() - var sum, tracked = 0, []string{} - for what, n := range all { - sum += n - tracked = append(tracked, fmt.Sprintf("%s:%d", what, n)) - } - mutex.Unlock() - used, _ := fdusage() - sort.Strings(tracked) - glog.Infof("fd usage %d/%d, tracked %d %v", used, fdlimit(), sum, tracked) - } - }() -} diff --git a/fdtrack/fdusage.go b/fdtrack/fdusage.go deleted file mode 100644 index 689625a8f..000000000 --- a/fdtrack/fdusage.go +++ /dev/null @@ -1,29 +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 !linux,!darwin - -package fdtrack - -import "errors" - -func fdlimit() int { - return 0 -} - -func fdusage() (int, error) { - return 0, errors.New("not implemented") -} diff --git a/fdtrack/fdusage_darwin.go b/fdtrack/fdusage_darwin.go deleted file mode 100644 index 04a3a9baf..000000000 --- a/fdtrack/fdusage_darwin.go +++ /dev/null @@ -1,72 +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 - -package fdtrack - -import ( - "os" - "syscall" - "unsafe" -) - -// #cgo CFLAGS: -lproc -// #include -// #include -import "C" - -func fdlimit() int { - var nofile syscall.Rlimit - if err := syscall.Getrlimit(syscall.RLIMIT_NOFILE, &nofile); err != nil { - return 0 - } - return int(nofile.Cur) -} - -func fdusage() (int, error) { - pid := C.int(os.Getpid()) - // Query for a rough estimate on the amout of data that - // proc_pidinfo will return. - rlen, err := C.proc_pidinfo(pid, C.PROC_PIDLISTFDS, 0, nil, 0) - if rlen <= 0 { - return 0, err - } - // Load the list of file descriptors. We don't actually care about - // the content, only about the size. Since the number of fds can - // change while we're reading them, the loop enlarges the buffer - // until proc_pidinfo says the result fitted. - var buf unsafe.Pointer - defer func() { - if buf != nil { - C.free(buf) - } - }() - for buflen := rlen; ; buflen *= 2 { - buf, err = C.reallocf(buf, C.size_t(buflen)) - if buf == nil { - return 0, err - } - rlen, err = C.proc_pidinfo(pid, C.PROC_PIDLISTFDS, 0, buf, buflen) - if rlen <= 0 { - return 0, err - } else if rlen == buflen { - continue - } - return int(rlen / C.PROC_PIDLISTFD_SIZE), nil - } - panic("unreachable") -} diff --git a/fdtrack/fdusage_linux.go b/fdtrack/fdusage_linux.go deleted file mode 100644 index d9a856a0c..000000000 --- a/fdtrack/fdusage_linux.go +++ /dev/null @@ -1,53 +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 linux - -package fdtrack - -import ( - "io" - "os" - "syscall" -) - -func fdlimit() int { - var nofile syscall.Rlimit - if err := syscall.Getrlimit(syscall.RLIMIT_NOFILE, &nofile); err != nil { - return 0 - } - return int(nofile.Cur) -} - -func fdusage() (int, error) { - f, err := os.Open("/proc/self/fd") - if err != nil { - return 0, err - } - defer f.Close() - const batchSize = 100 - n := 0 - for { - list, err := f.Readdirnames(batchSize) - n += len(list) - if err == io.EOF { - break - } else if err != nil { - return 0, err - } - } - return n, nil -} diff --git a/p2p/dial.go b/p2p/dial.go index 8b210bacd..0fd3a4cf5 100644 --- a/p2p/dial.go +++ b/p2p/dial.go @@ -23,7 +23,6 @@ import ( "net" "time" - "github.com/ethereum/go-ethereum/fdtrack" "github.com/ethereum/go-ethereum/logger" "github.com/ethereum/go-ethereum/logger/glog" "github.com/ethereum/go-ethereum/p2p/discover" @@ -213,7 +212,6 @@ func (t *dialTask) Do(srv *Server) { glog.V(logger.Detail).Infof("dial error: %v", err) return } - fd = fdtrack.WrapConn("p2p", fd) mfd := newMeteredConn(fd, false) srv.setupConn(mfd, t.flags, t.dest) diff --git a/p2p/discover/udp.go b/p2p/discover/udp.go index 008e63937..e98e8d0ba 100644 --- a/p2p/discover/udp.go +++ b/p2p/discover/udp.go @@ -26,7 +26,6 @@ import ( "time" "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/fdtrack" "github.com/ethereum/go-ethereum/logger" "github.com/ethereum/go-ethereum/logger/glog" "github.com/ethereum/go-ethereum/p2p/nat" @@ -200,7 +199,6 @@ func ListenUDP(priv *ecdsa.PrivateKey, laddr string, natm nat.Interface, nodeDBP if err != nil { return nil, err } - fdtrack.Open("p2p") conn, err := net.ListenUDP("udp", addr) if err != nil { return nil, err @@ -238,7 +236,6 @@ func newUDP(priv *ecdsa.PrivateKey, c conn, natm nat.Interface, nodeDBPath strin func (t *udp) close() { close(t.closing) - fdtrack.Close("p2p") t.conn.Close() // TODO: wait for the loops to end. } diff --git a/p2p/metrics.go b/p2p/metrics.go index 8ee4ed04b..f98cac274 100644 --- a/p2p/metrics.go +++ b/p2p/metrics.go @@ -34,7 +34,7 @@ var ( // meteredConn is a wrapper around a network TCP connection that meters both the // inbound and outbound network traffic. type meteredConn struct { - net.Conn + *net.TCPConn // Network connection to wrap with metering } // newMeteredConn creates a new metered connection, also bumping the ingress or @@ -45,13 +45,13 @@ func newMeteredConn(conn net.Conn, ingress bool) net.Conn { } else { egressConnectMeter.Mark(1) } - return &meteredConn{conn} + return &meteredConn{conn.(*net.TCPConn)} } // Read delegates a network read to the underlying connection, bumping the ingress // traffic meter along the way. func (c *meteredConn) Read(b []byte) (n int, err error) { - n, err = c.Conn.Read(b) + n, err = c.TCPConn.Read(b) ingressTrafficMeter.Mark(int64(n)) return } @@ -59,7 +59,7 @@ func (c *meteredConn) Read(b []byte) (n int, err error) { // Write delegates a network write to the underlying connection, bumping the // egress traffic meter along the way. func (c *meteredConn) Write(b []byte) (n int, err error) { - n, err = c.Conn.Write(b) + n, err = c.TCPConn.Write(b) egressTrafficMeter.Mark(int64(n)) return } diff --git a/p2p/server.go b/p2p/server.go index 7351a2654..ba83c5503 100644 --- a/p2p/server.go +++ b/p2p/server.go @@ -25,7 +25,6 @@ import ( "sync" "time" - "github.com/ethereum/go-ethereum/fdtrack" "github.com/ethereum/go-ethereum/logger" "github.com/ethereum/go-ethereum/logger/glog" "github.com/ethereum/go-ethereum/p2p/discover" @@ -373,7 +372,7 @@ func (srv *Server) startListening() error { } laddr := listener.Addr().(*net.TCPAddr) srv.ListenAddr = laddr.String() - srv.listener = fdtrack.WrapListener("p2p", listener) + srv.listener = listener srv.loopWG.Add(1) go srv.listenLoop() // Map the TCP listening port if NAT is configured. diff --git a/rpc/comms/http.go b/rpc/comms/http.go index c08b744a1..c165aa27e 100644 --- a/rpc/comms/http.go +++ b/rpc/comms/http.go @@ -29,7 +29,6 @@ import ( "io" "io/ioutil" - "github.com/ethereum/go-ethereum/fdtrack" "github.com/ethereum/go-ethereum/logger" "github.com/ethereum/go-ethereum/logger/glog" "github.com/ethereum/go-ethereum/rpc/codec" @@ -178,7 +177,6 @@ func listenHTTP(addr string, h http.Handler) (*stopServer, error) { if err != nil { return nil, err } - l = fdtrack.WrapListener("rpc", l) s := &stopServer{l: l, idle: make(map[net.Conn]struct{})} s.Server = &http.Server{ Addr: addr, diff --git a/rpc/comms/ipc_unix.go b/rpc/comms/ipc_unix.go index 6968fa844..24aefa5f3 100644 --- a/rpc/comms/ipc_unix.go +++ b/rpc/comms/ipc_unix.go @@ -22,7 +22,6 @@ import ( "net" "os" - "github.com/ethereum/go-ethereum/fdtrack" "github.com/ethereum/go-ethereum/logger" "github.com/ethereum/go-ethereum/logger/glog" "github.com/ethereum/go-ethereum/rpc/codec" @@ -51,16 +50,15 @@ func (self *ipcClient) reconnect() error { func startIpc(cfg IpcConfig, codec codec.Codec, initializer func(conn net.Conn) (shared.EthereumApi, error)) error { os.Remove(cfg.Endpoint) // in case it still exists from a previous run - l, err := net.Listen("unix", cfg.Endpoint) + l, err := net.ListenUnix("unix", &net.UnixAddr{Name: cfg.Endpoint, Net: "unix"}) if err != nil { return err } - l = fdtrack.WrapListener("ipc", l) os.Chmod(cfg.Endpoint, 0600) go func() { for { - conn, err := l.Accept() + conn, err := l.AcceptUnix() if err != nil { glog.V(logger.Error).Infof("Error accepting ipc connection - %v\n", err) continue