diff --git a/web/server/tdbms-client.go b/web/server/tdbms-client.go index dba36eb..9be3ff8 100644 --- a/web/server/tdbms-client.go +++ b/web/server/tdbms-client.go @@ -7,13 +7,29 @@ import ( // TDBMS connection struct type TDBMSConnection struct { - conn net.Conn + domain string + addr string + conn net.Conn } // Connect to TDBMS server func (tdbms *TDBMSConnection) Connect(domain, addr string) error { c, err := net.Dial(domain, addr) - tdbms.conn = c + if err == nil { + tdbms.domain = domain + tdbms.addr = addr + tdbms.conn = c + } + return err +} + +// Reconnect to TDBMS server +func (tdbms *TDBMSConnection) Reconnect() error { + tdbms.Close() + c, err := net.Dial(tdbms.domain, tdbms.addr) + if err == nil { + tdbms.conn = c + } return err } diff --git a/web/server/web-server.go b/web/server/web-server.go index 3900a88..57a2364 100644 --- a/web/server/web-server.go +++ b/web/server/web-server.go @@ -139,10 +139,21 @@ func HandlerTDBMS(w http.ResponseWriter, r *http.Request) { } response = tdbms.Query(request.TRDB, request.TRC, request.TRB) if response == nil { - http.Error(w, "Failed to execute request", http.StatusInternalServerError) - defer log.Println("Failed to execute request") - return + log.Println("Failed to get TDBMS response. Trying to reconnect to TDBMS server...") + err = tdbms.Reconnect() + if err != nil { + http.Error(w, "TDBMS is down", http.StatusServiceUnavailable) + defer log.Println("TDBMS is down") + return + } + response = tdbms.Query(request.TRDB, request.TRC, request.TRB) + if response == nil { + http.Error(w, "Failed to get TDBMS response", http.StatusInternalServerError) + defer log.Println("Failed to get TDBMS response") + return + } } + log.Println("Got TDBMS response") if request.TRDB == "$TFM" && (request.TRC == 0b10000 || request.TRC == 0b101000) { var json_response JSON err = json.Unmarshal(response, &json_response)