/
server.go
executable file
·100 lines (92 loc) · 2.26 KB
/
server.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
package ssf
import (
"bufio"
"bytes"
"fmt"
"io"
"net"
"os"
"github.com/golang/glog"
"github.com/yinqiwen/gotoolkit/ots"
)
// type ServerConn struct {
// ackWindow uint64 //every 64 events
// }
func processSSFEventConnection(c io.ReadWriteCloser, decodeEvent bool, hander ipcEventHandler) {
bc := bufio.NewReader(c)
ignoreMagic := true
for ssfRunning {
ev, err := readEvent(bc, ignoreMagic, decodeEvent)
ignoreMagic = false
if nil != err {
if err != io.EOF {
glog.Errorf("Failed to read event for error:%v from %v", err, c)
}
c.Close()
return
}
hander.OnEvent(ev, c)
}
c.Close()
}
func processEventConnection(c io.ReadWriteCloser, decodeEvent bool, hander ipcEventHandler) {
//test connection type
magicBuf := make([]byte, 4)
magic, err := readMagicHeader(c, magicBuf)
if nil != err {
if err != io.EOF {
glog.Errorf("Failed to read magic header for error:%v from %v", err, c)
}
} else {
if bytes.Equal(magic, MAGIC_EVENT_HEADER) {
processSSFEventConnection(c, decodeEvent, hander)
} else if bytes.EqualFold(magic, MAGIC_OTSC_HEADER) {
ots.ProcessTroubleShooting(c)
} else {
glog.Errorf("Invalid magic header:%s", string(magic))
c.Close()
}
}
}
func runServer(l net.Listener) {
_, isIPCServer := l.(*net.UnixListener)
ipc := &procIPCEventHandler{}
for ssfRunning {
c, _ := l.Accept()
if nil != c {
var rwc io.ReadWriteCloser
rwc = c
if isIPCServer {
ic := addIPChannel(c)
if nil == ic {
c.Close()
continue
}
rwc = ic
}
go processEventConnection(rwc, false, ipc)
}
}
l.Close()
}
func startClusterServer(laddr string) error {
os.MkdirAll(ssfCfg.ProcHome+"/ipc", 0770)
ipcAddr := ssfCfg.ProcHome + "/ipc/" + ssfCfg.ClusterName + ".sock"
if err := trylockFile(ipcAddr); nil != err {
return fmt.Errorf("IPC file:%s is locked by reason:%v", ipcAddr, err)
}
os.Remove(ipcAddr)
ots.RegisterHandler("ps", ps, 0, 0, "ps list all processors")
ots.RegisterHandler("cd", cd, 1, 1, "cd <Processor> enter interactive mode for the processor")
l, err := net.Listen("unix", ipcAddr)
if nil != err {
return err
}
go runServer(l)
l, err = net.Listen("tcp", laddr)
if nil != err {
return err
}
runServer(l)
return nil
}