Skip to content

Commit 0a03c6f

Browse files
authored
fix: kill orphaned provider processes on server start (#136)
1 parent 79f5df2 commit 0a03c6f

File tree

5 files changed

+57
-16
lines changed

5 files changed

+57
-16
lines changed

go.mod

+4
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ require (
2424
github.com/pkg/sftp v1.13.6
2525
github.com/reactivex/rxgo/v2 v2.5.0
2626
github.com/rs/zerolog v1.31.0
27+
github.com/shirou/gopsutil v3.21.11+incompatible
2728
github.com/sirupsen/logrus v1.9.3
2829
github.com/spf13/cobra v1.8.0
2930
github.com/swaggo/files v1.0.1
@@ -186,12 +187,15 @@ require (
186187
github.com/templexxx/cpufeat v0.0.0-20180724012125-cef66df7f161 // indirect
187188
github.com/templexxx/xor v0.0.0-20191217153810-f85b25db303b // indirect
188189
github.com/tjfoc/gmsm v1.4.1 // indirect
190+
github.com/tklauser/go-sysconf v0.3.13 // indirect
191+
github.com/tklauser/numcpus v0.7.0 // indirect
189192
github.com/twitchyliquid64/golang-asm v0.15.1 // indirect
190193
github.com/u-root/uio v0.0.0-20230305220412-3e8cd9d6bf63 // indirect
191194
github.com/ugorji/go/codec v1.2.11 // indirect
192195
github.com/vishvananda/netlink v1.2.1-beta.2 // indirect
193196
github.com/vishvananda/netns v0.0.4 // indirect
194197
github.com/x448/float16 v0.8.4 // indirect
198+
github.com/yusufpapurcu/wmi v1.2.4 // indirect
195199
go.uber.org/multierr v1.11.0 // indirect
196200
go4.org/mem v0.0.0-20220726221520-4f986261bf13 // indirect
197201
go4.org/netipx v0.0.0-20230824141953-6213f710f925 // indirect

go.sum

+10
Original file line numberDiff line numberDiff line change
@@ -838,6 +838,7 @@ github.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpx
838838
github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=
839839
github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ=
840840
github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
841+
github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0=
841842
github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE=
842843
github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78=
843844
github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=
@@ -1273,6 +1274,8 @@ github.com/sahilm/fuzzy v0.1.1-0.20230530133925-c48e322e2a8f h1:MvTmaQdww/z0Q4wr
12731274
github.com/sahilm/fuzzy v0.1.1-0.20230530133925-c48e322e2a8f/go.mod h1:VFvziUEIMCrT6A6tw2RFIXPXXmzXbOsSHF0DOI8ZK9Y=
12741275
github.com/samber/lo v1.38.1 h1:j2XEAqXKb09Am4ebOg31SpvzUTTs6EN3VfgeLUhPdXM=
12751276
github.com/samber/lo v1.38.1/go.mod h1:+m/ZKRl6ClXCE2Lgf3MsQlWfh4bn1bz6CXEOxnEXnEA=
1277+
github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI=
1278+
github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA=
12761279
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
12771280
github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ=
12781281
github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
@@ -1353,6 +1356,10 @@ github.com/tink-crypto/tink-go/v2 v2.0.0 h1:LutFJapahsM0i/6hKfOkzSYTVeshmFs+jloZ
13531356
github.com/tink-crypto/tink-go/v2 v2.0.0/go.mod h1:QAbyq9LZncomYnScxlfaHImbV4ieNIe6bnu/Xcqqox4=
13541357
github.com/tjfoc/gmsm v1.4.1 h1:aMe1GlZb+0bLjn+cKTPEvvn9oUEBlJitaZiiBwsbgho=
13551358
github.com/tjfoc/gmsm v1.4.1/go.mod h1:j4INPkHWMrhJb38G+J6W4Tw0AbuN8Thu3PbdVYhVcTE=
1359+
github.com/tklauser/go-sysconf v0.3.13 h1:GBUpcahXSpR2xN01jhkNAbTLRk2Yzgggk8IM08lq3r4=
1360+
github.com/tklauser/go-sysconf v0.3.13/go.mod h1:zwleP4Q4OehZHGn4CYZDipCgg9usW5IJePewFCGVEa0=
1361+
github.com/tklauser/numcpus v0.7.0 h1:yjuerZP127QG9m5Zh/mSO4wqurYil27tHrqwRoRjpr4=
1362+
github.com/tklauser/numcpus v0.7.0/go.mod h1:bb6dMVcj8A42tSE7i32fsIUCbQNllK5iDguyOZRUzAY=
13561363
github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=
13571364
github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=
13581365
github.com/u-root/u-root v0.11.0 h1:6gCZLOeRyevw7gbTwMj3fKxnr9+yHFlgF3N7udUVNO8=
@@ -1386,6 +1393,8 @@ github.com/yuin/goldmark v1.6.0/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5ta
13861393
github.com/yuin/goldmark-emoji v1.0.1/go.mod h1:2w1E6FEWLcDQkoTE+7HU6QF1F6SLlNGjRIBbIZQFqkQ=
13871394
github.com/yuin/goldmark-emoji v1.0.2 h1:c/RgTShNgHTtc6xdz2KKI74jJr6rWi7FPgnP9GAsO5s=
13881395
github.com/yuin/goldmark-emoji v1.0.2/go.mod h1:RhP/RWpexdp+KHs7ghKnifRoIs/Bq4nDS7tRbCkOwKY=
1396+
github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0=
1397+
github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0=
13891398
github.com/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0=
13901399
github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA=
13911400
go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
@@ -1623,6 +1632,7 @@ golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7w
16231632
golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
16241633
golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
16251634
golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
1635+
golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
16261636
golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
16271637
golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
16281638
golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=

pkg/provider/manager/manager.go

+21
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,15 @@ import (
88
"os"
99
"os/exec"
1010
"path"
11+
"strings"
1112

1213
"github.com/daytonaio/daytona/internal/util"
1314
os_util "github.com/daytonaio/daytona/pkg/os"
1415
. "github.com/daytonaio/daytona/pkg/provider"
1516
"github.com/daytonaio/daytona/pkg/server/targets"
1617
"github.com/hashicorp/go-hclog"
1718
"github.com/hashicorp/go-plugin"
19+
"github.com/shirou/gopsutil/process"
1820
log "github.com/sirupsen/logrus"
1921
)
2022

@@ -167,3 +169,22 @@ func UninstallProvider(name string) error {
167169

168170
return nil
169171
}
172+
173+
func TerminateProviderProcesses(providersBasePath string) error {
174+
process, err := process.Processes()
175+
176+
if err != nil {
177+
return err
178+
}
179+
180+
for _, p := range process {
181+
if e, err := p.Exe(); err == nil && strings.HasPrefix(e, providersBasePath) {
182+
err := p.Kill()
183+
if err != nil {
184+
log.Errorf("Failed to kill process %d: %s", p.Pid, err)
185+
}
186+
}
187+
}
188+
189+
return nil
190+
}

pkg/server/api/server.go

+3-5
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ import (
3636
var httpServer *http.Server
3737
var router *gin.Engine
3838

39-
func Start() error {
39+
func GetServer() (*http.Server, error) {
4040
docs.SwaggerInfo.Version = "0.1"
4141
docs.SwaggerInfo.BasePath = "/"
4242
docs.SwaggerInfo.Description = "Daytona Server API"
@@ -56,7 +56,7 @@ func Start() error {
5656

5757
config, err := config.GetConfig()
5858
if err != nil {
59-
return err
59+
return nil, err
6060
}
6161

6262
serverController := router.Group("/server")
@@ -107,9 +107,7 @@ func Start() error {
107107
Handler: router,
108108
}
109109

110-
log.Infof("Starting api server on port %d", config.ApiPort)
111-
112-
return httpServer.ListenAndServe()
110+
return httpServer, nil
113111
}
114112

115113
func Stop() {

pkg/server/server.go

+19-11
Original file line numberDiff line numberDiff line change
@@ -4,18 +4,17 @@
44
package server
55

66
import (
7-
"fmt"
87
"net"
98
"os"
109
"os/signal"
1110
"time"
1211

12+
"github.com/daytonaio/daytona/pkg/provider/manager"
1313
"github.com/daytonaio/daytona/pkg/server/api"
1414
"github.com/daytonaio/daytona/pkg/server/config"
1515
"github.com/daytonaio/daytona/pkg/server/frpc"
1616
"github.com/daytonaio/daytona/pkg/server/headscale"
1717
"github.com/daytonaio/daytona/pkg/server/logs"
18-
"github.com/daytonaio/daytona/pkg/types"
1918
"github.com/hashicorp/go-plugin"
2019

2120
log "github.com/sirupsen/logrus"
@@ -39,6 +38,22 @@ func Start() error {
3938
return err
4039
}
4140

41+
apiServer, err := api.GetServer()
42+
if err != nil {
43+
return err
44+
}
45+
46+
apiListener, err := net.Listen("tcp", apiServer.Addr)
47+
if err != nil {
48+
return err
49+
}
50+
51+
// Terminate orphaned provider processes
52+
err = manager.TerminateProviderProcesses(c.ProvidersDir)
53+
if err != nil {
54+
log.Errorf("Failed to terminate orphaned provider processes: %s", err)
55+
}
56+
4257
err = downloadDefaultProviders()
4358
if err != nil {
4459
return err
@@ -92,13 +107,6 @@ func Start() error {
92107
}
93108
}()
94109

95-
return api.Start()
96-
}
97-
98-
func getTcpListener(c *types.ServerConfig) (*net.Listener, error) {
99-
listener, err := net.Listen("tcp", fmt.Sprintf("0.0.0.0:%d", c.ApiPort))
100-
if err != nil {
101-
return nil, err
102-
}
103-
return &listener, nil
110+
log.Infof("Starting api server on port %d", c.ApiPort)
111+
return apiServer.Serve(apiListener)
104112
}

0 commit comments

Comments
 (0)