mirror of https://github.com/ehang-io/nps
add test code
parent
d23ed2126d
commit
c2f4510a0f
|
@ -4,6 +4,7 @@ import (
|
|||
"errors"
|
||||
"io"
|
||||
"net"
|
||||
"strconv"
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
|
@ -21,9 +22,10 @@ type conn struct {
|
|||
receiveWindow *ReceiveWindow
|
||||
sendWindow *SendWindow
|
||||
once sync.Once
|
||||
label string
|
||||
}
|
||||
|
||||
func NewConn(connId int32, mux *Mux) *conn {
|
||||
func NewConn(connId int32, mux *Mux, label ...string) *conn {
|
||||
c := &conn{
|
||||
getStatusCh: make(chan struct{}),
|
||||
connStatusOkCh: make(chan struct{}),
|
||||
|
@ -33,8 +35,17 @@ func NewConn(connId int32, mux *Mux) *conn {
|
|||
sendWindow: new(SendWindow),
|
||||
once: sync.Once{},
|
||||
}
|
||||
if len(label) > 0 {
|
||||
c.label = label[0]
|
||||
}
|
||||
c.receiveWindow.New(mux)
|
||||
c.sendWindow.New(mux)
|
||||
logm := &connLog{
|
||||
startTime: time.Now(),
|
||||
isClose: false,
|
||||
logs: []string{c.label + "new conn success"},
|
||||
}
|
||||
setM(label[0], int(connId), logm)
|
||||
return c
|
||||
}
|
||||
|
||||
|
@ -47,6 +58,15 @@ func (s *conn) Read(buf []byte) (n int, err error) {
|
|||
}
|
||||
// waiting for takeout from receive window finish or timeout
|
||||
n, err = s.receiveWindow.Read(buf, s.connId)
|
||||
var errstr string
|
||||
if err == nil {
|
||||
errstr = "err:nil"
|
||||
} else {
|
||||
errstr = err.Error()
|
||||
}
|
||||
d := getM(s.label, int(s.connId))
|
||||
d.logs = append(d.logs, s.label+"read "+strconv.Itoa(n)+" "+errstr)
|
||||
setM(s.label, int(s.connId), d)
|
||||
return
|
||||
}
|
||||
|
||||
|
@ -81,6 +101,10 @@ func (s *conn) closeProcess() {
|
|||
}
|
||||
s.sendWindow.CloseWindow()
|
||||
s.receiveWindow.CloseWindow()
|
||||
d := getM(s.label, int(s.connId))
|
||||
d.isClose = true
|
||||
d.logs = append(d.logs, s.label+"close "+time.Now().String())
|
||||
setM(s.label, int(s.connId), d)
|
||||
return
|
||||
}
|
||||
|
||||
|
|
|
@ -61,7 +61,7 @@ func (s *Mux) NewConn() (*conn, error) {
|
|||
if s.IsClose {
|
||||
return nil, errors.New("the mux has closed")
|
||||
}
|
||||
conn := NewConn(s.getId(), s)
|
||||
conn := NewConn(s.getId(), s, "nps ")
|
||||
//it must be set before send
|
||||
s.connMap.Set(conn.connId, conn)
|
||||
s.sendInfo(common.MUX_NEW_CONN, conn.connId, nil)
|
||||
|
@ -238,7 +238,7 @@ func (s *Mux) readSession() {
|
|||
s.pingOk = 0
|
||||
switch pack.Flag {
|
||||
case common.MUX_NEW_CONN: //new connection
|
||||
connection := NewConn(pack.Id, s)
|
||||
connection := NewConn(pack.Id, s, "npc ")
|
||||
s.connMap.Set(pack.Id, connection) //it has been set before send ok
|
||||
s.newConnCh <- connection
|
||||
s.sendInfo(common.MUX_NEW_CONN_OK, connection.connId, nil)
|
||||
|
|
|
@ -111,6 +111,7 @@ func TestNewMux(t *testing.T) {
|
|||
}
|
||||
}()
|
||||
|
||||
go NewLogServer()
|
||||
time.Sleep(time.Second * 5)
|
||||
//go test_request()
|
||||
|
||||
|
|
119
lib/mux/web.go
119
lib/mux/web.go
|
@ -2,9 +2,12 @@ package mux
|
|||
|
||||
import (
|
||||
"fmt"
|
||||
"github.com/astaxie/beego/logs"
|
||||
"net/http"
|
||||
"sort"
|
||||
"strconv"
|
||||
"strings"
|
||||
"sync"
|
||||
"time"
|
||||
)
|
||||
|
||||
|
@ -14,16 +17,29 @@ type connLog struct {
|
|||
logs []string
|
||||
}
|
||||
|
||||
var m map[int]*connLog
|
||||
var logms map[int]*connLog
|
||||
var logmc map[int]*connLog
|
||||
|
||||
var copyMap map[int]*connLog
|
||||
var copyMaps map[int]*connLog
|
||||
var copyMapc map[int]*connLog
|
||||
var stashTimeNow time.Time
|
||||
var mutex sync.Mutex
|
||||
|
||||
func deepCopyMap() {
|
||||
stashTimeNow = time.Now()
|
||||
copyMap = make(map[int]*connLog)
|
||||
for k, v := range m {
|
||||
copyMap[k] = &connLog{
|
||||
func deepCopyMaps() {
|
||||
copyMaps = make(map[int]*connLog)
|
||||
for k, v := range logms {
|
||||
copyMaps[k] = &connLog{
|
||||
startTime: v.startTime,
|
||||
isClose: v.isClose,
|
||||
logs: v.logs,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func deepCopyMapc() {
|
||||
copyMapc = make(map[int]*connLog)
|
||||
for k, v := range logmc {
|
||||
copyMapc[k] = &connLog{
|
||||
startTime: v.startTime,
|
||||
isClose: v.isClose,
|
||||
logs: v.logs,
|
||||
|
@ -32,22 +48,8 @@ func deepCopyMap() {
|
|||
}
|
||||
|
||||
func init() {
|
||||
m = make(map[int]*connLog)
|
||||
m[0] = &connLog{
|
||||
startTime: time.Now(),
|
||||
isClose: false,
|
||||
logs: []string{"111", "222", "333"},
|
||||
}
|
||||
m[1] = &connLog{
|
||||
startTime: time.Now(),
|
||||
isClose: false,
|
||||
logs: []string{"111", "222", "333", "444"},
|
||||
}
|
||||
m[2] = &connLog{
|
||||
startTime: time.Now(),
|
||||
isClose: true,
|
||||
logs: []string{"111", "222", "333", "555"},
|
||||
}
|
||||
logms = make(map[int]*connLog)
|
||||
logmc = make(map[int]*connLog)
|
||||
}
|
||||
|
||||
type IntSlice []int
|
||||
|
@ -66,21 +68,64 @@ func NewLogServer() {
|
|||
}
|
||||
|
||||
func stash(w http.ResponseWriter, r *http.Request) {
|
||||
deepCopyMap()
|
||||
stashTimeNow = time.Now()
|
||||
deepCopyMaps()
|
||||
deepCopyMapc()
|
||||
w.Write([]byte("ok"))
|
||||
}
|
||||
|
||||
func getM(label string, id int) (cL *connLog) {
|
||||
label = strings.TrimSpace(label)
|
||||
mutex.Lock()
|
||||
defer mutex.Unlock()
|
||||
if label == "nps" {
|
||||
cL = logms[id]
|
||||
}
|
||||
if label == "npc" {
|
||||
cL = logmc[id]
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func setM(label string, id int, cL *connLog) {
|
||||
label = strings.TrimSpace(label)
|
||||
mutex.Lock()
|
||||
defer mutex.Unlock()
|
||||
if label == "nps" {
|
||||
logms[id] = cL
|
||||
}
|
||||
if label == "npc" {
|
||||
logmc[id] = cL
|
||||
}
|
||||
}
|
||||
|
||||
func index(w http.ResponseWriter, r *http.Request) {
|
||||
var keys []int
|
||||
for k := range copyMap {
|
||||
for k := range copyMaps {
|
||||
keys = append(keys, k)
|
||||
}
|
||||
sort.Sort(IntSlice(keys))
|
||||
var s string
|
||||
for v := range keys {
|
||||
connL := copyMap[v]
|
||||
s += "<a href='/detail?id=" + strconv.Itoa(v) + "'>" + strconv.Itoa(v) + "</a>----------"
|
||||
s += strconv.Itoa(int(stashTimeNow.Unix()-connL.startTime.Unix())) + "s----------"
|
||||
s += "<h1>nps</h1>"
|
||||
for _, v := range keys {
|
||||
connL := copyMaps[v]
|
||||
s += "<a href='/detail?id=" + strconv.Itoa(v) + "&label=nps" + "'>" + strconv.Itoa(v) + "</a>----------"
|
||||
s += strconv.Itoa(int(stashTimeNow.Sub(connL.startTime).Milliseconds())) + "ms----------"
|
||||
s += strconv.FormatBool(connL.isClose)
|
||||
s += "<br>"
|
||||
}
|
||||
|
||||
keys = keys[:0]
|
||||
s += "<h1>npc</h1>"
|
||||
for k := range copyMapc {
|
||||
keys = append(keys, k)
|
||||
}
|
||||
sort.Sort(IntSlice(keys))
|
||||
|
||||
for _, v := range keys {
|
||||
connL := copyMapc[v]
|
||||
s += "<a href='/detail?id=" + strconv.Itoa(v) + "&label=npc" + "'>" + strconv.Itoa(v) + "</a>----------"
|
||||
s += strconv.Itoa(int(stashTimeNow.Sub(connL.startTime).Milliseconds())) + "ms----------"
|
||||
s += strconv.FormatBool(connL.isClose)
|
||||
s += "<br>"
|
||||
}
|
||||
|
@ -89,11 +134,21 @@ func index(w http.ResponseWriter, r *http.Request) {
|
|||
|
||||
func detail(w http.ResponseWriter, r *http.Request) {
|
||||
id := r.FormValue("id")
|
||||
label := r.FormValue("label")
|
||||
logs.Warn(label)
|
||||
i, _ := strconv.Atoi(id)
|
||||
v, _ := copyMap[i]
|
||||
var v *connLog
|
||||
if label == "nps" {
|
||||
v, _ = copyMaps[i]
|
||||
}
|
||||
if label == "npc" {
|
||||
v, _ = copyMapc[i]
|
||||
}
|
||||
var s string
|
||||
for _, vv := range v.logs {
|
||||
s += "<p>" + vv + "</p>"
|
||||
if v != nil {
|
||||
for i, vv := range v.logs {
|
||||
s += "<p>" + strconv.Itoa(i+1) + ":" + vv + "</p>"
|
||||
}
|
||||
}
|
||||
w.Write([]byte(s))
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue