MCPcopy Create free account
hub / github.com/convox/rack / execTar

Method execTar

pkg/sync/sync.go:172–238  ·  view source on GitHub ↗
(cmd []string, st Stream)

Source from the content-addressed store, hash-verified

170}
171
172func (s *Sync) execTar(cmd []string, st Stream) error {
173 retries := 0
174 success := false
175
176 for {
177 exec, err := s.docker.CreateExec(docker.CreateExecOptions{
178 AttachStdout: true,
179 Container: s.Container,
180 Cmd: cmd,
181 })
182 if err != nil {
183 return err
184 }
185
186 r, w := io.Pipe()
187
188 cw, err := s.docker.StartExecNonBlocking(exec.ID, docker.StartExecOptions{
189 OutputStream: w,
190 })
191 if err != nil {
192 if cw != nil {
193 cw.Close()
194 }
195 return err
196 }
197
198 done := make(chan struct{})
199 state := make(chan execState)
200 wait := make(chan error)
201
202 go func() {
203 wait <- cw.Wait()
204 }()
205 go tgzReader(s, r, st)
206 go inspectExec(exec.ID, s, state, done)
207
208 select {
209 case err := <-wait:
210 if err != nil {
211 return err
212 }
213
214 close(done)
215 success = true
216
217 case es := <-state:
218 cw.Close()
219
220 if retries < 3 {
221 retries++
222 if es.Error == nil && es.ExitCode == 0 {
223 success = true
224 }
225 } else {
226 if es.Error != nil {
227 return es.Error
228 }
229 return fmt.Errorf("failed to sync after retries")

Callers 1

syncIncomingAddsMethod · 0.95

Calls 4

tgzReaderFunction · 0.85
inspectExecFunction · 0.85
WaitMethod · 0.80
CloseMethod · 0.45

Tested by

no test coverage detected