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 3f4606af0f..862c3def42 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 786ce6fa84..815610734c 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 b165c784e3..8ce4e8342e 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 6d44f74b38..46cc9d0701 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 2dc3c438f6..07c4daf60c 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 2f5ab57f44..0000000000
--- 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 689625a8f5..0000000000
--- 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 04a3a9baf7..0000000000
--- 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 d9a856a0ca..0000000000
--- 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 8b210bacd2..0fd3a4cf52 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 008e63937d..e98e8d0ba6 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 8ee4ed04b6..f98cac2742 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 7351a26544..ba83c55035 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 c08b744a13..c165aa27e1 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 6968fa8447..24aefa5f34 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