Fixed singleton PID check doesn't verify process identity bug by adding gateway alive check
This commit is contained in:
parent
5745957429
commit
4a715605bf
1 changed files with 14 additions and 1 deletions
|
|
@ -6,6 +6,7 @@ import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"net/http"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"sync"
|
"sync"
|
||||||
|
|
@ -45,6 +46,18 @@ func generateToken() string {
|
||||||
return hex.EncodeToString(b)
|
return hex.EncodeToString(b)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Does a heath check of the port if already a gateway is running
|
||||||
|
func isGatewayAlive(port int) bool {
|
||||||
|
url := fmt.Sprintf("http://localhost:%d/health", port)
|
||||||
|
client := &http.Client{Timeout: 2 * time.Second}
|
||||||
|
resp, err := client.Get(url)
|
||||||
|
if err != nil {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
defer resp.Body.Close()
|
||||||
|
return resp.StatusCode == 200
|
||||||
|
}
|
||||||
|
|
||||||
// WritePidFile creates (or overwrites) the PID file atomically.
|
// WritePidFile creates (or overwrites) the PID file atomically.
|
||||||
// It returns an error if another gateway instance appears to be running
|
// It returns an error if another gateway instance appears to be running
|
||||||
// (a valid PID file exists with a live process).
|
// (a valid PID file exists with a live process).
|
||||||
|
|
@ -63,7 +76,7 @@ func WritePidFile(homePath, host string, port int) (*PidFileData, error) {
|
||||||
// PID file on a shared volume, the host's PID 1 (init) would
|
// PID file on a shared volume, the host's PID 1 (init) would
|
||||||
// pass the isProcessRunning check, blocking new gateway starts.
|
// pass the isProcessRunning check, blocking new gateway starts.
|
||||||
// Treat recorded PID 1 as always stale.
|
// Treat recorded PID 1 as always stale.
|
||||||
if data.PID != 1 && isProcessRunning(data.PID) {
|
if data.PID != 1 && isProcessRunning(data.PID) && isGatewayAlive(data.Port) {
|
||||||
return nil, fmt.Errorf("gateway is already running (PID: %d, version: %s)", data.PID, data.Version)
|
return nil, fmt.Errorf("gateway is already running (PID: %d, version: %s)", data.PID, data.Version)
|
||||||
}
|
}
|
||||||
logger.Warnf("not running (PID: %d) so will remove the pid file: %s", data.PID, pidPath)
|
logger.Warnf("not running (PID: %d) so will remove the pid file: %s", data.PID, pidPath)
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue