updated to return connections, routes, peers in ascending order by id over the control endpoint

This commit is contained in:
hyung-hwan 2025-03-07 13:41:44 +09:00
parent b6fb296608
commit e56c45b3bf
4 changed files with 136 additions and 34 deletions

View File

@ -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(),

View File

@ -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
}

View File

@ -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(),

View File

@ -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 {