@@ -40,90 +40,79 @@ module Chainweb.Pact.PactService
40
40
) where
41
41
42
42
import Control.Concurrent.Async
43
- import Control.Concurrent.STM
44
- import Control.Exception.Safe (mask )
45
- import Control.Lens hiding ((:>) )
46
- import Control.Monad
47
- import Control.Monad.Cont (evalContT )
48
- import Control.Monad.Except
49
- import Control.Monad.Reader
50
- import Control.Monad.State.Strict
51
- import Control.Monad.Trans.Resource
52
-
53
- import Data.Either
54
- import Data.Foldable (traverse_ )
55
- import qualified Data.HashMap.Strict as HM
56
- import Data.Maybe
57
- import Data.Monoid
58
- import Data.Pool (Pool )
59
- import qualified Data.Text as Text
60
- import Data.Vector (Vector )
61
- import qualified Data.Vector as V
62
-
63
- import System.IO
64
- import System.LogLevel
65
-
66
- import Prelude hiding (lookup )
67
-
68
- import qualified Pact.JSON.Encode as J
69
-
70
- import qualified Pact.Core.Gas as Pact
71
-
72
- import qualified Chainweb.Pact.TransactionExec as Pact
73
- import qualified Chainweb.Pact.Validations as Pact
74
-
75
43
import Chainweb.BlockHash
76
44
import Chainweb.BlockHeader
77
45
import Chainweb.BlockHeight
78
46
import Chainweb.ChainId
47
+ import Chainweb.Core.Brief
48
+ import Chainweb.Counter
79
49
import Chainweb.Logger
80
50
import Chainweb.Mempool.Mempool as Mempool
81
51
import Chainweb.Miner.Pact
82
-
52
+ import Chainweb.Pact.Backend.ChainwebPactDb qualified as ChainwebPactDb
53
+ import Chainweb.Pact.Backend.ChainwebPactDb qualified as Pact
54
+ import Chainweb.Pact.Backend.Types
55
+ import Chainweb.Pact.Backend.Utils (withSavepoint , SavepointName (.. ))
56
+ import Chainweb.Pact.NoCoinbase qualified as Pact
57
+ import Chainweb.Pact.PactService.Checkpointer qualified as Checkpointer
83
58
import Chainweb.Pact.PactService.ExecBlock
84
- import qualified Chainweb.Pact.Backend.ChainwebPactDb as Pact
59
+ import Chainweb.Pact.PactService.ExecBlock qualified as Pact
60
+ import Chainweb.Pact.Transaction qualified as Pact
61
+ import Chainweb.Pact.TransactionExec qualified as Pact
85
62
import Chainweb.Pact.Types
86
- -- import Chainweb.Pact.SPV qualified as Pact
63
+ import Chainweb.Pact.Validations qualified as Pact
87
64
import Chainweb.Parent
88
65
import Chainweb.Payload
89
66
import Chainweb.Payload.PayloadStore
67
+ import Chainweb.PayloadProvider
68
+ import Chainweb.PayloadProvider.P2P
69
+ import Chainweb.PayloadProvider.P2P.RestAPI.Client qualified as Rest
70
+ import Chainweb.Ranked
71
+ import Chainweb.Storage.Table
72
+ import Chainweb.Storage.Table.Map qualified as MapTable
90
73
import Chainweb.Time
91
- import qualified Chainweb.Pact.Transaction as Pact
92
74
import Chainweb.Utils hiding (check )
93
75
import Chainweb.Version
94
- import Chainweb.Counter
95
- import Pact.Core.Command.Types qualified as Pact
96
- import Pact.Core.Hash qualified as Pact
76
+ import Control.Concurrent.STM
77
+ import Control.Exception.Safe (mask )
78
+ import Control.Lens hiding ((:>) )
79
+ import Control.Monad
80
+ import Control.Monad.Cont (evalContT )
81
+ import Control.Monad.Except
82
+ import Control.Monad.Reader
83
+ import Control.Monad.State.Strict
84
+ import Control.Monad.Trans.Resource
85
+ import Control.Parallel.Strategies qualified as Strategies
86
+ import Data.Align
97
87
import Data.ByteString.Short qualified as SB
98
88
import Data.Coerce (coerce )
89
+ import Data.DList qualified as DList
90
+ import Data.Either
91
+ import Data.Foldable (traverse_ )
92
+ import Data.HashMap.Strict qualified as HM
93
+ import Data.List.NonEmpty qualified as NEL
94
+ import Data.List.NonEmpty qualified as NonEmpty
95
+ import Data.Maybe
96
+ import Data.Monoid
97
+ import Data.Pool (Pool )
98
+ import Data.Pool qualified as Pool
99
+ import Data.Text qualified as Text
100
+ import Data.Vector (Vector )
101
+ import Data.Vector qualified as V
99
102
import Data.Void
100
- import Chainweb.Pact.PactService.ExecBlock qualified as Pact
101
- import qualified Pact.Core.Evaluate as Pact
102
- import qualified Pact.Core.Errors as Pact
103
- import Chainweb.Pact.Backend.Types
104
- import qualified Chainweb.Pact.PactService.Checkpointer as Checkpointer
105
- import qualified Pact.Core.StableEncoding as Pact
106
- import qualified Data.List.NonEmpty as NonEmpty
107
- import Chainweb.PayloadProvider
108
- import Chainweb.Storage.Table
109
- import qualified Chainweb.Storage.Table.Map as MapTable
110
- import Chainweb.PayloadProvider.P2P
111
- import P2P.TaskQueue (Priority (.. ))
112
- import qualified Network.HTTP.Client as HTTP
113
- import qualified Chainweb.PayloadProvider.P2P.RestAPI.Client as Rest
114
- import Chainweb.Pact.Backend.Utils (withSavepoint , SavepointName (.. ))
115
- import qualified Data.DList as DList
116
- import Chainweb.Ranked
117
- import qualified Chainweb.Pact.Backend.ChainwebPactDb as ChainwebPactDb
118
- import qualified Pact.Core.ChainData as Pact
119
103
import GHC.Stack (HasCallStack )
120
- import qualified Data.Pool as Pool
121
- import qualified Data.List.NonEmpty as NEL
122
- import qualified Control.Parallel.Strategies as Strategies
123
- import qualified Chainweb.Pact.NoCoinbase as Pact
124
- import Chainweb.Core.Brief
125
- import Data.Align
126
- import qualified Data.List.NonEmpty as NE
104
+ import Network.HTTP.Client qualified as HTTP
105
+ import P2P.TaskQueue (Priority (.. ))
106
+ import Pact.Core.ChainData qualified as Pact
107
+ import Pact.Core.Command.Types qualified as Pact
108
+ import Pact.Core.Errors qualified as Pact
109
+ import Pact.Core.Evaluate qualified as Pact
110
+ import Pact.Core.Gas qualified as Pact
111
+ import Pact.Core.Hash qualified as Pact
112
+ import Pact.Core.StableEncoding qualified as Pact
113
+ import Pact.JSON.Encode qualified as J
114
+ import Prelude hiding (lookup )
115
+ import System.LogLevel
127
116
128
117
withPactService
129
118
:: (Logger logger , CanPayloadCas tbl )
@@ -562,7 +551,7 @@ syncToFork logger serviceEnv hints forkInfo = do
562
551
let validatedTxs = msum blockResults
563
552
Checkpointer. setConsensusState sql forkInfo. _forkInfoTargetState
564
553
return (rewoundTxs, validatedTxs, forkInfo. _forkInfoTargetState)
565
- liftIO $ mpaProcessFork memPoolAccess (rewoundTxs, validatedTxs)
554
+ liftIO $ mpaProcessFork memPoolAccess (V. concat rewoundTxs, validatedTxs)
566
555
case forkInfo. _forkInfoNewBlockCtx of
567
556
Just newBlockCtx
568
557
| Just _ <- _psMiner serviceEnv
@@ -630,16 +619,22 @@ syncToFork logger serviceEnv hints forkInfo = do
630
619
631
620
-- remember to call this *before* executing the actual rewind,
632
621
-- and only alter the mempool *after* the db transaction is done.
633
- getRewoundTxs :: Parent BlockHeight -> IO ( Vector Pact. Transaction)
622
+ getRewoundTxs :: Parent BlockHeight -> IO [ Vector Pact. Transaction]
634
623
getRewoundTxs rewindTargetHeight = do
635
624
rewoundPayloadHashes <- Checkpointer. getPayloadsAfter sql rewindTargetHeight
636
- rewoundPayloads <- liftIO $ fmap fromJuste <$>
637
- lookupPayloadDataWithHeightBatch
638
- (_payloadStoreTable pdb)
639
- [(Just (rank rbph), _ranked rbph) | rbph <- rewoundPayloadHashes]
640
- V. concat <$> traverse
641
- (fmap (fromRight (error " invalid payload in database" )) . runExceptT . pact5TransactionsFromPayload)
642
- rewoundPayloads
625
+ rewoundPayloads <- lookupPayloadDataWithHeightBatch
626
+ (_payloadStoreTable pdb)
627
+ [(Just (rank rbph), _ranked rbph) | rbph <- rewoundPayloadHashes]
628
+ forM (zip rewoundPayloadHashes rewoundPayloads) $ \ case
629
+ (rbph, Nothing ) -> do
630
+ logFunctionText logger Error $ " missing payload in database: " <> brief rbph
631
+ return V. empty
632
+ (rbph, Just payload) -> case pact5TransactionsFromPayload payload of
633
+ Right txs -> do
634
+ return txs
635
+ Left err -> do
636
+ logFunctionText logger Error $ " invalid payload in database (" <> brief rbph <> " ): " <> sshow err
637
+ return V. empty
643
638
644
639
-- | Start a thread that makes fresh payloads periodically
645
640
startPayloadRefresher :: Logger logger => HasVersion => logger -> ServiceEnv tbl -> BlockInProgress -> IO ()
0 commit comments