@@ -373,42 +373,22 @@ func compileAndRun(ctx context.Context, req *request) (*response, error) {
373373 }
374374 }
375375
376- // TODO: simplify this once Go 1.14 is out. We should remove
377- // the //play:gvisor substring hack and DEBUG_FORCE_GVISOR and
378- // instead implement https://golang.org/issue/33629 to
379- // officially support different Go versions (Go tip + past two
380- // releases).
381- useGvisor := os .Getenv ("GO_VERSION" ) >= "go1.14" ||
382- os .Getenv ("DEBUG_FORCE_GVISOR" ) == "1" ||
383- strings .Contains (req .Body , "//play:gvisor\n " )
384-
385376 exe := filepath .Join (tmpDir , "a.out" )
386377 goCache := filepath .Join (tmpDir , "gocache" )
387378
388379 buildCtx , cancel := context .WithTimeout (ctx , maxCompileTime )
389380 defer cancel ()
390- goBin := "go"
391- if useGvisor {
392- goBin = "/usr/local/go1.14/bin/go"
393- }
394- cmd := exec .CommandContext (buildCtx , goBin ,
395- "build" ,
396- "-o" , exe ,
397- "-tags=faketime" , // required for Go 1.14+, no-op before
398- buildPkgArg )
381+ cmd := exec .CommandContext (ctx , "/usr/local/go-faketime/bin/go" , "build" , "-o" , exe , "-tags=faketime" , buildPkgArg )
399382 cmd .Dir = tmpDir
400383 var goPath string
401- if useGvisor {
402- cmd .Env = []string {"GOOS=linux" , "GOARCH=amd64" , "GOROOT=/usr/local/go1.14" }
403- } else {
404- cmd .Env = []string {"GOOS=nacl" , "GOARCH=amd64p32" }
405- }
384+ cmd .Env = []string {"GOOS=linux" , "GOARCH=amd64" , "GOROOT=/usr/local/go-faketime" }
406385 cmd .Env = append (cmd .Env , "GOCACHE=" + goCache )
407386 if useModules {
408387 // Create a GOPATH just for modules to be downloaded
409388 // into GOPATH/pkg/mod.
410389 goPath , err = ioutil .TempDir ("" , "gopath" )
411390 if err != nil {
391+ log .Printf ("error creating temp directory: %v" , err )
412392 return nil , fmt .Errorf ("error creating temp directory: %v" , err )
413393 }
414394 defer os .RemoveAll (goPath )
@@ -438,72 +418,53 @@ func compileAndRun(ctx context.Context, req *request) (*response, error) {
438418 }
439419 return nil , fmt .Errorf ("error building go source: %v" , err )
440420 }
441- runCtx , cancel := context .WithTimeout (ctx , maxRunTime )
442- defer cancel ()
443421 rec := new (Recorder )
444422 var exitCode int
445- if useGvisor {
446- const maxBinarySize = 100 << 20 // copied from sandbox backend; TODO: unify?
447- if fi , err := os .Stat (exe ); err != nil || fi .Size () == 0 || fi .Size () > maxBinarySize {
448- if err != nil {
449- return nil , fmt .Errorf ("failed to stat binary: %v" , err )
450- }
451- return nil , fmt .Errorf ("invalid binary size %d" , fi .Size ())
452- }
453- exeBytes , err := ioutil .ReadFile (exe )
454- if err != nil {
455- return nil , err
456- }
457- req , err := http .NewRequestWithContext (runCtx , "POST" , sandboxBackendURL (), bytes .NewReader (exeBytes ))
423+ const maxBinarySize = 100 << 20 // copied from sandbox backend; TODO: unify?
424+ if fi , err := os .Stat (exe ); err != nil || fi .Size () == 0 || fi .Size () > maxBinarySize {
458425 if err != nil {
459- return nil , err
460- }
461- req .Header .Add ("Idempotency-Key" , "1" ) // lets Transport do retries with a POST
462- if testParam != "" {
463- req .Header .Add ("X-Argument" , testParam )
464- }
465- req .GetBody = func () (io.ReadCloser , error ) { return ioutil .NopCloser (bytes .NewReader (exeBytes )), nil }
466- res , err := sandboxBackendClient ().Do (req )
467- if err != nil {
468- return nil , err
469- }
470- defer res .Body .Close ()
471- if res .StatusCode != http .StatusOK {
472- return nil , fmt .Errorf ("unexpected response from backend: %v" , res .Status )
473- }
474- var execRes sandboxtypes.Response
475- if err := json .NewDecoder (res .Body ).Decode (& execRes ); err != nil {
476- log .Printf ("JSON decode error from backend: %v" , err )
477- return nil , errors .New ("error parsing JSON from backend" )
478- }
479- if execRes .Error != "" {
480- return & response {Errors : execRes .Error }, nil
481- }
482- exitCode = execRes .ExitCode
483- rec .Stdout ().Write (execRes .Stdout )
484- rec .Stderr ().Write (execRes .Stderr )
485- } else {
486- cmd := exec .CommandContext (runCtx , "sel_ldr_x86_64" , "-l" , "/dev/null" , "-S" , "-e" , exe , testParam )
487- cmd .Stdout = rec .Stdout ()
488- cmd .Stderr = rec .Stderr ()
489- if err := cmd .Run (); err != nil {
490- if runCtx .Err () == context .DeadlineExceeded {
491- // Send what was captured before the timeout.
492- events , err := rec .Events ()
493- if err != nil {
494- return nil , fmt .Errorf ("error decoding events: %v" , err )
495- }
496- return & response {Errors : "process took too long" , Events : events }, nil
497- }
498- exitErr , ok := err .(* exec.ExitError )
499- if ! ok {
500- return nil , fmt .Errorf ("error running sandbox: %v" , err )
501- }
502- exitCode = exitErr .ExitCode ()
426+ return nil , fmt .Errorf ("failed to stat binary: %v" , err )
503427 }
428+ return nil , fmt .Errorf ("invalid binary size %d" , fi .Size ())
429+ }
430+ exeBytes , err := ioutil .ReadFile (exe )
431+ if err != nil {
432+ return nil , err
433+ }
434+ runCtx , cancel := context .WithTimeout (ctx , maxRunTime )
435+ defer cancel ()
436+ sreq , err := http .NewRequestWithContext (runCtx , "POST" , sandboxBackendURL (), bytes .NewReader (exeBytes ))
437+ if err != nil {
438+ return nil , fmt .Errorf ("NewRequestWithContext %q: %w" , sandboxBackendURL (), err )
439+ }
440+ sreq .Header .Add ("Idempotency-Key" , "1" ) // lets Transport do retries with a POST
441+ if testParam != "" {
442+ sreq .Header .Add ("X-Argument" , testParam )
443+ }
444+ sreq .GetBody = func () (io.ReadCloser , error ) { return ioutil .NopCloser (bytes .NewReader (exeBytes )), nil }
445+ res , err := sandboxBackendClient ().Do (sreq )
446+ if err != nil {
447+ return nil , fmt .Errorf ("POST %q: %w" , sandboxBackendURL (), err )
448+ }
449+ defer res .Body .Close ()
450+ if res .StatusCode != http .StatusOK {
451+ log .Printf ("unexpected response from backend: %v" , res .Status )
452+ return nil , fmt .Errorf ("unexpected response from backend: %v" , res .Status )
453+ }
454+ var execRes sandboxtypes.Response
455+ if err := json .NewDecoder (res .Body ).Decode (& execRes ); err != nil {
456+ log .Printf ("JSON decode error from backend: %v" , err )
457+ return nil , errors .New ("error parsing JSON from backend" )
458+ }
459+ if execRes .Error != "" {
460+ return & response {Errors : execRes .Error }, nil
504461 }
462+ exitCode = execRes .ExitCode
463+ rec .Stdout ().Write (execRes .Stdout )
464+ rec .Stderr ().Write (execRes .Stderr )
505465 events , err := rec .Events ()
506466 if err != nil {
467+ log .Printf ("error decoding events: %v" , err )
507468 return nil , fmt .Errorf ("error decoding events: %v" , err )
508469 }
509470 var fails int
0 commit comments