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