|
|
@@ -170,7 +170,7 @@ func (p *StaticMuxPicker) PickAvailable() (*mux.ClientWorker, error) {
|
|
|
if w.draining {
|
|
|
continue
|
|
|
}
|
|
|
- if w.client.Closed() {
|
|
|
+ if w.IsFull() {
|
|
|
continue
|
|
|
}
|
|
|
if w.client.ActiveConnections() < minConn {
|
|
|
@@ -211,6 +211,7 @@ type PortalWorker struct {
|
|
|
writer buf.Writer
|
|
|
reader buf.Reader
|
|
|
draining bool
|
|
|
+ counter uint32
|
|
|
}
|
|
|
|
|
|
func NewPortalWorker(client *mux.ClientWorker) (*PortalWorker, error) {
|
|
|
@@ -244,7 +245,7 @@ func NewPortalWorker(client *mux.ClientWorker) (*PortalWorker, error) {
|
|
|
}
|
|
|
|
|
|
func (w *PortalWorker) heartbeat() error {
|
|
|
- if w.client.Closed() {
|
|
|
+ if w.Closed() {
|
|
|
return errors.New("client worker stopped")
|
|
|
}
|
|
|
|
|
|
@@ -260,16 +261,21 @@ func (w *PortalWorker) heartbeat() error {
|
|
|
msg.State = Control_DRAIN
|
|
|
|
|
|
defer func() {
|
|
|
+ w.client.GetTimer().Reset(time.Second * 16)
|
|
|
common.Close(w.writer)
|
|
|
common.Interrupt(w.reader)
|
|
|
w.writer = nil
|
|
|
}()
|
|
|
}
|
|
|
|
|
|
- b, err := proto.Marshal(msg)
|
|
|
- common.Must(err)
|
|
|
- mb := buf.MergeBytes(nil, b)
|
|
|
- return w.writer.WriteMultiBuffer(mb)
|
|
|
+ w.counter = (w.counter + 1) % 5
|
|
|
+ if w.draining || w.counter == 1 {
|
|
|
+ b, err := proto.Marshal(msg)
|
|
|
+ common.Must(err)
|
|
|
+ mb := buf.MergeBytes(nil, b)
|
|
|
+ return w.writer.WriteMultiBuffer(mb)
|
|
|
+ }
|
|
|
+ return nil
|
|
|
}
|
|
|
|
|
|
func (w *PortalWorker) IsFull() bool {
|