Browse Source

使用select调整rpc超时请求

master
xyiege 4 months ago
parent
commit
fbca9d6acd
  1. 21
      aufs/core/sysmonitor.go

21
aufs/core/sysmonitor.go

@ -6,6 +6,7 @@ import (
"log" "log"
"net/http" "net/http"
"net/rpc/jsonrpc" "net/rpc/jsonrpc"
"time"
) )
// 返回json数据 // 返回json数据
@ -38,16 +39,18 @@ func SysMonitor(w http.ResponseWriter, r *http.Request) {
// todo 待优化 // todo 待优化
for _, sc := range scslist { for _, sc := range scslist {
// 利用channel控制超时
errch := make(chan error, 1)
// 利用jsonrpc 请求结果 // 利用jsonrpc 请求结果
// 构建访问的链接 // 构建访问的链接
ser := sc.Addr + ":" + sc.Port ser := sc.Addr + ":" + sc.Port
go func() {
// 链接服务 // 链接服务
client, err := jsonrpc.Dial("tcp", ser) client, err := jsonrpc.Dial("tcp", ser)
// 发生错误,执行下一个
if err != nil { if err != nil {
log.Fatalf("Dial SysMonitor failed: %v", err) log.Fatalf("Dial SysMonitor failed: %v\n", err)
// 跳过 errch <- err
continue
} }
// //
defer client.Close() defer client.Close()
@ -63,6 +66,16 @@ func SysMonitor(w http.ResponseWriter, r *http.Request) {
} }
// 添加到rsdata // 添加到rsdata
rsdata.Slist = append(rsdata.Slist, sinfo) rsdata.Slist = append(rsdata.Slist, sinfo)
}()
//
select {
case err := <-errch:
log.Printf("SysMonitor failed: %v\n", err)
case <-time.After(5 * time.Second):
log.Printf("SysMonitor timeout: %v\n", ser)
}
} }
// 生成json数据 // 生成json数据
sysresp := SysResp{ sysresp := SysResp{

Loading…
Cancel
Save