@@ -124,7 +124,7 @@ func superminPrepare(prepareDir, export string) error {
124
124
"osbuild" , "osbuild-depsolve-dnf" , "osbuild-lvm2" , "osbuild-luks2" , "osbuild-ostree" ,
125
125
// lvm
126
126
"lvm2" ,
127
- // target"
127
+ // target dir
128
128
"-o" , prepareDir ,
129
129
)
130
130
if err != nil {
@@ -151,7 +151,26 @@ func superminBuild(prepareDir, buildDir string) error {
151
151
return nil
152
152
}
153
153
154
- func setupVirtiofsd (tmpDir , outputDir , storeDir string ) (func (), error ) {
154
+ func waitForFiles (maxWait time.Duration , paths ... string ) error {
155
+ start := time .Now ()
156
+ for {
157
+ var missingPaths []string
158
+ for _ , path := range paths {
159
+ if _ , err := os .Stat (path ); err != nil {
160
+ missingPaths = append (missingPaths , path )
161
+ }
162
+ }
163
+ if len (missingPaths ) == 0 {
164
+ return nil
165
+ }
166
+ if time .Since (start ) >= maxWait {
167
+ return fmt .Errorf ("files missing after %v: %v" , maxWait , missingPaths )
168
+ }
169
+ time .Sleep (100 * time .Millisecond )
170
+ }
171
+ }
172
+
173
+ func setupVirtiofsd (tmpDir , outputDir , storeDir string ) (cleanup func (), err error ) {
155
174
var cmds []* exec.Cmd
156
175
var cleanupFunc = func () {
157
176
for _ , cmd := range cmds {
@@ -160,14 +179,22 @@ func setupVirtiofsd(tmpDir, outputDir, storeDir string) (func(), error) {
160
179
}
161
180
}
162
181
}
182
+ defer func () {
183
+ if err != nil {
184
+ cleanupFunc ()
185
+ }
186
+ }()
163
187
188
+ var socketPaths []string
164
189
for _ , mnt := range []struct {
165
190
path , tag string
166
191
}{
167
192
{outputDir , "output" },
168
193
{storeDir , "store" },
169
194
} {
170
195
socketPath := filepath .Join (tmpDir , fmt .Sprintf ("vfsd_%s.sock" , mnt .tag ))
196
+ socketPaths = append (socketPaths , socketPath )
197
+
171
198
var args []string
172
199
// run virtiofsd in user namespace if non-root to make
173
200
// chown() and friends inside the VM work
@@ -193,13 +220,13 @@ func setupVirtiofsd(tmpDir, outputDir, storeDir string) (func(), error) {
193
220
cmd .Stdout = os .Stdout
194
221
cmd .Stderr = os .Stderr
195
222
if err := cmd .Start (); err != nil {
196
- cleanupFunc ()
197
223
return nil , err
198
224
}
199
225
cmds = append (cmds , cmd )
200
226
}
201
- // XXX: wait for socket to appear
202
- time .Sleep (2 * time .Second )
227
+ if err := waitForFiles (10 * time .Second , socketPaths ... ); err != nil {
228
+ return nil , fmt .Errorf ("expected socket did not appear: %w" , err )
229
+ }
203
230
204
231
return cleanupFunc , nil
205
232
}
0 commit comments