updated code to use ClientRouteConfig when adding a new route in control channel

This commit is contained in:
hyung-hwan 2024-12-16 09:59:14 +09:00
parent a4ef87c031
commit 960520b905
3 changed files with 43 additions and 25 deletions

View File

@ -155,6 +155,7 @@ func (ctl *client_ctl_client_conns) ServeHTTP(w http.ResponseWriter, req *http.R
jsp = append(jsp, json_out_client_route{ jsp = append(jsp, json_out_client_route{
Id: r.id, Id: r.id,
ClientPeerAddr: r.peer_addr, ClientPeerAddr: r.peer_addr,
ClientPeerName: r.peer_name,
ServerPeerListenAddr: r.server_peer_listen_addr.String(), ServerPeerListenAddr: r.server_peer_listen_addr.String(),
ServerPeerNet: r.server_peer_net, ServerPeerNet: r.server_peer_net,
ServerPeerOption: r.server_peer_option.string(), ServerPeerOption: r.server_peer_option.string(),
@ -273,6 +274,7 @@ func (ctl *client_ctl_client_conns_id) ServeHTTP(w http.ResponseWriter, req *htt
jsp = append(jsp, json_out_client_route{ jsp = append(jsp, json_out_client_route{
Id: r.id, Id: r.id,
ClientPeerAddr: r.peer_addr, ClientPeerAddr: r.peer_addr,
ClientPeerName: r.peer_name,
ServerPeerListenAddr: r.server_peer_listen_addr.String(), ServerPeerListenAddr: r.server_peer_listen_addr.String(),
ServerPeerNet: r.server_peer_net, ServerPeerNet: r.server_peer_net,
ServerPeerOption: r.server_peer_option.string(), ServerPeerOption: r.server_peer_option.string(),
@ -370,6 +372,7 @@ func (ctl *client_ctl_client_conns_id_routes) ServeHTTP(w http.ResponseWriter, r
case http.MethodPost: case http.MethodPost:
var jcr json_in_client_route var jcr json_in_client_route
var r *ClientRoute var r *ClientRoute
var rc *ClientRouteConfig
var server_peer_option RouteOption var server_peer_option RouteOption
err = json.NewDecoder(req.Body).Decode(&jcr) err = json.NewDecoder(req.Body).Decode(&jcr)
@ -391,7 +394,16 @@ func (ctl *client_ctl_client_conns_id_routes) ServeHTTP(w http.ResponseWriter, r
goto oops goto oops
} }
r, err = cts.AddNewClientRoute(jcr.ClientPeerAddr, jcr.ClientPeerName, jcr.ServerPeerServiceAddr, jcr.ServerPeerServiceNet, server_peer_option) rc = &ClientRouteConfig{
PeerAddr: jcr.ClientPeerAddr,
PeerName: jcr.ClientPeerName,
Option: server_peer_option,
ServiceAddr: jcr.ServerPeerServiceAddr,
ServiceNet: jcr.ServerPeerServiceNet,
}
//cts.AddClientRouteConfig(rc) // TODO: this is to remember... but how to delete it?
r, err = cts.AddNewClientRoute(rc)
if err != nil { if err != nil {
status_code = http.StatusInternalServerError; w.WriteHeader(status_code) status_code = http.StatusInternalServerError; w.WriteHeader(status_code)
if err = je.Encode(json_errmsg{Text: err.Error()}); err != nil { goto oops } if err = je.Encode(json_errmsg{Text: err.Error()}); err != nil { goto oops }
@ -477,6 +489,7 @@ func (ctl *client_ctl_client_conns_id_routes_id) ServeHTTP(w http.ResponseWriter
err = je.Encode(json_out_client_route{ err = je.Encode(json_out_client_route{
Id: r.id, Id: r.id,
ClientPeerAddr: r.peer_addr, ClientPeerAddr: r.peer_addr,
ClientPeerName: r.peer_name,
ServerPeerListenAddr: r.server_peer_listen_addr.String(), ServerPeerListenAddr: r.server_peer_listen_addr.String(),
ServerPeerNet: r.server_peer_net, ServerPeerNet: r.server_peer_net,
ServerPeerOption: r.server_peer_option.string(), ServerPeerOption: r.server_peer_option.string(),

View File

@ -602,14 +602,13 @@ func NewClientConn(c *Client, cfg *ClientConfig) *ClientConn {
return &cts return &cts
} }
func (cts *ClientConn) AddNewClientRoute(addr string, name string, server_peer_svc_addr string, server_peer_svc_net string, option RouteOption) (*ClientRoute, error) { func (cts *ClientConn) AddNewClientRoute(rc *ClientRouteConfig) (*ClientRoute, error) {
var r *ClientRoute var r *ClientRoute
var start_id RouteId var start_id RouteId
cts.route_mtx.Lock()
//start_id = RouteId(rand.Uint64()) //start_id = RouteId(rand.Uint64())
start_id = cts.route_next_id start_id = cts.route_next_id
cts.route_mtx.Lock()
for { for {
var ok bool var ok bool
_, ok = cts.route_map[cts.route_next_id] _, ok = cts.route_map[cts.route_next_id]
@ -621,13 +620,13 @@ func (cts *ClientConn) AddNewClientRoute(addr string, name string, server_peer_s
} }
} }
r = NewClientRoute(cts, cts.route_next_id, addr, name, server_peer_svc_addr, server_peer_svc_net, option) r = NewClientRoute(cts, cts.route_next_id, rc.PeerAddr, rc.PeerName, rc.ServiceAddr, rc.ServiceNet, rc.Option)
cts.route_map[r.id] = r cts.route_map[r.id] = r
cts.route_next_id++ cts.route_next_id++
cts.cli.stats.routes.Add(1) cts.cli.stats.routes.Add(1)
cts.route_mtx.Unlock() cts.route_mtx.Unlock()
cts.cli.log.Write(cts.sid, LOG_INFO, "Added route(%d,%s)", r.id, addr) cts.cli.log.Write(cts.sid, LOG_INFO, "Added route(%d,%d) %s", cts.id, r.id, r.peer_addr)
cts.route_wg.Add(1) cts.route_wg.Add(1)
go r.RunTask(&cts.route_wg) go r.RunTask(&cts.route_wg)
@ -718,12 +717,18 @@ func (cts *ClientConn) FindClientRouteById(route_id RouteId) *ClientRoute {
return r return r
} }
func (cts *ClientConn) AddClientRouteConfig (route *ClientRouteConfig) {
cts.route_mtx.Lock()
cts.cfg.Routes = append(cts.cfg.Routes, *route)
cts.route_mtx.Unlock()
}
func (cts *ClientConn) AddClientRoutes(routes []ClientRouteConfig) error { func (cts *ClientConn) AddClientRoutes(routes []ClientRouteConfig) error {
var v ClientRouteConfig var v ClientRouteConfig
var err error var err error
for _, v = range routes { for _, v = range routes {
_, err = cts.AddNewClientRoute(v.PeerAddr, v.PeerName, v.ServiceAddr, "", v.Option) _, err = cts.AddNewClientRoute(&v)
if err != nil { if err != nil {
return fmt.Errorf("unable to add client route for %s - %s", v, err.Error()) return fmt.Errorf("unable to add client route for %s - %s", v, err.Error())
} }

View File

@ -16,9 +16,9 @@ type app_logger_msg_t struct {
} }
type AppLogger struct { type AppLogger struct {
Id string id string
Out io.Writer out io.Writer
Mask hodu.LogMask mask hodu.LogMask
file *os.File file *os.File
file_name string // you can get the file name from file but this is to preserve the original. file_name string // you can get the file name from file but this is to preserve the original.
@ -31,9 +31,9 @@ type AppLogger struct {
func NewAppLogger (id string, w io.Writer, mask hodu.LogMask) *AppLogger { func NewAppLogger (id string, w io.Writer, mask hodu.LogMask) *AppLogger {
var l *AppLogger var l *AppLogger
l = &AppLogger{ l = &AppLogger{
Id: id, id: id,
Out: w, out: w,
Mask: mask, mask: mask,
msg_chan: make(chan app_logger_msg_t, 256), msg_chan: make(chan app_logger_msg_t, 256),
} }
l.wg.Add(1) l.wg.Add(1)
@ -61,9 +61,9 @@ func NewAppLoggerToFile (id string, file_name string, max_size int64, rotate int
} }
l = &AppLogger{ l = &AppLogger{
Id: id, id: id,
Out: f, out: f,
Mask: mask, mask: mask,
file: f, file: f,
file_name: file_name, file_name: file_name,
file_max_size: max_size, file_max_size: max_size,
@ -94,8 +94,8 @@ main_loop:
select { select {
case msg = <-l.msg_chan: case msg = <-l.msg_chan:
if msg.code == 0 { if msg.code == 0 {
//l.Out.Write([]byte(msg)) //l.out.Write([]byte(msg))
io.WriteString(l.Out, msg.data) io.WriteString(l.out, msg.data)
if l.file_max_size > 0 && l.file != nil { if l.file_max_size > 0 && l.file != nil {
var fi os.FileInfo var fi os.FileInfo
var err error var err error
@ -116,12 +116,12 @@ main_loop:
func (l *AppLogger) Write(id string, level hodu.LogLevel, fmtstr string, args ...interface{}) { func (l *AppLogger) Write(id string, level hodu.LogLevel, fmtstr string, args ...interface{}) {
if l.Mask & hodu.LogMask(level) == 0 { return } if l.mask & hodu.LogMask(level) == 0 { return }
l.write(id, level, 1, fmtstr, args...) l.write(id, level, 1, fmtstr, args...)
} }
func (l *AppLogger) WriteWithCallDepth(id string, level hodu.LogLevel, call_depth int, fmtstr string, args ...interface{}) { func (l *AppLogger) WriteWithCallDepth(id string, level hodu.LogLevel, call_depth int, fmtstr string, args ...interface{}) {
if l.Mask & hodu.LogMask(level) == 0 { return } if l.mask & hodu.LogMask(level) == 0 { return }
l.write(id, level, call_depth + 1, fmtstr, args...) l.write(id, level, call_depth + 1, fmtstr, args...)
} }
@ -136,7 +136,7 @@ func (l *AppLogger) write(id string, level hodu.LogLevel, call_depth int, fmtstr
var caller_ok bool var caller_ok bool
var sb strings.Builder var sb strings.Builder
//if l.Mask & hodu.LogMask(level) == 0 { return } //if l.mask & hodu.LogMask(level) == 0 { return }
now = time.Now() now = time.Now()
@ -155,7 +155,7 @@ func (l *AppLogger) write(id string, level hodu.LogLevel, call_depth int, fmtstr
if caller_ok { if caller_ok {
sb.WriteString(fmt.Sprintf("[%s:%d] ", filepath.Base(callerfile), caller_line)) sb.WriteString(fmt.Sprintf("[%s:%d] ", filepath.Base(callerfile), caller_line))
} }
sb.WriteString(l.Id) sb.WriteString(l.id)
if id != "" { if id != "" {
sb.WriteString("(") sb.WriteString("(")
sb.WriteString(id) sb.WriteString(id)
@ -196,12 +196,12 @@ func (l *AppLogger) rotate() {
if err != nil { if err != nil {
l.file.Close() l.file.Close()
l.file = nil l.file = nil
l.Out = os.Stderr l.out = os.Stderr
// don't reset l.file_name. you can derive that there was an error // don't reset l.file_name. you can derive that there was an error
// if l.file_name is not blank, and if l.Out is os.Stderr, // if l.file_name is not blank, and if l.out is os.Stderr,
} else { } else {
l.file.Close() l.file.Close()
l.file = f l.file = f
l.Out = l.file l.out = l.file
} }
} }