rearrange where we account for errors and data sent
This commit is contained in:
		
							
								
								
									
										101
									
								
								tunnel/link.go
									
									
									
									
									
								
							
							
						
						
									
										101
									
								
								tunnel/link.go
									
									
									
									
									
								
							| @@ -160,53 +160,11 @@ func (l *link) expiry() { | ||||
| } | ||||
|  | ||||
| func (l *link) send(m *transport.Message) error { | ||||
| 	dataSent := len(m.Body) | ||||
|  | ||||
| 	// set header length | ||||
| 	for k, v := range m.Header { | ||||
| 		dataSent += (len(k) + len(v)) | ||||
| 	if m.Header == nil { | ||||
| 		m.Header = make(map[string]string) | ||||
| 	} | ||||
|  | ||||
| 	// get time now | ||||
| 	now := time.Now() | ||||
|  | ||||
| 	// send the message | ||||
| 	err := l.Socket.Send(m) | ||||
|  | ||||
| 	l.Lock() | ||||
| 	defer l.Unlock() | ||||
|  | ||||
| 	// there's an error increment the counter and bail | ||||
| 	if err != nil { | ||||
| 		l.errCount++ | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	// reset the counter | ||||
| 	l.errCount = 0 | ||||
|  | ||||
| 	// calculate based on data | ||||
| 	if dataSent > 0 { | ||||
| 		// measure time taken | ||||
| 		delta := time.Since(now) | ||||
|  | ||||
| 		// bit sent | ||||
| 		bits := dataSent * 1024 | ||||
|  | ||||
| 		// rate of send in bits per nanosecond | ||||
| 		rate := float64(bits) / float64(delta.Nanoseconds()) | ||||
|  | ||||
| 		// default the rate if its zero | ||||
| 		if l.rate == 0 { | ||||
| 			// rate per second | ||||
| 			l.rate = rate * 1e9 | ||||
| 		} else { | ||||
| 			// set new rate per second | ||||
| 			l.rate = 0.8*l.rate + 0.2*(rate*1e9) | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return err | ||||
| 	return l.Socket.Send(m) | ||||
| } | ||||
|  | ||||
| // recv a message on the link | ||||
| @@ -214,9 +172,6 @@ func (l *link) recv(m *transport.Message) error { | ||||
| 	if m.Header == nil { | ||||
| 		m.Header = make(map[string]string) | ||||
| 	} | ||||
|  | ||||
| 	// TODO measure the receive latency if possible | ||||
|  | ||||
| 	// receive the transport message | ||||
| 	return l.Socket.Recv(m) | ||||
| } | ||||
| @@ -269,6 +224,10 @@ func (l *link) Send(m *transport.Message) error { | ||||
| 		status:  make(chan error, 1), | ||||
| 	} | ||||
|  | ||||
| 	// get time now | ||||
| 	now := time.Now() | ||||
|  | ||||
| 	// queue the message | ||||
| 	select { | ||||
| 	case <-l.closed: | ||||
| 		return io.EOF | ||||
| @@ -276,15 +235,57 @@ func (l *link) Send(m *transport.Message) error { | ||||
| 		// in the send queue | ||||
| 	} | ||||
|  | ||||
| 	// error to use | ||||
| 	var err error | ||||
|  | ||||
| 	// wait for response | ||||
| 	select { | ||||
| 	case <-l.closed: | ||||
| 		return io.EOF | ||||
| 	case err := <-p.status: | ||||
| 	case err = <-p.status: | ||||
| 	} | ||||
|  | ||||
| 	l.Lock() | ||||
| 	defer l.Unlock() | ||||
|  | ||||
| 	// there's an error increment the counter and bail | ||||
| 	if err != nil { | ||||
| 		l.errCount++ | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	// never reached | ||||
| 	// reset the counter | ||||
| 	l.errCount = 0 | ||||
|  | ||||
| 	// calculate the data sent | ||||
| 	dataSent := len(m.Body) | ||||
|  | ||||
| 	// set header length | ||||
| 	for k, v := range m.Header { | ||||
| 		dataSent += (len(k) + len(v)) | ||||
| 	} | ||||
|  | ||||
| 	// calculate based on data | ||||
| 	if dataSent > 0 { | ||||
| 		// measure time taken | ||||
| 		delta := time.Since(now) | ||||
|  | ||||
| 		// bit sent | ||||
| 		bits := dataSent * 1024 | ||||
|  | ||||
| 		// rate of send in bits per nanosecond | ||||
| 		rate := float64(bits) / float64(delta.Nanoseconds()) | ||||
|  | ||||
| 		// default the rate if its zero | ||||
| 		if l.rate == 0 { | ||||
| 			// rate per second | ||||
| 			l.rate = rate * 1e9 | ||||
| 		} else { | ||||
| 			// set new rate per second | ||||
| 			l.rate = 0.8*l.rate + 0.2*(rate*1e9) | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user