Skip to content

Implement better booster logging #3826

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 22 commits into from
Apr 29, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
3523ed4
initial dump
goodlyrottenapple Apr 19, 2024
de17735
Merge remote-tracking branch 'origin/master' into sam/incremental-log…
goodlyrottenapple Apr 22, 2024
2185c64
more logging
goodlyrottenapple Apr 22, 2024
b323e58
more logs
goodlyrottenapple Apr 23, 2024
f097f54
Format with fourmolu
invalid-email-address Apr 23, 2024
d4e5b09
misc fixes
goodlyrottenapple Apr 23, 2024
71198f9
Merge branch 'master' into sam/incremental-logging-update-experiment
goodlyrottenapple Apr 24, 2024
0239282
hlint + booster-dev fixes
goodlyrottenapple Apr 24, 2024
310c6ae
Merge branch 'master' into sam/incremental-logging-update-experiment
goodlyrottenapple Apr 25, 2024
7770c39
add timestamp logging and switch to fast-logger for output
goodlyrottenapple Apr 26, 2024
794e529
more fast-logging fixes + fix booster-dev
goodlyrottenapple Apr 26, 2024
bf8b854
misc fixes
goodlyrottenapple Apr 26, 2024
99a5949
add contextual logging info
goodlyrottenapple Apr 26, 2024
b22472b
Merge branch 'master' into sam/incremental-logging-update-experiment
goodlyrottenapple Apr 26, 2024
5838935
fix typo
goodlyrottenapple Apr 26, 2024
1c5d519
simplify fast-logger setup
goodlyrottenapple Apr 26, 2024
262cfdf
Format with fourmolu
invalid-email-address Apr 26, 2024
cf16da5
Merge branch 'master' into sam/incremental-logging-update-experiment
goodlyrottenapple Apr 26, 2024
ab250cc
add missing newline
goodlyrottenapple Apr 26, 2024
d7294b7
merge master
goodlyrottenapple Apr 29, 2024
8583889
Add more information to log warnings
goodlyrottenapple Apr 29, 2024
90b0fe3
allow test.sh to kill the sever to flush out any remaining logs befor…
goodlyrottenapple Apr 29, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 23 additions & 0 deletions booster/library/Booster/CLOptions.hs
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,9 @@ data CLOptions = CLOptions
, llvmLibraryFile :: Maybe FilePath
, port :: Int
, logLevels :: [LogLevel]
, logTimeStamps :: Bool
, logContexts :: [String]
, notLogContexts :: [String]
, simplificationLogFile :: Maybe FilePath
, smtOptions :: Maybe SMTOptions
, equationOptions :: EquationOptions
Expand Down Expand Up @@ -78,6 +81,26 @@ clOptionsParser =
)
)
)
<*> switch (long "log-timestamps" <> help "Add timestamps to logs")
<*> many
( option
str
( metavar "CONTEXT"
<> long "log-context"
<> short 'c'
<> help
"Log context"
)
)
<*> many
( option
str
( metavar "CONTEXT"
<> long "not-log-context"
<> help
"Not in log context"
)
)
<*> optional
( strOption
( metavar "JSON_LOG_FILE"
Expand Down
5 changes: 3 additions & 2 deletions booster/library/Booster/Definition/Ceil.hs
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import Booster.Pattern.ApplyEquations
import Booster.Pattern.Base

import Booster.LLVM as LLVM (API, simplifyBool)
import Booster.Log
import Booster.Pattern.Bool
import Booster.Pattern.Util (isConcrete, sortOfTerm)
import Booster.Util (Flag (..))
Expand Down Expand Up @@ -73,7 +74,7 @@ instance Pretty ComputeCeilSummary where
]

computeCeilsDefinition ::
MonadLoggerIO io => Maybe LLVM.API -> KoreDefinition -> io (KoreDefinition, [ComputeCeilSummary])
LoggerMIO io => Maybe LLVM.API -> KoreDefinition -> io (KoreDefinition, [ComputeCeilSummary])
computeCeilsDefinition mllvm def@KoreDefinition{rewriteTheory} = do
(rewriteTheory', ceilSummaries) <-
runWriterT $
Expand All @@ -87,7 +88,7 @@ computeCeilsDefinition mllvm def@KoreDefinition{rewriteTheory} = do
pure (def{rewriteTheory = rewriteTheory'}, toList ceilSummaries)

computeCeilRule ::
MonadLoggerIO io =>
LoggerMIO io =>
Maybe LLVM.API ->
KoreDefinition ->
RewriteRule.RewriteRule "Rewrite" ->
Expand Down
101 changes: 46 additions & 55 deletions booster/library/Booster/JsonRpc.hs
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@ import Control.Concurrent (MVar, putMVar, readMVar, takeMVar)
import Control.Monad
import Control.Monad.Extra (whenJust)
import Control.Monad.IO.Class
import Control.Monad.Logger.CallStack (MonadLoggerIO)
import Control.Monad.Logger.CallStack qualified as Log
import Control.Monad.Trans.Except (catchE, except, runExcept, runExceptT, throwE, withExceptT)
import Crypto.Hash (SHA256 (..), hashWith)
Expand All @@ -45,12 +44,9 @@ import Booster.Definition.Attributes.Base (UniqueId, getUniqueId, uniqueId)
import Booster.Definition.Base (KoreDefinition (..))
import Booster.Definition.Base qualified as Definition (RewriteRule (..))
import Booster.LLVM as LLVM (API)
import Booster.Log
import Booster.Pattern.ApplyEquations qualified as ApplyEquations
import Booster.Pattern.Base (
Pattern (..),
Term,
Variable,
)
import Booster.Pattern.Base (Pattern (..), Sort (SortApp), Term, Variable)
import Booster.Pattern.Base qualified as Pattern
import Booster.Pattern.Rewrite (
RewriteFailed (..),
Expand All @@ -69,6 +65,7 @@ import Booster.Syntax.Json.Internalise (
TermOrPredicates (..),
internalisePattern,
internaliseTermOrPredicate,
logPatternError,
patternErrorToRpcError,
pattern CheckSubsorts,
pattern DisallowAlias,
Expand All @@ -88,7 +85,7 @@ import Kore.Syntax.Json.Types qualified as Syntax

respond ::
forall m.
MonadLoggerIO m =>
LoggerMIO m =>
MVar ServerState ->
Respond (RpcTypes.API 'RpcTypes.Req) m (RpcTypes.API 'RpcTypes.Res)
respond stateVar =
Expand All @@ -97,14 +94,14 @@ respond stateVar =
| isJust req.stepTimeout -> pure $ Left $ RpcError.unsupportedOption ("step-timeout" :: String)
| isJust req.movingAverageStepTimeout ->
pure $ Left $ RpcError.unsupportedOption ("moving-average-step-timeout" :: String)
RpcTypes.Execute req -> withContext req._module $ \(def, mLlvmLibrary, mSMTOptions) -> do
RpcTypes.Execute req -> withModule req._module $ \(def, mLlvmLibrary, mSMTOptions) -> Booster.Log.withContext "execute" $ do
start <- liftIO $ getTime Monotonic
-- internalise given constrained term
let internalised = runExcept $ internalisePattern DisallowAlias CheckSubsorts Nothing def req.state.term

case internalised of
Left patternError -> do
Log.logDebug $ "Error internalising cterm" <> Text.pack (show patternError)
void $ Booster.Log.withContext "internalise" $ logPatternError patternError
pure $
Left $
RpcError.backendError $
Expand All @@ -113,13 +110,12 @@ respond stateVar =
]
Right (pat, substitution, unsupported) -> do
unless (null unsupported) $ do
withKorePatternContext (KoreJson.KJAnd (externaliseSort $ sortOfPattern pat) unsupported) $
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think I have an idea how to avoid duplicating the log message here. As I understand, we only have to have duplicates for warnings. Then we could create a special variant of the logMessage function, say logWarning, which would append [warning] at the tail of the context. We than make a static glob pattern *warning that is enabled by default.

logMessage ("ignoring unsupported predicate parts" :: Text)
Log.logWarnNS
"booster"
"Execute: ignoring unsupported predicate parts"
Log.logOtherNS
"booster"
(Log.LevelOther "ErrorDetails")
(Text.unlines $ map prettyPattern unsupported)

let cutPoints = fromMaybe [] req.cutPointRules
terminals = fromMaybe [] req.terminalRules
mbDepth = fmap RpcTypes.getNat req.maxDepth
Expand Down Expand Up @@ -153,7 +149,7 @@ respond stateVar =
fromIntegral (toNanoSecs (diffTimeSpec stop start)) / 1e9
else Nothing
pure $ execResponse duration req result substitution unsupported
RpcTypes.AddModule RpcTypes.AddModuleRequest{_module, nameAsId = nameAsId'} -> runExceptT $ do
RpcTypes.AddModule RpcTypes.AddModuleRequest{_module, nameAsId = nameAsId'} -> Booster.Log.withContext "add-module" $ runExceptT $ do
-- block other request executions while modifying the server state
state <- liftIO $ takeMVar stateVar
let nameAsId = fromMaybe False nameAsId'
Expand Down Expand Up @@ -211,10 +207,10 @@ respond stateVar =
(if nameAsId then Map.insert (getId newModule.name) _module else id) $
Map.insert moduleHash _module state.addedModules
}
Log.logInfo $
Booster.Log.logMessage $
"Added a new module. Now in scope: " <> Text.intercalate ", " (Map.keys newDefinitions)
pure $ RpcTypes.AddModule $ RpcTypes.AddModuleResult moduleHash
RpcTypes.Simplify req -> withContext req._module $ \(def, mLlvmLibrary, mSMTOptions) -> do
RpcTypes.Simplify req -> withModule req._module $ \(def, mLlvmLibrary, mSMTOptions) -> Booster.Log.withContext "simplify" $ do
start <- liftIO $ getTime Monotonic
let internalised =
runExcept $ internaliseTermOrPredicate DisallowAlias CheckSubsorts Nothing def req.state.term
Expand Down Expand Up @@ -249,8 +245,7 @@ respond stateVar =
result <- case internalised of
Left patternErrors -> do
forM_ patternErrors $ \patternError ->
Log.logErrorNS "booster" $
"Error internalising cterm: " <> pack (show patternError)
void $ Booster.Log.withContext "internalise" $ logPatternError patternError
Log.logOtherNS
"booster"
(Log.LevelOther "ErrorDetails")
Expand All @@ -262,15 +257,12 @@ respond stateVar =
map patternErrorToRpcError patternErrors
-- term and predicate (pattern)
Right (TermAndPredicates pat substitution unsupported) -> do
Log.logInfoNS "booster" "Simplifying a pattern"
unless (null unsupported) $ do
withKorePatternContext (KoreJson.KJAnd (externaliseSort $ sortOfPattern pat) unsupported) $ do
logMessage ("ignoring unsupported predicate parts" :: Text)
Log.logWarnNS
"booster"
"Simplify: ignoring unsupported predicates in input"
Log.logOtherNS
"booster"
(Log.LevelOther "ErrorDetails")
(Text.unlines $ map prettyPattern unsupported)
"Simplify: ignoring unsupported predicate parts"
-- apply the given substitution before doing anything else
let substPat =
Pattern
Expand Down Expand Up @@ -302,36 +294,35 @@ respond stateVar =
| otherwise -> do
Log.logInfoNS "booster" "Simplifying predicates"
unless (null ps.unsupported) $ do
Log.logWarnNS
"booster"
"Simplify: ignoring unsupported predicates in input"
Log.logOtherNS
"booster"
(Log.LevelOther "ErrorDetails")
(Text.unlines $ map prettyPattern ps.unsupported)
Log.logOtherNS "booster" (Log.LevelOther "Simplify") $ renderText (pretty ps)
withKorePatternContext (KoreJson.KJAnd (externaliseSort $ SortApp "SortBool" []) ps.unsupported) $ do
logMessage ("ignoring unsupported predicate parts" :: Text)
Log.logWarnNS
"booster"
"Simplify: ignoring unsupported predicate parts"
-- apply the given substitution before doing anything else
let predicates = map (substituteInPredicate ps.substitution) $ Set.toList ps.boolPredicates
ApplyEquations.simplifyConstraints
doTracing
def
mLlvmLibrary
solver
mempty
predicates
>>= \case
(Right newPreds, _) -> do
let predicateSort =
fromMaybe (error "not a predicate") $
sortOfJson req.state.term
result =
map (externalisePredicate predicateSort) newPreds
<> map (externaliseCeil predicateSort) (Set.toList ps.ceilPredicates)
<> map (uncurry $ externaliseSubstitution predicateSort) (Map.toList ps.substitution)
<> ps.unsupported
withContext "constraint" $
ApplyEquations.simplifyConstraints
doTracing
def
mLlvmLibrary
solver
mempty
predicates
>>= \case
(Right newPreds, _) -> do
let predicateSort =
fromMaybe (error "not a predicate") $
sortOfJson req.state.term
result =
map (externalisePredicate predicateSort) newPreds
<> map (externaliseCeil predicateSort) (Set.toList ps.ceilPredicates)
<> map (uncurry $ externaliseSubstitution predicateSort) (Map.toList ps.substitution)
<> ps.unsupported

pure $ Right (addHeader $ Syntax.KJAnd predicateSort result, [])
(Left something, _) ->
pure . Left . RpcError.backendError $ RpcError.Aborted $ renderText $ pretty something
pure $ Right (addHeader $ Syntax.KJAnd predicateSort result, [])
(Left something, _) ->
pure . Left . RpcError.backendError $ RpcError.Aborted $ renderText $ pretty something
whenJust solver SMT.closeSolver
stop <- liftIO $ getTime Monotonic

Expand All @@ -341,7 +332,7 @@ respond stateVar =
RpcTypes.Simplify
RpcTypes.SimplifyResult{state, logs = mkTraces duration traceData}
pure $ second (uncurry mkSimplifyResponse) (fmap (second (map ApplyEquations.eraseStates)) result)
RpcTypes.GetModel req -> withContext req._module $ \case
RpcTypes.GetModel req -> withModule req._module $ \case
(_, _, Nothing) -> do
Log.logErrorNS "booster" "get-model request, not supported without SMT solver"
pure $ Left RpcError.notImplemented
Expand Down Expand Up @@ -470,13 +461,13 @@ respond stateVar =
-- using "Method does not exist" error code
_ -> pure $ Left RpcError.notImplemented
where
withContext ::
withModule ::
Maybe Text ->
( (KoreDefinition, Maybe LLVM.API, Maybe SMT.SMTOptions) ->
m (Either ErrorObj (RpcTypes.API 'RpcTypes.Res))
) ->
m (Either ErrorObj (RpcTypes.API 'RpcTypes.Res))
withContext mbMainModule action = do
withModule mbMainModule action = do
state <- liftIO $ readMVar stateVar
let mainName = fromMaybe state.defaultMain mbMainModule
case Map.lookup mainName state.definitions of
Expand Down
Loading