From 267ec9e882a731401fffd209eb51cdd0bffe154a Mon Sep 17 00:00:00 2001 From: Luke Clifton Date: Tue, 10 Mar 2020 13:31:52 +0800 Subject: [PATCH 1/2] Prevent planner from locking up on large problems. In some scenarios, the `downward` executable was producing a lot of output which was not being read by the library. This would eventually cause the downward process to hang, waiting for someone to consume its output. This change drains both output handles before calling wait, and thus preventing the deadlock. --- FastDownward/Exec.hs | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/FastDownward/Exec.hs b/FastDownward/Exec.hs index 5dcdccb..53df61a 100644 --- a/FastDownward/Exec.hs +++ b/FastDownward/Exec.hs @@ -134,7 +134,8 @@ import Data.Char import Data.List import Data.Maybe import Data.Ratio -import qualified Data.Text.Lazy +import qualified Data.Text +import qualified Data.Text.IO import qualified Data.Text.Lazy.IO import qualified FastDownward.SAS import qualified FastDownward.SAS.Plan @@ -294,16 +295,16 @@ callFastDownward Options{ fastDownward, problem, planFilePath, searchConfigurati Data.Text.Lazy.IO.hPutStr writeProblemHandle ( FastDownward.SAS.Plan.toSAS problem ) >> hClose writeProblemHandle - exitCode <- - waitForProcess processHandle - stdout <- - Data.Text.Lazy.IO.hGetContents stdoutHandle + Data.Text.IO.hGetContents stdoutHandle stderr <- - Data.Text.Lazy.IO.hGetContents stderrHandle + Data.Text.IO.hGetContents stderrHandle + + exitCode <- + waitForProcess processHandle - return ( exitCode, Data.Text.Lazy.unpack stdout, Data.Text.Lazy.unpack stderr ) + return ( exitCode, Data.Text.unpack stdout, Data.Text.unpack stderr ) -- | See From 6b6f569cc3a0185f2dfa1d965996e31435cd77a2 Mon Sep 17 00:00:00 2001 From: Luke Clifton Date: Wed, 11 Mar 2020 14:27:42 +0800 Subject: [PATCH 2/2] Protect against blocking on stderr filling up. --- FastDownward/Exec.hs | 9 ++++----- fast-downward.cabal | 1 + 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/FastDownward/Exec.hs b/FastDownward/Exec.hs index 53df61a..43c5cba 100644 --- a/FastDownward/Exec.hs +++ b/FastDownward/Exec.hs @@ -129,6 +129,7 @@ module FastDownward.Exec ) where +import Control.Concurrent.Async (concurrently) import Control.Monad.IO.Class ( MonadIO, liftIO ) import Data.Char import Data.List @@ -295,11 +296,9 @@ callFastDownward Options{ fastDownward, problem, planFilePath, searchConfigurati Data.Text.Lazy.IO.hPutStr writeProblemHandle ( FastDownward.SAS.Plan.toSAS problem ) >> hClose writeProblemHandle - stdout <- - Data.Text.IO.hGetContents stdoutHandle - - stderr <- - Data.Text.IO.hGetContents stderrHandle + (stderr, stdout) <- concurrently + (Data.Text.IO.hGetContents stderrHandle) + (Data.Text.IO.hGetContents stdoutHandle) exitCode <- waitForProcess processHandle diff --git a/fast-downward.cabal b/fast-downward.cabal index 7084cac..68645c0 100644 --- a/fast-downward.cabal +++ b/fast-downward.cabal @@ -58,6 +58,7 @@ library FastDownward.SAS.Version build-depends: base ^>= 4.11.1.0 || ^>= 4.12.0.0 || ^>= 4.13.0.0, + async ^>= 2.2.0, containers ^>= 0.5.11.0 || ^>= 0.6, mtl ^>= 2.2.2, process ^>= 1.6.3.0,