1
0
mirror of https://github.com/v2fly/v2ray-core.git synced 2024-12-22 10:08:15 -05:00

configuration for connection reuse

This commit is contained in:
v2ray 2016-06-02 01:49:25 +02:00
parent 6ce7b1d532
commit a86cd36ad2
9 changed files with 124 additions and 7 deletions

View File

@ -5,6 +5,7 @@ import (
"github.com/v2ray/v2ray-core/app/router" "github.com/v2ray/v2ray-core/app/router"
"github.com/v2ray/v2ray-core/common/log" "github.com/v2ray/v2ray-core/common/log"
v2net "github.com/v2ray/v2ray-core/common/net" v2net "github.com/v2ray/v2ray-core/common/net"
"github.com/v2ray/v2ray-core/transport"
) )
type ConnectionConfig struct { type ConnectionConfig struct {
@ -55,6 +56,7 @@ type Config struct {
OutboundConfig *ConnectionConfig OutboundConfig *ConnectionConfig
InboundDetours []*InboundDetourConfig InboundDetours []*InboundDetourConfig
OutboundDetours []*OutboundDetourConfig OutboundDetours []*OutboundDetourConfig
TransportConfig *transport.Config
} }
type ConfigLoader func(init string) (*Config, error) type ConfigLoader func(init string) (*Config, error)

View File

@ -13,6 +13,7 @@ import (
"github.com/v2ray/v2ray-core/app/router" "github.com/v2ray/v2ray-core/app/router"
"github.com/v2ray/v2ray-core/common/log" "github.com/v2ray/v2ray-core/common/log"
v2net "github.com/v2ray/v2ray-core/common/net" v2net "github.com/v2ray/v2ray-core/common/net"
"github.com/v2ray/v2ray-core/transport"
) )
const ( const (
@ -30,6 +31,7 @@ func (this *Config) UnmarshalJSON(data []byte) error {
OutboundConfig *ConnectionConfig `json:"outbound"` OutboundConfig *ConnectionConfig `json:"outbound"`
InboundDetours []*InboundDetourConfig `json:"inboundDetour"` InboundDetours []*InboundDetourConfig `json:"inboundDetour"`
OutboundDetours []*OutboundDetourConfig `json:"outboundDetour"` OutboundDetours []*OutboundDetourConfig `json:"outboundDetour"`
Transport *transport.Config `json:"transport"`
} }
jsonConfig := new(JsonConfig) jsonConfig := new(JsonConfig)
if err := json.Unmarshal(data, jsonConfig); err != nil { if err := json.Unmarshal(data, jsonConfig); err != nil {
@ -57,6 +59,7 @@ func (this *Config) UnmarshalJSON(data []byte) error {
} }
} }
this.DNSConfig = jsonConfig.DNSConfig this.DNSConfig = jsonConfig.DNSConfig
this.TransportConfig = jsonConfig.Transport
return nil return nil
} }

View File

@ -16,6 +16,7 @@ import (
"github.com/v2ray/v2ray-core/common/retry" "github.com/v2ray/v2ray-core/common/retry"
"github.com/v2ray/v2ray-core/proxy" "github.com/v2ray/v2ray-core/proxy"
proxyrepo "github.com/v2ray/v2ray-core/proxy/repo" proxyrepo "github.com/v2ray/v2ray-core/proxy/repo"
"github.com/v2ray/v2ray-core/transport"
) )
// Point shell of V2Ray. // Point shell of V2Ray.
@ -38,6 +39,10 @@ func NewPoint(pConfig *Config) (*Point, error) {
vpoint.port = pConfig.Port vpoint.port = pConfig.Port
vpoint.listen = pConfig.ListenOn vpoint.listen = pConfig.ListenOn
if pConfig.TransportConfig != nil {
transport.ApplyConfig(pConfig.TransportConfig)
}
if pConfig.LogConfig != nil { if pConfig.LogConfig != nil {
logConfig := pConfig.LogConfig logConfig := pConfig.LogConfig
if len(logConfig.AccessLog) > 0 { if len(logConfig.AccessLog) > 0 {

16
transport/config.go Normal file
View File

@ -0,0 +1,16 @@
package transport
type StreamType int
const (
StreamTypeTCP = StreamType(0)
)
type TCPConfig struct {
ConnectionReuse bool
}
type Config struct {
StreamType StreamType
TCPConfig *TCPConfig
}

36
transport/config_json.go Normal file
View File

@ -0,0 +1,36 @@
// +build json
package transport
import (
"encoding/json"
"strings"
)
func (this *Config) UnmarshalJSON(data []byte) error {
type TypeConfig struct {
StreamType string `json:"streamType"`
Settings json.RawMessage `json:"settings"`
}
type JsonTCPConfig struct {
ConnectionReuse bool `json:"connectionReuse"`
}
typeConfig := new(TypeConfig)
if err := json.Unmarshal(data, typeConfig); err != nil {
return err
}
streamType := strings.ToLower(typeConfig.StreamType)
if streamType == "tcp" {
jsonTCPConfig := new(JsonTCPConfig)
if err := json.Unmarshal(data, jsonTCPConfig); err != nil {
return err
}
this.TCPConfig = &TCPConfig{
ConnectionReuse: jsonTCPConfig.ConnectionReuse,
}
}
return nil
}

View File

@ -3,6 +3,8 @@ package hub
import ( import (
"net" "net"
"time" "time"
"github.com/v2ray/v2ray-core/transport"
) )
type ConnectionHandler func(*Connection) type ConnectionHandler func(*Connection)
@ -37,7 +39,7 @@ func (this *Connection) Close() error {
if this == nil || this.conn == nil { if this == nil || this.conn == nil {
return ErrorClosedConnection return ErrorClosedConnection
} }
if this.Reusable() { if transport.TCPStreamConfig.ConnectionReuse && this.Reusable() {
this.listener.Recycle(this.dest, this.conn) this.listener.Recycle(this.dest, this.conn)
return nil return nil
} }

View File

@ -3,9 +3,33 @@ package hub
import ( import (
"net" "net"
"sync" "sync"
"sync/atomic"
"time" "time"
) )
type Once struct {
m sync.Mutex
done uint32
}
func (o *Once) Do(f func()) {
if atomic.LoadUint32(&o.done) == 1 {
return
}
o.m.Lock()
defer o.m.Unlock()
if o.done == 0 {
defer atomic.StoreUint32(&o.done, 1)
f()
}
}
func (o *Once) Reset() {
o.m.Lock()
defer o.m.Unlock()
atomic.StoreUint32(&o.done, 0)
}
type AwaitingConnection struct { type AwaitingConnection struct {
conn net.Conn conn net.Conn
expire time.Time expire time.Time
@ -18,18 +42,19 @@ func (this *AwaitingConnection) Expired() bool {
type ConnectionCache struct { type ConnectionCache struct {
sync.Mutex sync.Mutex
cache map[string][]*AwaitingConnection cache map[string][]*AwaitingConnection
cleanupOnce Once
} }
func NewConnectionCache() *ConnectionCache { func NewConnectionCache() *ConnectionCache {
c := &ConnectionCache{ return &ConnectionCache{
cache: make(map[string][]*AwaitingConnection), cache: make(map[string][]*AwaitingConnection),
} }
go c.Cleanup()
return c
} }
func (this *ConnectionCache) Cleanup() { func (this *ConnectionCache) Cleanup() {
for { defer this.cleanupOnce.Reset()
for len(this.cache) > 0 {
time.Sleep(time.Second * 4) time.Sleep(time.Second * 4)
this.Lock() this.Lock()
for key, value := range this.cache { for key, value := range this.cache {
@ -74,6 +99,8 @@ func (this *ConnectionCache) Recycle(dest string, conn net.Conn) {
list = []*AwaitingConnection{aconn} list = []*AwaitingConnection{aconn}
} }
this.cache[dest] = list this.cache[dest] = list
go this.cleanupOnce.Do(this.Cleanup)
} }
func FindFirstValid(list []*AwaitingConnection) int { func FindFirstValid(list []*AwaitingConnection) int {

View File

@ -7,6 +7,7 @@ import (
"github.com/v2ray/v2ray-core/common/log" "github.com/v2ray/v2ray-core/common/log"
v2net "github.com/v2ray/v2ray-core/common/net" v2net "github.com/v2ray/v2ray-core/common/net"
"github.com/v2ray/v2ray-core/transport"
) )
var ( var (
@ -17,7 +18,10 @@ var (
func Dial(dest v2net.Destination) (*Connection, error) { func Dial(dest v2net.Destination) (*Connection, error) {
destStr := dest.String() destStr := dest.String()
conn := globalCache.Get(destStr) var conn net.Conn
if transport.TCPStreamConfig.ConnectionReuse {
conn = globalCache.Get(destStr)
}
if conn == nil { if conn == nil {
var err error var err error
log.Debug("Hub: Dialling new connection to ", dest) log.Debug("Hub: Dialling new connection to ", dest)

22
transport/transport.go Normal file
View File

@ -0,0 +1,22 @@
package transport
import "github.com/v2ray/v2ray-core/common/log"
var (
TCPStreamConfig = &TCPConfig{
ConnectionReuse: false,
}
)
func ApplyConfig(config *Config) error {
if config.StreamType == StreamTypeTCP {
if config.TCPConfig != nil {
TCPStreamConfig = config.TCPConfig
if config.TCPConfig.ConnectionReuse {
log.Info("Transport: TCP connection reuse enabled.")
}
}
}
return nil
}