diff --git a/go.mod b/go.mod index 2f62166..15eeb93 100644 --- a/go.mod +++ b/go.mod @@ -8,7 +8,6 @@ require ( ) require ( - github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0 // indirect - github.com/sevlyar/go-daemon v0.1.6 - golang.org/x/sys v0.29.0 // indirect + github.com/linkdata/deadlock v0.5.2 // indirect + github.com/petermattis/goid v0.0.0-20240813172612-4fcff4a6cae7 // indirect ) diff --git a/go.sum b/go.sum index 54428a7..b9235d1 100644 --- a/go.sum +++ b/go.sum @@ -2,8 +2,12 @@ github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0 h1:iQTw/8FWTuc7uiaSepXwyf3o52HaUYcV+Tu66S3F5GA= github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0/go.mod h1:1NbS8ALrpOvjt0rHPNLyCIeMtbizbir8U//inJ+zuB8= +github.com/linkdata/deadlock v0.5.2 h1:clEEeRsMJCrEm5SuBI3v2l3sdCSP74p0ii+C1rR9nA0= +github.com/linkdata/deadlock v0.5.2/go.mod h1:M3Td2tmYASdLm6xblKGlFvfu8SI+nPjrB7mDeFDEz/k= github.com/op/go-logging v0.0.0-20160315200505-970db520ece7 h1:lDH9UUVJtmYCjyT0CI4q8xvlXPxeZ0gYCVvWbmPlp88= github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= +github.com/petermattis/goid v0.0.0-20240813172612-4fcff4a6cae7 h1:Dx7Ovyv/SFnMFw3fD4oEoeorXc6saIiQ23LrGLth0Gw= +github.com/petermattis/goid v0.0.0-20240813172612-4fcff4a6cae7/go.mod h1:pxMtw7cyUw6B2bRH0ZBANSPg+AoSud1I1iyJHI69jH4= github.com/sevlyar/go-daemon v0.1.6 h1:EUh1MDjEM4BI109Jign0EaknA2izkOyi0LV3ro3QQGs= github.com/sevlyar/go-daemon v0.1.6/go.mod h1:6dJpPatBT9eUwM5VCw9Bt6CdX9Tk6UWvhW3MebLDRKE= golang.org/x/sys v0.29.0 h1:TPYlXGxvx1MGTn2GiZDhnjPA9wZzZeGKHHmKhHYvgaU= diff --git a/main.go b/main.go index 91c7827..221854d 100644 --- a/main.go +++ b/main.go @@ -14,13 +14,11 @@ import ( "net/netip" "os" "os/signal" - "strconv" "strings" "syscall" "time" "github.com/op/go-logging" - "github.com/sevlyar/go-daemon" ) var isNode bool @@ -29,8 +27,6 @@ var isRpc bool var configPath string var bootstrap bool var justNodeId bool -var daemonize bool -var pidPath string type LogConfig struct { XMLName xml.Name `xml:"log"` @@ -128,49 +124,6 @@ func bootstrapNode() { var log = logging.MustGetLogger("main") -func becomeDaemon() { - cwd, err := os.Getwd() - if err != nil { - log.Criticalf("Getwd failed: %v", err) - os.Exit(1) - } - - ctx := &daemon.Context{ - PidFileName: pidPath, - PidFilePerm: 0644, - WorkDir: cwd, - Umask: 002, - } - - dmn, err := ctx.Reborn() - if err != nil { - log.Criticalf("ctx.Reborn failed: %v", err) - os.Exit(1) - } - if dmn != nil { - - // parent process no longer needed - os.Exit(0) - } - - // -- WE ARE NOW THE DAEMON -- - - // write pid - if pidPath != "" { - pidFile, err := os.OpenFile(pidPath, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, os.FileMode(0644)) - if err != nil { - log.Errorf("failed to create pidfile: %v", err) - } - defer pidFile.Close() - - pidBytes := []byte(strconv.Itoa(os.Getpid())) - _, err = pidFile.Write(pidBytes) - if err != nil { - log.Errorf("failed to write pidfile: %v", err) - } - } -} - func nodeMain() { xmlBytes, err := os.ReadFile(configPath) if err != nil { @@ -187,11 +140,6 @@ func nodeMain() { // setup logging setupLogging(config.Log) - // only after logging setup, we may became daemon - if daemonize { - becomeDaemon() - } - // check presense of keystore and id in config if config.KeyStore == "" { log.Critical("no keystore path specified!") @@ -324,9 +272,7 @@ signaling: sig := <-sigs log.Debug(sig) switch sig { - case syscall.SIGINT: - break signaling - case syscall.SIGTERM: + case syscall.SIGINT, syscall.SIGTERM: break signaling } } @@ -537,11 +483,6 @@ func hostMain() { // setup logging setupLogging(config.Log) - // daemonize if needed - if daemonize { - becomeDaemon() - } - // create host host := host.NewLuxHost(config.Hostname, hostKey, ks) @@ -861,8 +802,6 @@ func main() { flag.StringVar(&configPath, "config", "", "node or host config") flag.BoolVar(&bootstrap, "bootstrap", false, "bootstrap node keystore. config must be specified") flag.BoolVar(&justNodeId, "just-node-id", false, "when bootstrapping only output node id to stdout") - flag.BoolVar(&daemonize, "daemon", false, "run LUX as daemon in background") - flag.StringVar(&pidPath, "pid", "", "after daemonization LUX will write its PID here") flag.StringVar(&rpcPath, "rpc", "", "Run as RPC client, specify path to RPC UNIX socket or TCP socket, must be in unix:// or tcp:// form") flag.StringVar(&rpcNewHost, "rpc-new-host", "", "RPC node create new host, specifies path for new keystore") diff --git a/net/lux_router.go b/net/lux_router.go index c414c19..81cb6a5 100644 --- a/net/lux_router.go +++ b/net/lux_router.go @@ -8,7 +8,8 @@ import ( "lux/proto" "lux/rpc" "net" - "sync" + + "github.com/linkdata/deadlock" ) type LuxRouteType int @@ -83,7 +84,7 @@ type LuxRouter struct { routes map[proto.LuxID]*LuxRoute - channelLock sync.RWMutex + channelLock deadlock.RWMutex outbound []LuxChannel inbound []LuxChannel @@ -242,18 +243,15 @@ func (r *LuxRouter) Start() { } func (r *LuxRouter) Stop() { - // close all channels - r.channelLock.Lock() + // close all channel for _, inbound := range r.inbound { - inbound.Close() + //inbound.Close() + r.CloseChannel(&inbound, true) } - r.inbound = r.inbound[0:] - for _, outbound := range r.outbound { - outbound.Close() + //outbound.Close() + r.CloseChannel(&outbound, false) } - r.outbound = r.outbound[0:] - r.channelLock.Unlock() r.routes = make(map[proto.LuxID]*LuxRoute) } diff --git a/node/lux_node.go b/node/lux_node.go index 36884a5..29cccca 100644 --- a/node/lux_node.go +++ b/node/lux_node.go @@ -7,9 +7,10 @@ import ( "lux/net" "lux/proto" "lux/rpc" - "sync" ipnet "net" + + "github.com/linkdata/deadlock" ) type LuxNode struct { @@ -18,10 +19,10 @@ type LuxNode struct { running bool neighbors map[proto.LuxID]*ipnet.UDPAddr - neighborLock sync.RWMutex + neighborLock deadlock.RWMutex state LuxNodeState - stateLock sync.RWMutex + stateLock deadlock.RWMutex genlist net.LuxNonceList @@ -96,7 +97,7 @@ func (node *LuxNode) GetState() *LuxNodeState { return &node.state } -func (node *LuxNode) GetStateLock() *sync.RWMutex { +func (node *LuxNode) GetStateLock() *deadlock.RWMutex { return &node.stateLock }