Merge pull request #1694 from obscuren/hide-fdtrack
fdtrack: hide message
This commit is contained in:
		
							
								
								
									
										4
									
								
								Godeps/_workspace/src/github.com/huin/goupnp/httpu/httpu.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								Godeps/_workspace/src/github.com/huin/goupnp/httpu/httpu.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -9,8 +9,6 @@ import (
 | 
				
			|||||||
	"net/http"
 | 
						"net/http"
 | 
				
			||||||
	"sync"
 | 
						"sync"
 | 
				
			||||||
	"time"
 | 
						"time"
 | 
				
			||||||
 | 
					 | 
				
			||||||
	"github.com/ethereum/go-ethereum/fdtrack"
 | 
					 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// HTTPUClient is a client for dealing with HTTPU (HTTP over UDP). Its typical
 | 
					// HTTPUClient is a client for dealing with HTTPU (HTTP over UDP). Its typical
 | 
				
			||||||
@@ -27,7 +25,6 @@ func NewHTTPUClient() (*HTTPUClient, error) {
 | 
				
			|||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	fdtrack.Open("upnp")
 | 
					 | 
				
			||||||
	return &HTTPUClient{conn: conn}, nil
 | 
						return &HTTPUClient{conn: conn}, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -36,7 +33,6 @@ func NewHTTPUClient() (*HTTPUClient, error) {
 | 
				
			|||||||
func (httpu *HTTPUClient) Close() error {
 | 
					func (httpu *HTTPUClient) Close() error {
 | 
				
			||||||
	httpu.connLock.Lock()
 | 
						httpu.connLock.Lock()
 | 
				
			||||||
	defer httpu.connLock.Unlock()
 | 
						defer httpu.connLock.Unlock()
 | 
				
			||||||
	fdtrack.Close("upnp")
 | 
					 | 
				
			||||||
	return httpu.conn.Close()
 | 
						return httpu.conn.Close()
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										14
									
								
								Godeps/_workspace/src/github.com/huin/goupnp/soap/soap.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										14
									
								
								Godeps/_workspace/src/github.com/huin/goupnp/soap/soap.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -7,12 +7,9 @@ import (
 | 
				
			|||||||
	"encoding/xml"
 | 
						"encoding/xml"
 | 
				
			||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
	"io/ioutil"
 | 
						"io/ioutil"
 | 
				
			||||||
	"net"
 | 
					 | 
				
			||||||
	"net/http"
 | 
						"net/http"
 | 
				
			||||||
	"net/url"
 | 
						"net/url"
 | 
				
			||||||
	"reflect"
 | 
						"reflect"
 | 
				
			||||||
 | 
					 | 
				
			||||||
	"github.com/ethereum/go-ethereum/fdtrack"
 | 
					 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const (
 | 
					const (
 | 
				
			||||||
@@ -29,17 +26,6 @@ type SOAPClient struct {
 | 
				
			|||||||
func NewSOAPClient(endpointURL url.URL) *SOAPClient {
 | 
					func NewSOAPClient(endpointURL url.URL) *SOAPClient {
 | 
				
			||||||
	return &SOAPClient{
 | 
						return &SOAPClient{
 | 
				
			||||||
		EndpointURL: endpointURL,
 | 
							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
 | 
					 | 
				
			||||||
				},
 | 
					 | 
				
			||||||
			},
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										4
									
								
								Godeps/_workspace/src/github.com/jackpal/go-nat-pmp/natpmp.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								Godeps/_workspace/src/github.com/jackpal/go-nat-pmp/natpmp.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -5,8 +5,6 @@ import (
 | 
				
			|||||||
	"log"
 | 
						"log"
 | 
				
			||||||
	"net"
 | 
						"net"
 | 
				
			||||||
	"time"
 | 
						"time"
 | 
				
			||||||
 | 
					 | 
				
			||||||
	"github.com/ethereum/go-ethereum/fdtrack"
 | 
					 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Implement the NAT-PMP protocol, typically supported by Apple routers and open source
 | 
					// 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 {
 | 
						if err != nil {
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	fdtrack.Open("natpmp")
 | 
					 | 
				
			||||||
	defer fdtrack.Close("natpmp")
 | 
					 | 
				
			||||||
	defer conn.Close()
 | 
						defer conn.Close()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	result = make([]byte, resultSize)
 | 
						result = make([]byte, resultSize)
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										5
									
								
								Godeps/_workspace/src/github.com/syndtr/goleveldb/leveldb/storage/file_storage.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										5
									
								
								Godeps/_workspace/src/github.com/syndtr/goleveldb/leveldb/storage/file_storage.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -18,7 +18,6 @@ import (
 | 
				
			|||||||
	"sync"
 | 
						"sync"
 | 
				
			||||||
	"time"
 | 
						"time"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/ethereum/go-ethereum/fdtrack"
 | 
					 | 
				
			||||||
	"github.com/syndtr/goleveldb/leveldb/util"
 | 
						"github.com/syndtr/goleveldb/leveldb/util"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -370,8 +369,6 @@ func (fw fileWrap) Close() error {
 | 
				
			|||||||
	err := fw.File.Close()
 | 
						err := fw.File.Close()
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		f.fs.log(fmt.Sprintf("close %s.%d: %v", f.Type(), f.Num(), err))
 | 
							f.fs.log(fmt.Sprintf("close %s.%d: %v", f.Type(), f.Num(), err))
 | 
				
			||||||
	} else {
 | 
					 | 
				
			||||||
		fdtrack.Close("leveldb")
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return err
 | 
						return err
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -403,7 +400,6 @@ func (f *file) Open() (Reader, error) {
 | 
				
			|||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
ok:
 | 
					ok:
 | 
				
			||||||
	fdtrack.Open("leveldb")
 | 
					 | 
				
			||||||
	f.open = true
 | 
						f.open = true
 | 
				
			||||||
	f.fs.open++
 | 
						f.fs.open++
 | 
				
			||||||
	return fileWrap{of, f}, nil
 | 
						return fileWrap{of, f}, nil
 | 
				
			||||||
@@ -422,7 +418,6 @@ func (f *file) Create() (Writer, error) {
 | 
				
			|||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	fdtrack.Open("leveldb")
 | 
					 | 
				
			||||||
	f.open = true
 | 
						f.open = true
 | 
				
			||||||
	f.fs.open++
 | 
						f.fs.open++
 | 
				
			||||||
	return fileWrap{of, f}, nil
 | 
						return fileWrap{of, f}, nil
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -37,7 +37,6 @@ import (
 | 
				
			|||||||
	"github.com/ethereum/go-ethereum/core/types"
 | 
						"github.com/ethereum/go-ethereum/core/types"
 | 
				
			||||||
	"github.com/ethereum/go-ethereum/eth"
 | 
						"github.com/ethereum/go-ethereum/eth"
 | 
				
			||||||
	"github.com/ethereum/go-ethereum/ethdb"
 | 
						"github.com/ethereum/go-ethereum/ethdb"
 | 
				
			||||||
	"github.com/ethereum/go-ethereum/fdtrack"
 | 
					 | 
				
			||||||
	"github.com/ethereum/go-ethereum/logger"
 | 
						"github.com/ethereum/go-ethereum/logger"
 | 
				
			||||||
	"github.com/ethereum/go-ethereum/logger/glog"
 | 
						"github.com/ethereum/go-ethereum/logger/glog"
 | 
				
			||||||
	"github.com/ethereum/go-ethereum/metrics"
 | 
						"github.com/ethereum/go-ethereum/metrics"
 | 
				
			||||||
@@ -546,9 +545,6 @@ func startEth(ctx *cli.Context, eth *eth.Ethereum) {
 | 
				
			|||||||
	// Start Ethereum itself
 | 
						// Start Ethereum itself
 | 
				
			||||||
	utils.StartEthereum(eth)
 | 
						utils.StartEthereum(eth)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Start logging file descriptor stats.
 | 
					 | 
				
			||||||
	fdtrack.Start()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	am := eth.AccountManager()
 | 
						am := eth.AccountManager()
 | 
				
			||||||
	account := ctx.GlobalString(utils.UnlockedAccountFlag.Name)
 | 
						account := ctx.GlobalString(utils.UnlockedAccountFlag.Name)
 | 
				
			||||||
	accounts := strings.Split(account, " ")
 | 
						accounts := strings.Split(account, " ")
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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 <http://www.gnu.org/licenses/>.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// 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)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}()
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@@ -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 <http://www.gnu.org/licenses/>.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// +build !linux,!darwin
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
package fdtrack
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import "errors"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func fdlimit() int {
 | 
					 | 
				
			||||||
	return 0
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func fdusage() (int, error) {
 | 
					 | 
				
			||||||
	return 0, errors.New("not implemented")
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@@ -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 <http://www.gnu.org/licenses/>.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// +build darwin
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
package fdtrack
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import (
 | 
					 | 
				
			||||||
	"os"
 | 
					 | 
				
			||||||
	"syscall"
 | 
					 | 
				
			||||||
	"unsafe"
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// #cgo CFLAGS: -lproc
 | 
					 | 
				
			||||||
// #include <libproc.h>
 | 
					 | 
				
			||||||
// #include <stdlib.h>
 | 
					 | 
				
			||||||
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")
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@@ -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 <http://www.gnu.org/licenses/>.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// +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
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@@ -23,7 +23,6 @@ import (
 | 
				
			|||||||
	"net"
 | 
						"net"
 | 
				
			||||||
	"time"
 | 
						"time"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/ethereum/go-ethereum/fdtrack"
 | 
					 | 
				
			||||||
	"github.com/ethereum/go-ethereum/logger"
 | 
						"github.com/ethereum/go-ethereum/logger"
 | 
				
			||||||
	"github.com/ethereum/go-ethereum/logger/glog"
 | 
						"github.com/ethereum/go-ethereum/logger/glog"
 | 
				
			||||||
	"github.com/ethereum/go-ethereum/p2p/discover"
 | 
						"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)
 | 
							glog.V(logger.Detail).Infof("dial error: %v", err)
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	fd = fdtrack.WrapConn("p2p", fd)
 | 
					 | 
				
			||||||
	mfd := newMeteredConn(fd, false)
 | 
						mfd := newMeteredConn(fd, false)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	srv.setupConn(mfd, t.flags, t.dest)
 | 
						srv.setupConn(mfd, t.flags, t.dest)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -26,7 +26,6 @@ import (
 | 
				
			|||||||
	"time"
 | 
						"time"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/ethereum/go-ethereum/crypto"
 | 
						"github.com/ethereum/go-ethereum/crypto"
 | 
				
			||||||
	"github.com/ethereum/go-ethereum/fdtrack"
 | 
					 | 
				
			||||||
	"github.com/ethereum/go-ethereum/logger"
 | 
						"github.com/ethereum/go-ethereum/logger"
 | 
				
			||||||
	"github.com/ethereum/go-ethereum/logger/glog"
 | 
						"github.com/ethereum/go-ethereum/logger/glog"
 | 
				
			||||||
	"github.com/ethereum/go-ethereum/p2p/nat"
 | 
						"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 {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	fdtrack.Open("p2p")
 | 
					 | 
				
			||||||
	conn, err := net.ListenUDP("udp", addr)
 | 
						conn, err := net.ListenUDP("udp", addr)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
@@ -238,7 +236,6 @@ func newUDP(priv *ecdsa.PrivateKey, c conn, natm nat.Interface, nodeDBPath strin
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
func (t *udp) close() {
 | 
					func (t *udp) close() {
 | 
				
			||||||
	close(t.closing)
 | 
						close(t.closing)
 | 
				
			||||||
	fdtrack.Close("p2p")
 | 
					 | 
				
			||||||
	t.conn.Close()
 | 
						t.conn.Close()
 | 
				
			||||||
	// TODO: wait for the loops to end.
 | 
						// TODO: wait for the loops to end.
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -34,7 +34,7 @@ var (
 | 
				
			|||||||
// meteredConn is a wrapper around a network TCP connection that meters both the
 | 
					// meteredConn is a wrapper around a network TCP connection that meters both the
 | 
				
			||||||
// inbound and outbound network traffic.
 | 
					// inbound and outbound network traffic.
 | 
				
			||||||
type meteredConn struct {
 | 
					type meteredConn struct {
 | 
				
			||||||
	net.Conn
 | 
						*net.TCPConn // Network connection to wrap with metering
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// newMeteredConn creates a new metered connection, also bumping the ingress or
 | 
					// 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 {
 | 
						} else {
 | 
				
			||||||
		egressConnectMeter.Mark(1)
 | 
							egressConnectMeter.Mark(1)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return &meteredConn{conn}
 | 
						return &meteredConn{conn.(*net.TCPConn)}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Read delegates a network read to the underlying connection, bumping the ingress
 | 
					// Read delegates a network read to the underlying connection, bumping the ingress
 | 
				
			||||||
// traffic meter along the way.
 | 
					// traffic meter along the way.
 | 
				
			||||||
func (c *meteredConn) Read(b []byte) (n int, err error) {
 | 
					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))
 | 
						ingressTrafficMeter.Mark(int64(n))
 | 
				
			||||||
	return
 | 
						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
 | 
					// Write delegates a network write to the underlying connection, bumping the
 | 
				
			||||||
// egress traffic meter along the way.
 | 
					// egress traffic meter along the way.
 | 
				
			||||||
func (c *meteredConn) Write(b []byte) (n int, err error) {
 | 
					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))
 | 
						egressTrafficMeter.Mark(int64(n))
 | 
				
			||||||
	return
 | 
						return
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -25,7 +25,6 @@ import (
 | 
				
			|||||||
	"sync"
 | 
						"sync"
 | 
				
			||||||
	"time"
 | 
						"time"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/ethereum/go-ethereum/fdtrack"
 | 
					 | 
				
			||||||
	"github.com/ethereum/go-ethereum/logger"
 | 
						"github.com/ethereum/go-ethereum/logger"
 | 
				
			||||||
	"github.com/ethereum/go-ethereum/logger/glog"
 | 
						"github.com/ethereum/go-ethereum/logger/glog"
 | 
				
			||||||
	"github.com/ethereum/go-ethereum/p2p/discover"
 | 
						"github.com/ethereum/go-ethereum/p2p/discover"
 | 
				
			||||||
@@ -373,7 +372,7 @@ func (srv *Server) startListening() error {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
	laddr := listener.Addr().(*net.TCPAddr)
 | 
						laddr := listener.Addr().(*net.TCPAddr)
 | 
				
			||||||
	srv.ListenAddr = laddr.String()
 | 
						srv.ListenAddr = laddr.String()
 | 
				
			||||||
	srv.listener = fdtrack.WrapListener("p2p", listener)
 | 
						srv.listener = listener
 | 
				
			||||||
	srv.loopWG.Add(1)
 | 
						srv.loopWG.Add(1)
 | 
				
			||||||
	go srv.listenLoop()
 | 
						go srv.listenLoop()
 | 
				
			||||||
	// Map the TCP listening port if NAT is configured.
 | 
						// Map the TCP listening port if NAT is configured.
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -29,7 +29,6 @@ import (
 | 
				
			|||||||
	"io"
 | 
						"io"
 | 
				
			||||||
	"io/ioutil"
 | 
						"io/ioutil"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/ethereum/go-ethereum/fdtrack"
 | 
					 | 
				
			||||||
	"github.com/ethereum/go-ethereum/logger"
 | 
						"github.com/ethereum/go-ethereum/logger"
 | 
				
			||||||
	"github.com/ethereum/go-ethereum/logger/glog"
 | 
						"github.com/ethereum/go-ethereum/logger/glog"
 | 
				
			||||||
	"github.com/ethereum/go-ethereum/rpc/codec"
 | 
						"github.com/ethereum/go-ethereum/rpc/codec"
 | 
				
			||||||
@@ -178,7 +177,6 @@ func listenHTTP(addr string, h http.Handler) (*stopServer, error) {
 | 
				
			|||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	l = fdtrack.WrapListener("rpc", l)
 | 
					 | 
				
			||||||
	s := &stopServer{l: l, idle: make(map[net.Conn]struct{})}
 | 
						s := &stopServer{l: l, idle: make(map[net.Conn]struct{})}
 | 
				
			||||||
	s.Server = &http.Server{
 | 
						s.Server = &http.Server{
 | 
				
			||||||
		Addr:         addr,
 | 
							Addr:         addr,
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -22,7 +22,6 @@ import (
 | 
				
			|||||||
	"net"
 | 
						"net"
 | 
				
			||||||
	"os"
 | 
						"os"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/ethereum/go-ethereum/fdtrack"
 | 
					 | 
				
			||||||
	"github.com/ethereum/go-ethereum/logger"
 | 
						"github.com/ethereum/go-ethereum/logger"
 | 
				
			||||||
	"github.com/ethereum/go-ethereum/logger/glog"
 | 
						"github.com/ethereum/go-ethereum/logger/glog"
 | 
				
			||||||
	"github.com/ethereum/go-ethereum/rpc/codec"
 | 
						"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 {
 | 
					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
 | 
						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 {
 | 
						if err != nil {
 | 
				
			||||||
		return err
 | 
							return err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	l = fdtrack.WrapListener("ipc", l)
 | 
					 | 
				
			||||||
	os.Chmod(cfg.Endpoint, 0600)
 | 
						os.Chmod(cfg.Endpoint, 0600)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	go func() {
 | 
						go func() {
 | 
				
			||||||
		for {
 | 
							for {
 | 
				
			||||||
			conn, err := l.Accept()
 | 
								conn, err := l.AcceptUnix()
 | 
				
			||||||
			if err != nil {
 | 
								if err != nil {
 | 
				
			||||||
				glog.V(logger.Error).Infof("Error accepting ipc connection - %v\n", err)
 | 
									glog.V(logger.Error).Infof("Error accepting ipc connection - %v\n", err)
 | 
				
			||||||
				continue
 | 
									continue
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user