This is an automated email from the ASF dual-hosted git repository. csantanapr pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/incubator-openwhisk-runtime-go.git
The following commit(s) were added to refs/heads/master by this push: new 83b779e fixed unsynced log bugs, cleaned test and pinned the h2non dependency (#58) 83b779e is described below commit 83b779e9bd1c3253f4a2ace8b240a8442046d11d Author: Sciabarra.com ltd <30654959+sciabarra...@users.noreply.github.com> AuthorDate: Sun Oct 28 15:15:25 2018 +0100 fixed unsynced log bugs, cleaned test and pinned the h2non dependency (#58) --- openwhisk/compiler.go | 2 +- openwhisk/executor.go | 23 ++++++++++++++--------- openwhisk/executor_test.go | 11 ++++------- openwhisk/extractor.go | 2 +- openwhisk/initHandler_test.go | 2 ++ openwhisk/runHandler.go | 10 ++++++---- openwhisk/util_test.go | 7 ++++--- 7 files changed, 32 insertions(+), 25 deletions(-) diff --git a/openwhisk/compiler.go b/openwhisk/compiler.go index a948547..412a67b 100644 --- a/openwhisk/compiler.go +++ b/openwhisk/compiler.go @@ -24,7 +24,7 @@ import ( "os/exec" "runtime" - "github.com/h2non/filetype" + "gopkg.in/h2non/filetype.v1" ) // this is only to let test run on OSX diff --git a/openwhisk/executor.go b/openwhisk/executor.go index ad1b549..1658fe8 100644 --- a/openwhisk/executor.go +++ b/openwhisk/executor.go @@ -44,14 +44,14 @@ type Executor struct { _output *bufio.Reader _logout *bufio.Reader _logerr *bufio.Reader - _outbuf *os.File - _errbuf *os.File + _outbuf *bufio.Writer + _errbuf *bufio.Writer } // NewExecutor creates a child subprocess using the provided command line, // writing the logs in the given file. // You can then start it getting a communication channel -func NewExecutor(outbuf *os.File, errbuf *os.File, command string, args ...string) (proc *Executor) { +func NewExecutor(logout *os.File, logerr *os.File, command string, args ...string) (proc *Executor) { cmd := exec.Command(command, args...) cmd.Env = []string{ "__OW_API_HOST=" + os.Getenv("__OW_API_HOST"), @@ -85,6 +85,8 @@ func NewExecutor(outbuf *os.File, errbuf *os.File, command string, args ...strin pout := bufio.NewReader(pipeOut) sout := bufio.NewReader(stdout) serr := bufio.NewReader(stderr) + outbuf := bufio.NewWriter(logout) + errbuf := bufio.NewWriter(logerr) return &Executor{ make(chan []byte), @@ -129,17 +131,19 @@ func (proc *Executor) run() { Debug("run: end") } -func drain(ch chan string, out *os.File) { +func drain(ch chan string, out *bufio.Writer) { for loop := true; loop; { runtime.Gosched() select { case buf := <-ch: fmt.Fprint(out, buf) + out.Flush() case <-time.After(DefaultTimeoutDrain): loop = false } } fmt.Fprintln(out, OutputGuard) + out.Flush() } // manage copying stdout and stder in output @@ -152,15 +156,16 @@ func (proc *Executor) logger() { chErr := make(chan string) go _collect(chErr, proc._logerr) - // wait for the signal + // loop draining the loop until asked to exit for <-proc.log { - // flush stdout + // drain stdout + Debug("draining stdout") drain(chOut, proc._outbuf) - // flush stderr + // drain stderr + Debug("draining stderr") drain(chErr, proc._errbuf) + proc.log <- true } - proc._outbuf.Sync() - proc._errbuf.Sync() Debug("logger: end") } diff --git a/openwhisk/executor_test.go b/openwhisk/executor_test.go index 6a649ed..8504fd9 100644 --- a/openwhisk/executor_test.go +++ b/openwhisk/executor_test.go @@ -51,19 +51,18 @@ func ExampleNewExecutor_bc() { proc := NewExecutor(log, log, "_test/bc.sh") err := proc.Start() fmt.Println(err) - //proc.log <- true proc.io <- []byte("2+2") fmt.Printf("%s", <-proc.io) + proc.log <- true + <-proc.log // and now, exit detection proc.io <- []byte("quit") - proc.log <- true select { case in := <-proc.io: fmt.Printf("%s", in) case <-proc.exit: fmt.Println("exit") } - waitabit() proc.Stop() dump(log) // Output: @@ -82,9 +81,8 @@ func ExampleNewExecutor_hello() { proc.io <- []byte(`{"value":{"name":"Mike"}}`) fmt.Printf("%s", <-proc.io) proc.log <- true - waitabit() + <-proc.log proc.Stop() - waitabit() _, ok := <-proc.io fmt.Printf("io %v\n", ok) dump(log) @@ -111,10 +109,9 @@ func ExampleNewExecutor_term() { exited = true } proc.log <- true + <-proc.log fmt.Printf("exit %v\n", exited) - waitabit() proc.Stop() - waitabit() _, ok := <-proc.io fmt.Printf("io %v\n", ok) dump(log) diff --git a/openwhisk/extractor.go b/openwhisk/extractor.go index 70b1520..ca751f8 100644 --- a/openwhisk/extractor.go +++ b/openwhisk/extractor.go @@ -27,7 +27,7 @@ import ( "path/filepath" "strconv" - "github.com/h2non/filetype" + "gopkg.in/h2non/filetype.v1" ) func unzip(src []byte, dest string) error { diff --git a/openwhisk/initHandler_test.go b/openwhisk/initHandler_test.go index 803684f..81f00dc 100644 --- a/openwhisk/initHandler_test.go +++ b/openwhisk/initHandler_test.go @@ -105,6 +105,8 @@ func Example_shell_nocompiler() { // 500 {"error":"no action defined yet"} // msg=hello Mike // XXX_THE_END_OF_A_WHISK_ACTIVATION_XXX + // XXX_THE_END_OF_A_WHISK_ACTIVATION_XXX + // XXX_THE_END_OF_A_WHISK_ACTIVATION_XXX // Goodbye! // XXX_THE_END_OF_A_WHISK_ACTIVATION_XXX } diff --git a/openwhisk/runHandler.go b/openwhisk/runHandler.go index 1495189..2463255 100644 --- a/openwhisk/runHandler.go +++ b/openwhisk/runHandler.go @@ -64,8 +64,9 @@ func (ap *ActionProxy) runHandler(w http.ResponseWriter, r *http.Request) { body = bytes.Replace(body, []byte("\n"), []byte(""), -1) // execute the action - // and check for early termination ap.theExecutor.io <- body + + // check for early termination var response []byte var exited bool select { @@ -75,6 +76,10 @@ func (ap *ActionProxy) runHandler(w http.ResponseWriter, r *http.Request) { exited = true } + // flush the logs sending the activation message at the end + ap.theExecutor.log <- true + <-ap.theExecutor.log + // check for early termination if exited { Debug("WARNING! Command exited") @@ -84,9 +89,6 @@ func (ap *ActionProxy) runHandler(w http.ResponseWriter, r *http.Request) { } DebugLimit("received:", response, 120) - // flush the logs sending the activation message at the end - ap.theExecutor.log <- true - // check if the answer is an object map var objmap map[string]*json.RawMessage err = json.Unmarshal(response, &objmap) diff --git a/openwhisk/util_test.go b/openwhisk/util_test.go index 9ebcbc0..b0d8084 100644 --- a/openwhisk/util_test.go +++ b/openwhisk/util_test.go @@ -35,7 +35,7 @@ import ( "testing" "time" - "github.com/h2non/filetype" + "gopkg.in/h2non/filetype.v1" ) func startTestServer(compiler string) (*httptest.Server, string, *os.File) { @@ -157,7 +157,8 @@ func exists(dir, filename string) error { var pseudoElfForMacType = filetype.NewType("elf", "darwin/mach") func pseudoElfForMacMatcher(buf []byte) bool { - return len(buf) > 4 && buf[0] == 0xcf && buf[1] == 0xfa && buf[2] == 0xed && buf[3] == 0xfe + return len(buf) > 4 && ((buf[0] == 0xcf && buf[1] == 0xfa && buf[2] == 0xed && buf[3] == 0xfe) || + (buf[0] == 0xce && buf[1] == 0xfa && buf[2] == 0xed && buf[3] == 0xfe)) } func detect(dir, filename string) string { @@ -177,7 +178,7 @@ func removeLineNr(out string) string { return re.ReplaceAllString(out, "::") } func TestMain(m *testing.M) { - //Debugging = true // enable debug + // Debugging = true // enable debug // silence those annoying logs if !Debugging { log.SetOutput(ioutil.Discard)