added a debugging log message for conn_notice packets

created SendNotice function for reuse by external parties
This commit is contained in:
hyung-hwan 2025-02-26 19:45:29 +09:00
parent 5df95159a3
commit 71a42af593
3 changed files with 35 additions and 17 deletions

View File

@ -1193,6 +1193,7 @@ start_over:
var ok bool var ok bool
x, ok = pkt.U.(*Packet_Notice) x, ok = pkt.U.(*Packet_Notice)
if ok { if ok {
cts.C.log.Write(cts.Sid, LOG_DEBUG, "conn_notice message '%s' received from %s", x.Notice.Text, cts.remote_addr)
if cts.C.conn_notice != nil { if cts.C.conn_notice != nil {
cts.C.conn_notice.Handle(cts, x.Notice.Text) cts.C.conn_notice.Handle(cts, x.Notice.Text)
} }

View File

@ -560,10 +560,11 @@ oops:
func (ctl *server_ctl_notices) ServeHTTP(w http.ResponseWriter, req *http.Request) (int, error) { func (ctl *server_ctl_notices) ServeHTTP(w http.ResponseWriter, req *http.Request) (int, error) {
var s *Server var s *Server
var status_code int var status_code int
var cts *ServerConn var je *json.Encoder
var err error var err error
s = ctl.s s = ctl.s
je = json.NewEncoder(w)
switch req.Method { switch req.Method {
case http.MethodPost: case http.MethodPost:
@ -575,13 +576,13 @@ func (ctl *server_ctl_notices) ServeHTTP(w http.ResponseWriter, req *http.Reques
goto oops goto oops
} }
// TODO: what if this loop takes too long? in that case, lock is held for long. think about how to handle this. err = s.SendNotice("", noti.Text)
s.cts_mtx.Lock() if err != nil {
for _, cts = range s.cts_map { status_code = WriteJsonRespHeader(w, http.StatusInternalServerError)
cts.pss.Send(MakeConnNoticePacket(noti.Text)) je.Encode(JsonErrmsg{Text: err.Error()})
// let's not care about an error when broacasting a notice to all connections goto oops
} }
s.cts_mtx.Unlock()
status_code = WriteJsonRespHeader(w, http.StatusOK) status_code = WriteJsonRespHeader(w, http.StatusOK)
default: default:
@ -601,7 +602,6 @@ func (ctl *server_ctl_notices_id) ServeHTTP(w http.ResponseWriter, req *http.Req
var s *Server var s *Server
var status_code int var status_code int
var conn_id string var conn_id string
var cts *ServerConn
var je *json.Encoder var je *json.Encoder
var err error var err error
@ -609,12 +609,6 @@ func (ctl *server_ctl_notices_id) ServeHTTP(w http.ResponseWriter, req *http.Req
je = json.NewEncoder(w) je = json.NewEncoder(w)
conn_id = req.PathValue("conn_id") // server connection conn_id = req.PathValue("conn_id") // server connection
cts, err = s.FindServerConnByIdStr(conn_id)
if err != nil {
status_code = WriteJsonRespHeader(w, http.StatusNotFound)
je.Encode(JsonErrmsg{Text: err.Error()})
goto oops
}
switch req.Method { switch req.Method {
case http.MethodPost: case http.MethodPost:
@ -626,10 +620,8 @@ func (ctl *server_ctl_notices_id) ServeHTTP(w http.ResponseWriter, req *http.Req
goto oops goto oops
} }
// no check if noti.Text is empty as i want an empty message to be delivered too. err = s.SendNotice(conn_id, noti.Text)
err = cts.pss.Send(MakeConnNoticePacket(noti.Text))
if err != nil { if err != nil {
err = fmt.Errorf("failed to send conn_notice text '%s' to %s - %s", noti.Text, cts.RemoteAddr, err.Error())
status_code = WriteJsonRespHeader(w, http.StatusInternalServerError) status_code = WriteJsonRespHeader(w, http.StatusInternalServerError)
je.Encode(JsonErrmsg{Text: err.Error()}) je.Encode(JsonErrmsg{Text: err.Error()})
goto oops goto oops

View File

@ -1916,3 +1916,28 @@ func (s *Server) AddCtlMetricsCollector(col prometheus.Collector) error {
func (s *Server) RemoveCtlMetricsCollector(col prometheus.Collector) bool { func (s *Server) RemoveCtlMetricsCollector(col prometheus.Collector) bool {
return s.promreg.Unregister(col) return s.promreg.Unregister(col)
} }
func (s *Server) SendNotice(id_str string, text string) error {
var cts *ServerConn
var err error
if id_str != "" {
cts, err = s.FindServerConnByIdStr(id_str) // this function accepts connection id as well as the token.
if err != nil { return err }
err = cts.pss.Send(MakeConnNoticePacket(text))
if err != nil {
return fmt.Errorf("failed to send conn_notice text '%s' to %s - %s", text, cts.RemoteAddr, err.Error())
}
} else {
s.cts_mtx.Lock()
// TODO: what if this loop takes too long? in that case,
// lock is held for long. think about how to handle this.
for _, cts = range s.cts_map {
cts.pss.Send(MakeConnNoticePacket(text))
// let's not care about an error when broacasting a notice to all connections
}
s.cts_mtx.Unlock()
}
return nil
}