fix queue bug

This commit is contained in:
ffdfgdfg
2019-10-27 23:25:12 +08:00
parent 442354db17
commit 5f35415849
4 changed files with 275 additions and 194 deletions

View File

@@ -4,12 +4,14 @@ import (
"bufio"
"fmt"
"github.com/cnlh/nps/lib/common"
"io"
"log"
"net"
"net/http"
"net/http/httputil"
_ "net/http/pprof"
"strconv"
"sync"
"testing"
"time"
"unsafe"
@@ -48,42 +50,42 @@ func TestNewMux(t *testing.T) {
//c2.(*net.TCPConn).SetReadBuffer(0)
//c2.(*net.TCPConn).SetReadBuffer(0)
go func(c2 net.Conn, c *conn) {
//wg := sync.WaitGroup{}
//wg.Add(1)
//go func() {
// _, err = common.CopyBuffer(c2, c)
// if err != nil {
// c2.Close()
// c.Close()
// logs.Warn("close npc by copy from nps", err, c.connId)
// }
// wg.Done()
//}()
//wg.Add(1)
//go func() {
// _, err = common.CopyBuffer(c, c2)
// if err != nil {
// c2.Close()
// c.Close()
// logs.Warn("close npc by copy from server", err, c.connId)
// }
// wg.Done()
//}()
////logs.Warn("npc wait")
//wg.Wait()
wg := sync.WaitGroup{}
wg.Add(1)
go func() {
_, err = common.CopyBuffer(c2, c)
if err != nil {
c2.Close()
c.Close()
//logs.Warn("close npc by copy from nps", err, c.connId)
}
wg.Done()
}()
wg.Add(1)
go func() {
_, err = common.CopyBuffer(c, c2)
if err != nil {
c2.Close()
c.Close()
//logs.Warn("close npc by copy from server", err, c.connId)
}
wg.Done()
}()
//logs.Warn("npc wait")
wg.Wait()
}(c2, c.(*conn))
}
}()
go func() {
//m1 := NewMux(conn1, "tcp")
m1 := NewMux(conn1, "tcp")
l, err := net.Listen("tcp", "127.0.0.1:7777")
if err != nil {
logs.Warn(err)
}
for {
//logs.Warn("nps starting accept")
_, err := l.Accept()
conns, err := l.Accept()
if err != nil {
logs.Warn(err)
continue
@@ -91,37 +93,38 @@ func TestNewMux(t *testing.T) {
//conns.(*net.TCPConn).SetReadBuffer(0)
//conns.(*net.TCPConn).SetReadBuffer(0)
//logs.Warn("nps accept success starting new conn")
//tmpCpnn, err := m1.NewConn()
//if err != nil {
// logs.Warn("nps new conn err ", err)
// continue
//}
////logs.Warn("nps new conn success ", tmpCpnn.connId)
//go func(tmpCpnn *conn, conns net.Conn) {
// //go func() {
// // _, err := common.CopyBuffer(tmpCpnn, conns)
// // if err != nil {
// // conns.Close()
// // tmpCpnn.Close()
// // logs.Warn("close nps by copy from user", tmpCpnn.connId, err)
// // }
// //}()
// ////time.Sleep(time.Second)
// //_, err = common.CopyBuffer(conns, tmpCpnn)
// //if err != nil {
// // conns.Close()
// // tmpCpnn.Close()
// // logs.Warn("close nps by copy from npc ", tmpCpnn.connId, err)
// //}
//}(tmpCpnn, conns)
tmpCpnn, err := m1.NewConn()
if err != nil {
logs.Warn("nps new conn err ", err)
continue
}
//logs.Warn("nps new conn success ", tmpCpnn.connId)
go func(tmpCpnn *conn, conns net.Conn) {
go func() {
_, err := common.CopyBuffer(tmpCpnn, conns)
if err != nil {
conns.Close()
tmpCpnn.Close()
//logs.Warn("close nps by copy from user", tmpCpnn.connId, err)
}
}()
//time.Sleep(time.Second)
_, err = common.CopyBuffer(conns, tmpCpnn)
if err != nil {
conns.Close()
tmpCpnn.Close()
//logs.Warn("close nps by copy from npc ", tmpCpnn.connId, err)
}
}(tmpCpnn, conns)
}
}()
go NewLogServer()
//go NewLogServer()
time.Sleep(time.Second * 5)
for i := 0; i < 1000; i++ {
go test_raw(i)
}
//test_request()
for {
time.Sleep(time.Second * 5)
@@ -154,7 +157,7 @@ func client() {
func test_request() {
conn, _ := net.Dial("tcp", "127.0.0.1:7777")
for {
conn.Write([]byte(`GET /videojs5/video.js HTTP/1.1
conn.Write([]byte(`GET / HTTP/1.1
Host: 127.0.0.1:7777
Connection: keep-alive
@@ -177,39 +180,42 @@ Connection: keep-alive
}
func test_raw(k int) {
for i := 0; i < 1; i++ {
for i := 0; i < 10; i++ {
ti := time.Now()
_, _ = net.Dial("tcp", "127.0.0.1:7777")
conn, err := net.Dial("tcp", "127.0.0.1:7777")
if err != nil {
logs.Warn("conn dial err", err)
}
tid := time.Now()
// conn.Write([]byte(`GET / HTTP/1.1
//Host: 127.0.0.1:7777
//
//
//`))
// tiw := time.Now()
//buf := make([]byte, 3572)
//n, err := io.ReadFull(conn, buf)
////n, err := conn.Read(buf)
//if err != nil {
// logs.Warn("close by read response err", err)
// break
//}
////logs.Warn(n, string(buf[:50]), "\n--------------\n", string(buf[n-50:n]))
////time.Sleep(time.Second)
//err = conn.Close()
//if err != nil {
// logs.Warn("close conn err ", err)
//}
conn.Write([]byte(`GET / HTTP/1.1
Host: 127.0.0.1:7777
`))
tiw := time.Now()
buf := make([]byte, 3572)
n, err := io.ReadFull(conn, buf)
//n, err := conn.Read(buf)
if err != nil {
logs.Warn("close by read response err", err)
break
}
logs.Warn(n, string(buf[:50]), "\n--------------\n", string(buf[n-50:n]))
//time.Sleep(time.Second)
err = conn.Close()
if err != nil {
logs.Warn("close conn err ", err)
}
now := time.Now()
du := now.Sub(ti).Seconds()
dud := now.Sub(tid).Seconds()
//duw := now.Sub(tiw).Seconds()
//if du > 1 {
logs.Warn("duration long", du, dud, k, i)
//}
//if n != 3572 {
// logs.Warn("n loss", n, string(buf))
//}
duw := now.Sub(tiw).Seconds()
if du > 1 {
logs.Warn("duration long", du, dud, duw, k, i)
}
if n != 3572 {
logs.Warn("n loss", n, string(buf))
}
}
}
@@ -293,11 +299,11 @@ func TestFIFO(t *testing.T) {
logs.EnableFuncCallDepth(true)
logs.SetLogFuncCallDepth(3)
time.Sleep(time.Second * 5)
d := new(FIFOQueue)
d := new(ReceiveWindowQueue)
d.New()
go func() {
time.Sleep(time.Second)
for i := 0; i < 30000; i++ {
for i := 0; i < 30010; i++ {
data, err := d.Pop()
if err == nil {
//fmt.Println(i, string(data.buf), err)
@@ -306,7 +312,9 @@ func TestFIFO(t *testing.T) {
//fmt.Println("err", err)
logs.Warn("err", err)
}
//logs.Warn(d.Len())
}
logs.Warn("pop finish")
}()
go func() {
time.Sleep(time.Second * 10)
@@ -314,10 +322,10 @@ func TestFIFO(t *testing.T) {
go func(i int) {
for n := 0; n < 10; n++ {
data := new(ListElement)
by := []byte("test " + strconv.Itoa(i) + strconv.Itoa(n))
by := []byte("test " + strconv.Itoa(i) + " " + strconv.Itoa(n)) //
_ = data.New(by, uint16(len(by)), true)
//fmt.Println(string((*data).buf), data)
logs.Warn(string((*data).buf), data)
//logs.Warn(string((*data).buf), data)
d.Push(data)
}
}(i)
@@ -337,11 +345,12 @@ func TestPriority(t *testing.T) {
d.New()
go func() {
time.Sleep(time.Second)
for i := 0; i < 36000; i++ {
for i := 0; i < 36005; i++ {
data := d.Pop()
//fmt.Println(i, string(data.buf), err)
logs.Warn(i, string(data.Content), data)
}
logs.Warn("pop finish")
}()
go func() {
time.Sleep(time.Second * 10)