From e56c45b3bfb3f56e34c8f3c193e9096edc618b43 Mon Sep 17 00:00:00 2001 From: hyung-hwan Date: Fri, 7 Mar 2025 13:41:44 +0900 Subject: [PATCH] updated to return connections, routes, peers in ascending order by id over the control endpoint --- client-ctl.go | 38 ++++++++++++++++++++++++++------------ client.go | 47 +++++++++++++++++++++++++++++++++++++++++++---- server-ctl.go | 36 ++++++++++++++++++++++++------------ server.go | 49 +++++++++++++++++++++++++++++++++++++++++++------ 4 files changed, 136 insertions(+), 34 deletions(-) diff --git a/client-ctl.go b/client-ctl.go index 66116c4..4a724b6 100644 --- a/client-ctl.go +++ b/client-ctl.go @@ -215,8 +215,8 @@ func (ctl *client_ctl_client_conns) ServeHTTP(w http.ResponseWriter, req *http.R switch req.Method { case http.MethodGet: - var cts *ClientConn var js []json_out_client_conn + var ci ConnId // var q url.Values // q = req.URL.Query() @@ -227,14 +227,19 @@ func (ctl *client_ctl_client_conns) ServeHTTP(w http.ResponseWriter, req *http.R js = make([]json_out_client_conn, 0) c.cts_mtx.Lock() - for _, cts = range c.cts_map { - var r *ClientRoute + for _, ci = range c.cts_map.get_sorted_keys() { + var cts *ClientConn var jsp []json_out_client_route + var ri RouteId + cts = c.cts_map[ci] jsp = make([]json_out_client_route, 0) cts.route_mtx.Lock() - for _, r = range cts.route_map { + for _, ri = range cts.route_map.get_sorted_keys() { + var r *ClientRoute var spla string = "" + + r = cts.route_map[ri] if r.server_peer_listen_addr != nil { spla = r.server_peer_listen_addr.String() } jsp = append(jsp, json_out_client_route{ Id: r.Id, @@ -247,6 +252,7 @@ func (ctl *client_ctl_client_conns) ServeHTTP(w http.ResponseWriter, req *http.R LifetimeStart: r.LifetimeStart.Unix(), }) } + cts.route_mtx.Unlock() js = append(js, json_out_client_conn{ Id: cts.Id, ReqServerAddrs: cts.cfg.ServerAddrs, @@ -256,7 +262,6 @@ func (ctl *client_ctl_client_conns) ServeHTTP(w http.ResponseWriter, req *http.R ClientToken: cts.Token, Routes: jsp, }) - cts.route_mtx.Unlock() } c.cts_mtx.Unlock() @@ -336,14 +341,17 @@ func (ctl *client_ctl_client_conns_id) ServeHTTP(w http.ResponseWriter, req *htt switch req.Method { case http.MethodGet: - var r *ClientRoute var jsp []json_out_client_route var js *json_out_client_conn + var ri RouteId jsp = make([]json_out_client_route, 0) cts.route_mtx.Lock() - for _, r = range cts.route_map { + for _, ri = range cts.route_map.get_sorted_keys() { + var r *ClientRoute var spla string = "" + + r = cts.route_map[ri]; if r.server_peer_listen_addr != nil { spla = r.server_peer_listen_addr.String() } jsp = append(jsp, json_out_client_route{ Id: r.Id, @@ -356,6 +364,7 @@ func (ctl *client_ctl_client_conns_id) ServeHTTP(w http.ResponseWriter, req *htt LifetimeStart: r.LifetimeStart.Unix(), }) } + cts.route_mtx.Unlock() js = &json_out_client_conn{ Id: cts.Id, ReqServerAddrs: cts.cfg.ServerAddrs, @@ -365,7 +374,6 @@ func (ctl *client_ctl_client_conns_id) ServeHTTP(w http.ResponseWriter, req *htt ClientToken: cts.Token, Routes: jsp, } - cts.route_mtx.Unlock() status_code = WriteJsonRespHeader(w, http.StatusOK) if err = je.Encode(js); err != nil { goto oops } @@ -409,13 +417,16 @@ func (ctl *client_ctl_client_conns_id_routes) ServeHTTP(w http.ResponseWriter, r switch req.Method { case http.MethodGet: - var r *ClientRoute var jsp []json_out_client_route + var ri RouteId jsp = make([]json_out_client_route, 0) cts.route_mtx.Lock() - for _, r = range cts.route_map { + for _, ri = range cts.route_map.get_sorted_keys() { + var r *ClientRoute var spla string = "" + + r = cts.route_map[ri] if r.server_peer_listen_addr != nil { spla = r.server_peer_listen_addr.String() } jsp = append(jsp, json_out_client_route{ Id: r.Id, @@ -696,12 +707,15 @@ func (ctl *client_ctl_client_conns_id_routes_id_peers) ServeHTTP(w http.Response switch req.Method { case http.MethodGet: - var p *ClientPeerConn var jcp []json_out_client_peer + var pi PeerId jcp = make([]json_out_client_peer, 0) r.ptc_mtx.Lock() - for _, p = range r.ptc_map { + for _, pi = range r.ptc_map.get_sorted_keys() { + var p *ClientPeerConn + + p = r.ptc_map[pi] jcp = append(jcp, json_out_client_peer{ Id: p.conn_id, ClientPeerAddr: p.conn.RemoteAddr().String(), diff --git a/client.go b/client.go index 952f5e1..5debe5e 100644 --- a/client.go +++ b/client.go @@ -7,6 +7,7 @@ import "fmt" import "log" import "net" import "net/http" +import "slices" import "strconv" import "sync" import "sync/atomic" @@ -24,10 +25,10 @@ import "github.com/prometheus/client_golang/prometheus/promhttp" type PacketStreamClient grpc.BidiStreamingClient[Packet, Packet] -type ClientConnMap = map[ConnId]*ClientConn -type ClientRouteMap = map[RouteId]*ClientRoute -type ClientPeerConnMap = map[PeerId]*ClientPeerConn -type ClientPeerCancelFuncMap = map[PeerId]context.CancelFunc +type ClientConnMap map[ConnId]*ClientConn +type ClientRouteMap map[RouteId]*ClientRoute +type ClientPeerConnMap map[PeerId]*ClientPeerConn +type ClientPeerCancelFuncMap map[PeerId]context.CancelFunc // -------------------------------------------------------------------- type ClientRouteConfig struct { @@ -1286,6 +1287,44 @@ func (cts *ClientConn) ReportEvent(route_id RouteId, pts_id PeerId, event_type P // -------------------------------------------------------------------- +func (m ClientPeerConnMap) get_sorted_keys() []PeerId { + var ks []PeerId + var peer *ClientPeerConn + + ks = make([]PeerId, 0, len(m)) + for _, peer = range m { + ks = append(ks, peer.conn_id) + } + slices.Sort(ks) + return ks +} + +func (m ClientRouteMap) get_sorted_keys() []RouteId { + var ks []RouteId + var route *ClientRoute + + ks = make([]RouteId, 0, len(m)) + for _, route = range m { + ks = append(ks, route.Id) + } + slices.Sort(ks) + return ks +} + +func (m ClientConnMap) get_sorted_keys() []ConnId { + var ks []ConnId + var cts *ClientConn + + ks = make([]ConnId, 0, len(m)) + for _, cts = range m { + ks = append(ks, cts.Id) + } + slices.Sort(ks) + return ks +} + +// -------------------------------------------------------------------- + type client_ctl_log_writer struct { cli *Client } diff --git a/server-ctl.go b/server-ctl.go index 53559b6..c5c240d 100644 --- a/server-ctl.go +++ b/server-ctl.go @@ -177,18 +177,22 @@ func (ctl *server_ctl_server_conns) ServeHTTP(w http.ResponseWriter, req *http.R switch req.Method { case http.MethodGet: - var cts *ServerConn var js []json_out_server_conn + var ci ConnId js = make([]json_out_server_conn, 0) s.cts_mtx.Lock() - for _, cts = range s.cts_map { - var r *ServerRoute + for _, ci = range s.cts_map.get_sorted_keys() { + var cts *ServerConn var jsp []json_out_server_route + var ri RouteId + cts = s.cts_map[ci] jsp = make([]json_out_server_route, 0) cts.route_mtx.Lock() - for _, r = range cts.route_map { + for _, ri = range cts.route_map.get_sorted_keys() { + var r *ServerRoute + r = cts.route_map[ri] jsp = append(jsp, json_out_server_route{ Id: r.Id, ClientPeerAddr: r.PtcAddr, @@ -198,6 +202,7 @@ func (ctl *server_ctl_server_conns) ServeHTTP(w http.ResponseWriter, req *http.R ServerPeerOption: r.SvcOption.String(), }) } + cts.route_mtx.Unlock() js = append(js, json_out_server_conn{ Id: cts.Id, ClientAddr: cts.RemoteAddr.String(), @@ -205,7 +210,6 @@ func (ctl *server_ctl_server_conns) ServeHTTP(w http.ResponseWriter, req *http.R ClientToken: cts.ClientToken, Routes: jsp, }) - cts.route_mtx.Unlock() } s.cts_mtx.Unlock() @@ -250,13 +254,16 @@ func (ctl *server_ctl_server_conns_id) ServeHTTP(w http.ResponseWriter, req *htt switch req.Method { case http.MethodGet: - var r *ServerRoute var jsp []json_out_server_route var js *json_out_server_conn + var ri RouteId jsp = make([]json_out_server_route, 0) cts.route_mtx.Lock() - for _, r = range cts.route_map { + for _, ri = range cts.route_map.get_sorted_keys() { + var r *ServerRoute + + r = cts.route_map[ri] jsp = append(jsp, json_out_server_route{ Id: r.Id, ClientPeerAddr: r.PtcAddr, @@ -266,6 +273,7 @@ func (ctl *server_ctl_server_conns_id) ServeHTTP(w http.ResponseWriter, req *htt ServerPeerOption: r.SvcOption.String(), }) } + cts.route_mtx.Unlock() js = &json_out_server_conn{ Id: cts.Id, ClientAddr: cts.RemoteAddr.String(), @@ -273,7 +281,6 @@ func (ctl *server_ctl_server_conns_id) ServeHTTP(w http.ResponseWriter, req *htt ClientToken: cts.ClientToken, Routes: jsp, } - cts.route_mtx.Unlock() status_code = WriteJsonRespHeader(w, http.StatusOK) if err = je.Encode(js); err != nil { goto oops } @@ -317,12 +324,15 @@ func (ctl *server_ctl_server_conns_id_routes) ServeHTTP(w http.ResponseWriter, r switch req.Method { case http.MethodGet: - var r *ServerRoute var jsp []json_out_server_route + var ri RouteId jsp = make([]json_out_server_route, 0) cts.route_mtx.Lock() - for _, r = range cts.route_map { + for _, ri = range cts.route_map.get_sorted_keys() { + var r *ServerRoute + + r = cts.route_map[ri] jsp = append(jsp, json_out_server_route{ Id: r.Id, ClientPeerAddr: r.PtcAddr, @@ -466,12 +476,14 @@ func (ctl *server_ctl_server_conns_id_routes_id_peers) ServeHTTP(w http.Response switch req.Method { case http.MethodGet: - var p *ServerPeerConn var jcp []json_out_server_peer + var pi PeerId jcp = make([]json_out_server_peer, 0) r.pts_mtx.Lock() - for _, p = range r.pts_map { + for _, pi = range r.pts_map.get_sorted_keys() { + var p *ServerPeerConn + p = r.pts_map[pi]; jcp = append(jcp, json_out_server_peer{ Id: p.conn_id, ServerPeerAddr: p.conn.RemoteAddr().String(), diff --git a/server.go b/server.go index ebcfc22..d372392 100644 --- a/server.go +++ b/server.go @@ -9,6 +9,7 @@ import "log" import "net" import "net/http" import "net/netip" +import "slices" import "strconv" import "sync" import "sync/atomic" @@ -33,12 +34,12 @@ const HS_ID_WPX string = "wpx" const HS_ID_PXY string = "pxy" const HS_ID_PXY_WS string = "pxy-ws" -type ServerConnMapByAddr = map[net.Addr]*ServerConn -type ServerConnMapByClientToken = map[string]*ServerConn -type ServerConnMap = map[ConnId]*ServerConn -type ServerRouteMap = map[RouteId]*ServerRoute -type ServerPeerConnMap = map[PeerId]*ServerPeerConn -type ServerSvcPortMap = map[PortId]ConnRouteId +type ServerConnMapByAddr map[net.Addr]*ServerConn +type ServerConnMapByClientToken map[string]*ServerConn +type ServerConnMap map[ConnId]*ServerConn +type ServerRouteMap map[RouteId]*ServerRoute +type ServerPeerConnMap map[PeerId]*ServerPeerConn +type ServerSvcPortMap map[PortId]ConnRouteId type ServerWpxResponseTransformer func(r *ServerRouteProxyInfo, resp *http.Response) io.Reader type ServerWpxForeignPortProxyMaker func(wpx_type string, port_id string) (*ServerRouteProxyInfo, error) @@ -957,6 +958,42 @@ func (cc *ConnCatcher) HandleConn(ctx context.Context, cs stats.ConnStats) { } } +// ------------------------------------ +func (m ServerPeerConnMap) get_sorted_keys() []PeerId { + var ks []PeerId + var peer *ServerPeerConn + + ks = make([]PeerId, 0, len(m)) + for _, peer = range m { + ks = append(ks, peer.conn_id) + } + slices.Sort(ks) + return ks +} + +func (m ServerRouteMap) get_sorted_keys() []RouteId { + var ks []RouteId + var route *ServerRoute + + ks = make([]RouteId, 0, len(m)) + for _, route = range m { + ks = append(ks, route.Id) + } + slices.Sort(ks) + return ks +} + +func (m ServerConnMap) get_sorted_keys() []ConnId { + var ks []ConnId + var cts *ServerConn + + ks = make([]ConnId, 0, len(m)) + for _, cts = range m { + ks = append(ks, cts.Id) + } + slices.Sort(ks) + return ks +} // ------------------------------------ type wrappedStream struct {