@@ -22,6 +22,7 @@ import (
22
22
"runtime"
23
23
"strconv"
24
24
"strings"
25
+ "sync"
25
26
"syscall"
26
27
"time"
27
28
@@ -78,21 +79,7 @@ var ring0Cmd = &cobra.Command{
78
79
79
80
defer log .Info ("ring0 stopped" )
80
81
81
- ctx , cancel := context .WithTimeout (context .Background (), 120 * time .Second )
82
- defer cancel ()
83
-
84
- client , err := connectToInWorkspaceDaemonService (ctx )
85
- if err != nil {
86
- log .WithError (err ).Error ("cannot connect to daemon from ring0" )
87
- return
88
- }
89
-
90
- prep , err := client .PrepareForUserNS (ctx , & daemonapi.PrepareForUserNSRequest {})
91
- if err != nil {
92
- log .WithError (err ).Fatal ("cannot prepare for user namespaces" )
93
- return
94
- }
95
- client .Close ()
82
+ var err error
96
83
97
84
defer func () {
98
85
ctx , cancel := context .WithTimeout (context .Background (), 10 * time .Second )
@@ -119,10 +106,6 @@ var ring0Cmd = &cobra.Command{
119
106
cmd .Stdin = os .Stdin
120
107
cmd .Stdout = os .Stdout
121
108
cmd .Stderr = os .Stderr
122
- cmd .Env = append (os .Environ (),
123
- "WORKSPACEKIT_FSSHIFT=" + prep .FsShift .String (),
124
- fmt .Sprintf ("WORKSPACEKIT_NO_WORKSPACE_MOUNT=%v" , prep .FullWorkspaceBackup || prep .PersistentVolumeClaim ),
125
- )
126
109
127
110
if err := cmd .Start (); err != nil {
128
111
log .WithError (err ).Error ("failed to start ring0" )
@@ -210,7 +193,7 @@ var ring1Cmd = &cobra.Command{
210
193
211
194
defer log .Info ("ring1 stopped" )
212
195
213
- ctx , cancel := context .WithTimeout (context .Background (), 10 * time .Second )
196
+ ctx , cancel := context .WithTimeout (context .Background (), 120 * time .Second )
214
197
defer cancel ()
215
198
216
199
mapping := []* daemonapi.WriteIDMappingRequest_Mapping {
@@ -258,11 +241,23 @@ var ring1Cmd = &cobra.Command{
258
241
log .WithError (err ).Fatal ("cannot create tempdir" )
259
242
}
260
243
261
- var fsshift api.FSShiftMethod
262
- if v , ok := api .FSShiftMethod_value [os .Getenv ("WORKSPACEKIT_FSSHIFT" )]; ! ok {
263
- log .WithField ("fsshift" , os .Getenv ("WORKSPACEKIT_FSSHIFT" )).Fatal ("unknown FS shift method" )
264
- } else {
265
- fsshift = api .FSShiftMethod (v )
244
+ client , err := connectToInWorkspaceDaemonService (ctx )
245
+ if err != nil {
246
+ log .WithError (err ).Error ("cannot connect to daemon from ring0" )
247
+ return
248
+ }
249
+ var closeOnce sync.Once
250
+ closeClient := func () {
251
+ closeOnce .Do (func () { client .Close () })
252
+ }
253
+ defer closeClient ()
254
+
255
+ prep , err := client .PrepareForUserNS (ctx , & daemonapi.PrepareForUserNSRequest {
256
+ UsernsPid : int64 (os .Getpid ()),
257
+ })
258
+ if err != nil {
259
+ log .WithError (err ).Fatal ("cannot prepare for user namespaces" )
260
+ return
266
261
}
267
262
268
263
type mnte struct {
@@ -273,8 +268,8 @@ var ring1Cmd = &cobra.Command{
273
268
}
274
269
275
270
var mnts []mnte
276
- switch fsshift {
277
- case api .FSShiftMethod_FUSE :
271
+ switch prep . FsShift {
272
+ case api .FSShiftMethod_FUSE , api . FSShiftMethod_IDMAPPED :
278
273
mnts = append (mnts ,
279
274
mnte {Target : "/" , Source : "/.workspace/mark" , Flags : unix .MS_BIND | unix .MS_REC },
280
275
)
@@ -283,7 +278,7 @@ var ring1Cmd = &cobra.Command{
283
278
mnte {Target : "/" , Source : "/.workspace/mark" , FSType : "shiftfs" },
284
279
)
285
280
default :
286
- log .WithField ("fsshift" , fsshift ).Fatal ("unknown FS shift method" )
281
+ log .WithField ("fsshift" , prep . FsShift ).Fatal ("unknown FS shift method" )
287
282
}
288
283
289
284
procMounts , err := ioutil .ReadFile ("/proc/mounts" )
@@ -320,7 +315,7 @@ var ring1Cmd = &cobra.Command{
320
315
// FWB workspaces do not require mounting /workspace
321
316
// if that is done, the backup will not contain any change in the directory
322
317
// same applies to persistent volume claims, we cannot mount /workspace folder when PVC is used
323
- if os . Getenv ( "WORKSPACEKIT_NO_WORKSPACE_MOUNT" ) != "true" {
318
+ if ! prep . PersistentVolumeClaim && ! prep . FullWorkspaceBackup {
324
319
mnts = append (mnts ,
325
320
mnte {Target : "/workspace" , Flags : unix .MS_BIND | unix .MS_REC },
326
321
)
@@ -410,29 +405,21 @@ var ring1Cmd = &cobra.Command{
410
405
log .WithError (err ).Error ("cannot create directory for mounting proc" )
411
406
return
412
407
}
413
-
414
- client , err := connectToInWorkspaceDaemonService (ctx )
415
- if err != nil {
416
- log .WithError (err ).Error ("cannot connect to daemon from ring1" )
417
- return
418
- }
419
408
_ , err = client .MountProc (ctx , & daemonapi.MountProcRequest {
420
409
Target : procLoc ,
421
410
Pid : int64 (cmd .Process .Pid ),
422
411
})
423
412
if err != nil {
424
- client .Close ()
425
413
log .WithError (err ).Error ("cannot mount proc" )
426
414
return
427
415
}
428
416
429
417
_ , err = client .EvacuateCGroup (ctx , & daemonapi.EvacuateCGroupRequest {})
430
418
if err != nil {
431
- client .Close ()
432
419
log .WithError (err ).Error ("cannot evacuate cgroup" )
433
420
return
434
421
}
435
- client . Close ()
422
+ defer closeClient ()
436
423
437
424
// We have to wait for ring2 to come back to us and connect to the socket we've passed along.
438
425
// There's a chance that ring2 crashes or misbehaves, so we don't want to wait forever, hence
@@ -496,7 +483,7 @@ var ring1Cmd = &cobra.Command{
496
483
_ , err = msgutil .MarshalToWriter (ring2Conn , ringSyncMsg {
497
484
Stage : 1 ,
498
485
Rootfs : ring2Root ,
499
- FSShift : fsshift ,
486
+ FSShift : prep . FsShift ,
500
487
})
501
488
if err != nil {
502
489
log .WithError (err ).Error ("cannot send ring sync msg to ring2" )
0 commit comments