mirror of
https://github.com/duanhf2012/origin.git
synced 2026-02-03 22:45:13 +08:00
新增异步日志功能
This commit is contained in:
@@ -3,9 +3,9 @@ package processor
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"github.com/duanhf2012/origin/network"
|
||||
"reflect"
|
||||
"github.com/duanhf2012/origin/log"
|
||||
"github.com/duanhf2012/origin/util/bytespool"
|
||||
"reflect"
|
||||
)
|
||||
|
||||
type MessageJsonInfo struct {
|
||||
@@ -24,7 +24,7 @@ type JsonProcessor struct {
|
||||
unknownMessageHandler UnknownMessageJsonHandler
|
||||
connectHandler ConnectJsonHandler
|
||||
disconnectHandler ConnectJsonHandler
|
||||
network.INetMempool
|
||||
bytespool.IBytesMempool
|
||||
}
|
||||
|
||||
type JsonPackInfo struct {
|
||||
@@ -35,7 +35,7 @@ type JsonPackInfo struct {
|
||||
|
||||
func NewJsonProcessor() *JsonProcessor {
|
||||
processor := &JsonProcessor{mapMsg:map[uint16]MessageJsonInfo{}}
|
||||
processor.INetMempool = network.NewMemAreaPool()
|
||||
processor.IBytesMempool = bytespool.NewMemAreaPool()
|
||||
|
||||
return processor
|
||||
}
|
||||
@@ -58,7 +58,7 @@ func (jsonProcessor *JsonProcessor ) MsgRoute(clientId uint64,msg interface{}) e
|
||||
|
||||
func (jsonProcessor *JsonProcessor) Unmarshal(clientId uint64,data []byte) (interface{}, error) {
|
||||
typeStruct := struct {Type int `json:"typ"`}{}
|
||||
defer jsonProcessor.ReleaseByteSlice(data)
|
||||
defer jsonProcessor.ReleaseBytes(data)
|
||||
err := json.Unmarshal(data, &typeStruct)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
|
||||
@@ -3,7 +3,7 @@ package processor
|
||||
import (
|
||||
"encoding/binary"
|
||||
"fmt"
|
||||
"github.com/duanhf2012/origin/network"
|
||||
"github.com/duanhf2012/origin/util/bytespool"
|
||||
"github.com/gogo/protobuf/proto"
|
||||
"reflect"
|
||||
)
|
||||
@@ -26,7 +26,7 @@ type PBProcessor struct {
|
||||
unknownMessageHandler UnknownMessageHandler
|
||||
connectHandler ConnectHandler
|
||||
disconnectHandler ConnectHandler
|
||||
network.INetMempool
|
||||
bytespool.IBytesMempool
|
||||
}
|
||||
|
||||
type PBPackInfo struct {
|
||||
@@ -37,7 +37,7 @@ type PBPackInfo struct {
|
||||
|
||||
func NewPBProcessor() *PBProcessor {
|
||||
processor := &PBProcessor{mapMsg: map[uint16]MessageInfo{}}
|
||||
processor.INetMempool = network.NewMemAreaPool()
|
||||
processor.IBytesMempool = bytespool.NewMemAreaPool()
|
||||
return processor
|
||||
}
|
||||
|
||||
@@ -67,7 +67,7 @@ func (pbProcessor *PBProcessor) MsgRoute(clientId uint64, msg interface{}) error
|
||||
|
||||
// must goroutine safe
|
||||
func (pbProcessor *PBProcessor) Unmarshal(clientId uint64, data []byte) (interface{}, error) {
|
||||
defer pbProcessor.ReleaseByteSlice(data)
|
||||
defer pbProcessor.ReleaseBytes(data)
|
||||
return pbProcessor.UnmarshalWithOutRelease(clientId, data)
|
||||
}
|
||||
|
||||
|
||||
@@ -1,89 +0,0 @@
|
||||
package network
|
||||
|
||||
import (
|
||||
"sync"
|
||||
)
|
||||
|
||||
type INetMempool interface {
|
||||
MakeByteSlice(size int) []byte
|
||||
ReleaseByteSlice(byteBuff []byte) bool
|
||||
}
|
||||
|
||||
type memAreaPool struct {
|
||||
minAreaValue int //最小范围值
|
||||
maxAreaValue int //最大范围值
|
||||
growthValue int //内存增长值
|
||||
pool []sync.Pool
|
||||
}
|
||||
|
||||
var memAreaPoolList = [4]*memAreaPool{&memAreaPool{minAreaValue: 1, maxAreaValue: 4096, growthValue: 512}, &memAreaPool{minAreaValue: 4097, maxAreaValue: 40960, growthValue: 4096}, &memAreaPool{minAreaValue: 40961, maxAreaValue: 417792, growthValue: 16384}, &memAreaPool{minAreaValue: 417793, maxAreaValue: 1925120, growthValue: 65536}}
|
||||
|
||||
func init() {
|
||||
for i := 0; i < len(memAreaPoolList); i++ {
|
||||
memAreaPoolList[i].makePool()
|
||||
}
|
||||
}
|
||||
|
||||
func NewMemAreaPool() *memAreaPool {
|
||||
return &memAreaPool{}
|
||||
}
|
||||
|
||||
func (areaPool *memAreaPool) makePool() {
|
||||
poolLen := (areaPool.maxAreaValue - areaPool.minAreaValue + 1) / areaPool.growthValue
|
||||
areaPool.pool = make([]sync.Pool, poolLen)
|
||||
for i := 0; i < poolLen; i++ {
|
||||
memSize := (areaPool.minAreaValue - 1) + (i+1)*areaPool.growthValue
|
||||
areaPool.pool[i] = sync.Pool{New: func() interface{} {
|
||||
return make([]byte, memSize)
|
||||
}}
|
||||
}
|
||||
}
|
||||
|
||||
func (areaPool *memAreaPool) makeByteSlice(size int) []byte {
|
||||
pos := areaPool.getPosByteSize(size)
|
||||
if pos > len(areaPool.pool) || pos == -1 {
|
||||
return nil
|
||||
}
|
||||
|
||||
return areaPool.pool[pos].Get().([]byte)[:size]
|
||||
}
|
||||
|
||||
func (areaPool *memAreaPool) getPosByteSize(size int) int {
|
||||
pos := (size - areaPool.minAreaValue) / areaPool.growthValue
|
||||
if pos >= len(areaPool.pool) {
|
||||
return -1
|
||||
}
|
||||
|
||||
return pos
|
||||
}
|
||||
|
||||
func (areaPool *memAreaPool) releaseByteSlice(byteBuff []byte) bool {
|
||||
pos := areaPool.getPosByteSize(cap(byteBuff))
|
||||
if pos > len(areaPool.pool) || pos == -1 {
|
||||
panic("assert!")
|
||||
return false
|
||||
}
|
||||
|
||||
areaPool.pool[pos].Put(byteBuff)
|
||||
return true
|
||||
}
|
||||
|
||||
func (areaPool *memAreaPool) MakeByteSlice(size int) []byte {
|
||||
for i := 0; i < len(memAreaPoolList); i++ {
|
||||
if size <= memAreaPoolList[i].maxAreaValue {
|
||||
return memAreaPoolList[i].makeByteSlice(size)
|
||||
}
|
||||
}
|
||||
|
||||
return make([]byte, size)
|
||||
}
|
||||
|
||||
func (areaPool *memAreaPool) ReleaseByteSlice(byteBuff []byte) bool {
|
||||
for i := 0; i < len(memAreaPoolList); i++ {
|
||||
if cap(byteBuff) <= memAreaPoolList[i].maxAreaValue {
|
||||
return memAreaPoolList[i].releaseByteSlice(byteBuff)
|
||||
}
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
@@ -41,7 +41,7 @@ func newTCPConn(conn net.Conn, pendingWriteNum int, msgParser *MsgParser,writeDe
|
||||
|
||||
conn.SetWriteDeadline(time.Now().Add(writeDeadline))
|
||||
_, err := conn.Write(b)
|
||||
tcpConn.msgParser.ReleaseByteSlice(b)
|
||||
tcpConn.msgParser.ReleaseBytes(b)
|
||||
|
||||
if err != nil {
|
||||
break
|
||||
@@ -130,7 +130,7 @@ func (tcpConn *TCPConn) ReadMsg() ([]byte, error) {
|
||||
}
|
||||
|
||||
func (tcpConn *TCPConn) ReleaseReadMsg(byteBuff []byte){
|
||||
tcpConn.msgParser.ReleaseByteSlice(byteBuff)
|
||||
tcpConn.msgParser.ReleaseBytes(byteBuff)
|
||||
}
|
||||
|
||||
func (tcpConn *TCPConn) WriteMsg(args ...[]byte) error {
|
||||
|
||||
@@ -3,6 +3,7 @@ package network
|
||||
import (
|
||||
"encoding/binary"
|
||||
"errors"
|
||||
"github.com/duanhf2012/origin/util/bytespool"
|
||||
"io"
|
||||
"math"
|
||||
)
|
||||
@@ -16,7 +17,7 @@ type MsgParser struct {
|
||||
MaxMsgLen uint32
|
||||
LittleEndian bool
|
||||
|
||||
INetMempool
|
||||
bytespool.IBytesMempool
|
||||
}
|
||||
|
||||
|
||||
@@ -34,7 +35,7 @@ func (p *MsgParser) getMaxMsgLen(lenMsgLen int) uint32 {
|
||||
}
|
||||
|
||||
func (p *MsgParser) init(){
|
||||
p.INetMempool = NewMemAreaPool()
|
||||
p.IBytesMempool = bytespool.NewMemAreaPool()
|
||||
}
|
||||
|
||||
// goroutine safe
|
||||
@@ -74,9 +75,9 @@ func (p *MsgParser) Read(conn *TCPConn) ([]byte, error) {
|
||||
}
|
||||
|
||||
// data
|
||||
msgData := p.MakeByteSlice(int(msgLen))
|
||||
msgData := p.MakeBytes(int(msgLen))
|
||||
if _, err := io.ReadFull(conn, msgData[:msgLen]); err != nil {
|
||||
p.ReleaseByteSlice(msgData)
|
||||
p.ReleaseBytes(msgData)
|
||||
return nil, err
|
||||
}
|
||||
|
||||
@@ -99,7 +100,7 @@ func (p *MsgParser) Write(conn *TCPConn, args ...[]byte) error {
|
||||
}
|
||||
|
||||
//msg := make([]byte, uint32(p.lenMsgLen)+msgLen)
|
||||
msg := p.MakeByteSlice(p.LenMsgLen+int(msgLen))
|
||||
msg := p.MakeBytes(p.LenMsgLen+int(msgLen))
|
||||
// write len
|
||||
switch p.LenMsgLen {
|
||||
case 1:
|
||||
|
||||
@@ -2,6 +2,7 @@ package network
|
||||
|
||||
import (
|
||||
"github.com/duanhf2012/origin/log"
|
||||
"github.com/duanhf2012/origin/util/bytespool"
|
||||
"net"
|
||||
"sync"
|
||||
"time"
|
||||
@@ -96,12 +97,12 @@ func (server *TCPServer) init() {
|
||||
server.MsgParser.init()
|
||||
}
|
||||
|
||||
func (server *TCPServer) SetNetMempool(mempool INetMempool){
|
||||
server.INetMempool = mempool
|
||||
func (server *TCPServer) SetNetMempool(mempool bytespool.IBytesMempool){
|
||||
server.IBytesMempool = mempool
|
||||
}
|
||||
|
||||
func (server *TCPServer) GetNetMempool() INetMempool{
|
||||
return server.INetMempool
|
||||
func (server *TCPServer) GetNetMempool() bytespool.IBytesMempool {
|
||||
return server.IBytesMempool
|
||||
}
|
||||
|
||||
func (server *TCPServer) run() {
|
||||
|
||||
Reference in New Issue
Block a user