From 7ee49c32b70b0bd3e9709865c0b9c43d16c8f18c Mon Sep 17 00:00:00 2001
From: obscuren <geffobscura@gmail.com>
Date: Thu, 24 Jul 2014 17:10:54 +0200
Subject: Added update method and general service timer

* disable catching up if no block received for longer than 10 seconds
---
 peer.go | 29 +++++++++++++++++++++++++----
 1 file changed, 25 insertions(+), 4 deletions(-)

(limited to 'peer.go')

diff --git a/peer.go b/peer.go
index c73617ed5..ffba695ca 100644
--- a/peer.go
+++ b/peer.go
@@ -121,7 +121,8 @@ type Peer struct {
 	versionKnown bool
 
 	// Last received pong message
-	lastPong int64
+	lastPong          int64
+	lastBlockReceived time.Time
 
 	host []byte
 	port uint16
@@ -408,10 +409,7 @@ func (p *Peer) HandleInbound() {
 				for i := msg.Data.Len() - 1; i >= 0; i-- {
 					block = ethchain.NewBlockFromRlpValue(msg.Data.Get(i))
 
-					//p.ethereum.StateManager().PrepareDefault(block)
-					//state := p.ethereum.StateManager().CurrentState()
 					err = p.ethereum.StateManager().Process(block, false)
-
 					if err != nil {
 						if ethutil.Config.Debug {
 							peerlogger.Infof("Block %x failed\n", block.Hash())
@@ -422,6 +420,8 @@ func (p *Peer) HandleInbound() {
 					} else {
 						lastBlock = block
 					}
+
+					p.lastBlockReceived = time.Now()
 				}
 
 				if msg.Data.Len() <= 1 {
@@ -561,6 +561,25 @@ func (p *Peer) HandleInbound() {
 	p.Stop()
 }
 
+// General update method
+func (self *Peer) update() {
+	serviceTimer := time.NewTicker(5 * time.Second)
+
+out:
+	for {
+		select {
+		case <-serviceTimer.C:
+			if time.Since(self.lastBlockReceived) > 10*time.Second {
+				self.catchingUp = false
+			}
+		case <-self.quit:
+			break out
+		}
+	}
+
+	serviceTimer.Stop()
+}
+
 func (p *Peer) Start() {
 	peerHost, peerPort, _ := net.SplitHostPort(p.conn.LocalAddr().String())
 	servHost, servPort, _ := net.SplitHostPort(p.conn.RemoteAddr().String())
@@ -583,6 +602,8 @@ func (p *Peer) Start() {
 	go p.HandleOutbound()
 	// Run the inbound handler in a new goroutine
 	go p.HandleInbound()
+	// Run the general update handler
+	go p.update()
 
 	// Wait a few seconds for startup and then ask for an initial ping
 	time.Sleep(2 * time.Second)
-- 
cgit v1.2.3