From 93625dd656bddf06e71e3b9bd7bf122f24483cbb Mon Sep 17 00:00:00 2001 From: V2Ray <admin@v2ray.com> Date: Tue, 13 Oct 2015 12:27:50 +0200 Subject: [PATCH] Add a retry mechanism --- common/retry/retry.go | 44 +++++++++++++++++++++++++++++++++++++++++++ point.go | 7 ++++--- 2 files changed, 48 insertions(+), 3 deletions(-) create mode 100644 common/retry/retry.go diff --git a/common/retry/retry.go b/common/retry/retry.go new file mode 100644 index 00000000..a13e5cd6 --- /dev/null +++ b/common/retry/retry.go @@ -0,0 +1,44 @@ +package retry + +import ( + "errors" + "time" +) + +var ( + RetryFailed = errors.New("All retry attempts failed.") +) + +type RetryStrategy interface { + On(func() error) error +} + +type retryer struct { + NextDelay func(int) int +} + +func (r *retryer) On(method func() error) error { + attempt := 0 + for { + err := method() + if err == nil { + return nil + } + delay := r.NextDelay(attempt) + if delay < 0 { + return RetryFailed + } + <-time.After(time.Duration(delay) * time.Millisecond) + } +} + +func Timed(attempts int, delay int) RetryStrategy { + return &retryer{ + NextDelay: func(attempt int) int { + if attempt >= attempts { + return -1 + } + return delay + }, + } +} diff --git a/point.go b/point.go index 65946c67..dbb74f3c 100644 --- a/point.go +++ b/point.go @@ -4,6 +4,7 @@ import ( "github.com/v2ray/v2ray-core/common/errors" "github.com/v2ray/v2ray-core/common/log" v2net "github.com/v2ray/v2ray-core/common/net" + "github.com/v2ray/v2ray-core/common/retry" "github.com/v2ray/v2ray-core/config" ) @@ -90,9 +91,9 @@ func (vp *Point) Start() error { return errors.NewBadConfigurationError() } - err := vp.ich.Listen(vp.port) - // TODO: handle error - return err + return retry.Timed(100 /* times */, 100 /* ms */).On(func() error { + return vp.ich.Listen(vp.port) + }) } func (p *Point) DispatchToOutbound(packet v2net.Packet) InboundRay {