mirror of
https://github.com/urbit/shrub.git
synced 2024-12-22 18:31:44 +03:00
114 lines
2.9 KiB
Haskell
114 lines
2.9 KiB
Haskell
module Main where
|
|
|
|
import ClassyPrelude
|
|
|
|
import Noun
|
|
import Vere.Pier.Types
|
|
import Vere.Pier
|
|
import Vere.Serf
|
|
import Data.Acquire
|
|
import Data.Conduit
|
|
import Data.Conduit.List
|
|
|
|
import Control.Concurrent (threadDelay)
|
|
import System.Directory (removeFile, doesFileExist)
|
|
import Text.Show.Pretty (pPrint)
|
|
|
|
import qualified Vere.Log as Log
|
|
import qualified Vere.Persist as Persist
|
|
import qualified Vere.Pier as Pier
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
removeFileIfExists :: FilePath -> IO ()
|
|
removeFileIfExists pax = do
|
|
exists <- doesFileExist pax
|
|
when exists $ do
|
|
removeFile pax
|
|
|
|
wipeSnapshot :: FilePath -> IO ()
|
|
wipeSnapshot shipPath = do
|
|
removeFileIfExists (shipPath <> ".urb/chk/north.bin")
|
|
removeFileIfExists (shipPath <> ".urb/chk/south.bin")
|
|
|
|
tryBootFromPill :: FilePath -> FilePath -> Ship -> IO ()
|
|
tryBootFromPill pillPath shipPath ship = do
|
|
wipeSnapshot shipPath
|
|
Pier.boot pillPath shipPath ship $ \s l ss -> do
|
|
print "lul"
|
|
print ss
|
|
threadDelay 500000
|
|
shutdownAndWait s 0 >>= print
|
|
putStrLn "Booted!"
|
|
|
|
tryResume :: FilePath -> IO ()
|
|
tryResume shipPath = do
|
|
Pier.resume shipPath $ \s l ss -> do
|
|
print ss
|
|
threadDelay 500000
|
|
shutdownAndWait s 0 >>= print
|
|
putStrLn "Resumed!"
|
|
|
|
tryFullReplay :: FilePath -> IO ()
|
|
tryFullReplay shipPath = do
|
|
wipeSnapshot shipPath
|
|
tryResume shipPath
|
|
|
|
zod :: Ship
|
|
zod = 0
|
|
|
|
main :: IO ()
|
|
main = do
|
|
let pillPath = "/home/benjamin/r/urbit/bin/brass.pill"
|
|
shipPath = "/home/benjamin/r/urbit/zod/"
|
|
ship = zod
|
|
|
|
tryBootFromPill pillPath shipPath ship
|
|
|
|
tryResume shipPath
|
|
|
|
tryFullReplay shipPath
|
|
|
|
pure ()
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
tryCopyLog :: IO ()
|
|
tryCopyLog = do
|
|
let logPath = "/Users/erg/src/urbit/zod/.urb/falselog/"
|
|
falselogPath = "/Users/erg/src/urbit/zod/.urb/falselog2/"
|
|
|
|
(ident, nextEv, events) <-
|
|
with (Log.existing logPath) $ \log -> do
|
|
persistQ <- newTQueueIO
|
|
releaseQ <- newTQueueIO
|
|
persist <- Persist.start log persistQ (writeTQueue releaseQ)
|
|
ident <- pure $ Log.identity log
|
|
events <- runConduit (Log.streamEvents log 1 .| consume)
|
|
nextEv <- Log.nextEv log
|
|
pure (ident, nextEv, events)
|
|
|
|
print ident
|
|
print nextEv
|
|
print (length events)
|
|
|
|
with (Log.new falselogPath ident) $ \log2 -> do
|
|
persistQ2 <- newTQueueIO
|
|
releaseQ2 <- newTQueueIO
|
|
persist2 <- Persist.start log2 persistQ2 (writeTQueue releaseQ2)
|
|
|
|
let writs = zip [1..] events <&> \(id, a) ->
|
|
Writ id Nothing (Jam a) []
|
|
|
|
print "About to write"
|
|
|
|
for_ writs $ \w ->
|
|
atomically (writeTQueue persistQ2 w)
|
|
|
|
print "About to wait"
|
|
|
|
replicateM_ 100 $ do
|
|
atomically $ readTQueue releaseQ2
|
|
|
|
print "Done"
|