Commit Graph

185 Commits

Author SHA1 Message Date
vyzo
f33d4e79aa simplify transactional protection logic
Now that we delete objects heaviest first, we don't have to do deep walk and rescan gymnastics.
2021-07-04 20:49:39 +03:00
vyzo
40c271cda1 sort cold objects before deleting
so that we can't shoot ourselves in the foot by deleting the constituents of a DAG while it is
still in the hotstore.
2021-07-04 20:17:07 +03:00
vyzo
13d612f72f smarter trackTxnRefMany 2021-07-04 19:33:49 +03:00
vyzo
f124389b66 recursively protect all references 2021-07-04 19:21:00 +03:00
vyzo
4d286da593 fix error message 2021-07-04 18:58:39 +03:00
vyzo
680af8eb09 use deep object walking for more robust handling of transactional references 2021-07-04 18:38:28 +03:00
vyzo
1f02428225 fix lint 2021-07-04 18:38:28 +03:00
vyzo
2c7a89a1db short-circuit rescanning on block headers 2021-07-04 18:38:28 +03:00
vyzo
8e56fffb33 walkChain should visit the genesis state root 2021-07-04 18:38:28 +03:00
vyzo
190cb18ab0 housekeeping
- remove defunct tracking store implementations
- update splitstore node config
- use mark set type config option (defaulting to mapts); a memory constrained node
  may want to use an on-disk one
2021-07-04 18:38:28 +03:00
vyzo
19d1b1f532 deal with partially written objects 2021-07-04 18:38:28 +03:00
vyzo
0a1d7b3732 fix log 2021-07-04 18:38:28 +03:00
vyzo
eafffc1634 more efficient trackTxnRefMany 2021-07-04 18:38:28 +03:00
vyzo
36f93649ef fix panic from concurrent map writes in txnRefs 2021-07-04 18:38:28 +03:00
vyzo
6fa2cd232d simplify compaction model 2021-07-04 18:38:28 +03:00
vyzo
1f2b604c07 RIP tracking store 2021-07-04 18:38:28 +03:00
vyzo
68a83500bc fix bug that turned candidate filtering to dead code 2021-07-04 18:38:28 +03:00
vyzo
642f0e4740 deal with memory pressure, don't walk under the boundary 2021-07-04 18:38:28 +03:00
vyzo
c5cf8e226b remove unnecessary code 2021-07-04 18:38:28 +03:00
vyzo
d79e4da7aa more accurate stats about mark set updates 2021-07-04 18:38:28 +03:00
vyzo
6f58fdcb22 remove vm copy context detection hack
stack tracing is slow.
2021-07-04 18:38:28 +03:00
vyzo
2b03316cd9 fix log message 2021-07-04 18:38:28 +03:00
vyzo
184d3802b6 remove dead code 2021-07-04 18:38:28 +03:00
vyzo
228a435ba7 rework tracking logic; do it lazily and far more efficiently 2021-07-04 18:38:28 +03:00
vyzo
9d6cabd18a if it's not a dag, it's not a block 2021-07-04 18:38:28 +03:00
vyzo
8157f889ce short-circuit marking walks when encountering a block and more efficient walking 2021-07-04 18:38:28 +03:00
vyzo
736d6a3c19 only treat Has as an implicit write within vm.Copy context 2021-07-04 18:38:28 +03:00
vyzo
39723bbe60 use a single map for tracking pending writes, properly track implicits 2021-07-04 18:38:28 +03:00
vyzo
5834231e58 create the transactional protect filter before walking 2021-07-04 18:38:28 +03:00
vyzo
e4bb4be855 fix some residual purge races 2021-07-04 18:38:28 +03:00
vyzo
68bc5d2291 skip moving cold blocks when running with a noop coldstore
it is a noop but it still takes (a lot of) time because it has to read all the cold blocks.
2021-07-04 18:38:28 +03:00
vyzo
b87295db93 bubble up dependent txn ref errors
This cause Has to return false if it fails to traverse/protect all links, which would cause
the vm to recompute.
2021-07-04 18:38:28 +03:00
vyzo
637fbf6c5b fix faulty if/else logic for implicit txn protection 2021-07-04 18:38:28 +03:00
vyzo
9d6bcd7705 avoid clown shoes: only walk links for tracking in implicit writes/refs 2021-07-04 18:38:28 +03:00
vyzo
484dfaebce reused cidset across all walks when flushing pending writes 2021-07-04 18:38:28 +03:00
vyzo
1d41e1544a optimize transitive write tracking a bit 2021-07-04 18:38:28 +03:00
vyzo
da00fc66ee downgrade a couple of logs to warnings 2021-07-04 18:38:28 +03:00
vyzo
4071488ef2 first write, then track 2021-07-04 18:38:28 +03:00
vyzo
bd92c230da refactor txn reference tracking, do deep marking of DAGs 2021-07-04 18:38:28 +03:00
vyzo
a98a062347 do the dag walk for deep write tracking during flush
avoid crawling everything to a halt
2021-07-04 18:38:28 +03:00
vyzo
13a674330f add pending write check before tracking the object in Has 2021-07-04 18:38:28 +03:00
vyzo
982867317e transitively track dags from implicit writes in Has 2021-07-04 18:38:28 +03:00
vyzo
4de0cd9fcb move write log back to flush so that we don't crawl to a halt 2021-07-04 18:38:28 +03:00
vyzo
2faa4aa993 debug log writes at track so that we get correct stack traces 2021-07-04 18:38:28 +03:00
vyzo
aeaa59d4b5 move comments about tracking perf issues into a more pertinent place 2021-07-04 18:38:28 +03:00
vyzo
3e8e9273ca track all writes using async batching, not just implicit ones 2021-07-04 18:38:28 +03:00
vyzo
d0bfe421b5 flush implicit writes at the right time before starting compaction to avoid races 2021-07-04 18:38:28 +03:00
vyzo
7f473f56eb flush implicit writes before starting compaction 2021-07-04 18:38:28 +03:00
vyzo
a29947d47c flush implicit writes in all paths in updateWriteEpoch 2021-07-04 18:38:28 +03:00
vyzo
be6cc2c3e6 batch implicit write tracking
bolt performance leaves something to be desired; doing a single Put takes 10ms, about the same time
as batching thousands of them.
2021-07-04 18:38:28 +03:00
vyzo
e472cacb3e add missing return 2021-07-04 18:38:28 +03:00
vyzo
6a3cbea790 treat Has as an implicit Write
Rationale: the VM uses the Has check to avoid issuing a duplicate Write in the blockstore.
This means that live objects that would be otherwise written are not actually written, resulting
in the first write epoch being considered the write epoch.
2021-07-04 18:38:28 +03:00
vyzo
90dc274113 better logging for chain walk 2021-07-04 18:38:28 +03:00
vyzo
40f42db7fa walk tweaks 2021-07-04 18:38:28 +03:00
vyzo
09efed50fd check for lookback references to block headers in walk 2021-07-04 18:38:28 +03:00
vyzo
7de0771883 count txn live objects explicitly for logging 2021-07-04 18:38:28 +03:00
vyzo
e29b64c5de check both markset and txn liveset before declaring an object cold 2021-07-04 18:38:28 +03:00
vyzo
4bed3161f0 fix broken purge count log 2021-07-04 18:38:28 +03:00
vyzo
dec61fa333 deduplicate stack logs and optionally trace write stacks 2021-07-04 18:38:28 +03:00
vyzo
7ebef6d838 better log message 2021-07-04 18:38:28 +03:00
vyzo
40ff5bf164 log put errors in splitstore log 2021-07-04 18:38:28 +03:00
vyzo
9fda61abec fix error check for unreachable cids 2021-07-04 18:38:28 +03:00
vyzo
4a71c68e06 move code around for better readability 2021-07-04 18:38:28 +03:00
vyzo
31497f4bd3 use internal get during walk to avoid blowing the compaction txn
otherwise the walk itself precludes purge... duh!
2021-07-04 18:38:28 +03:00
vyzo
6af3a23dd4 use a map for txn protection mark set 2021-07-04 18:38:28 +03:00
vyzo
65ccc99e79 minor tweaks in purge
- allocate once
- log purge count
2021-07-04 18:38:28 +03:00
vyzo
cb665d07e0 fix transactional race during compaction
It is possible for an object to be written or recreated (and checked with Has)
after the mark completes and during the purge; if this happens we will purge
a live block.
2021-07-04 18:38:28 +03:00
vyzo
50ebaf25aa don't log read misses before warmup 2021-07-04 18:38:28 +03:00
vyzo
b187b5c301 fix lint 2021-07-04 18:38:28 +03:00
vyzo
a53c4e1597 implement debug log 2021-07-04 18:38:28 +03:00
vyzo
fce7b8dc9b flush move log when cold collection is done 2021-07-04 18:38:28 +03:00
vyzo
fc247e4223 add debug log skeleton 2021-07-04 18:38:28 +03:00
vyzo
0390285c4e always do full walks, not only when there is a sync gap 2021-07-04 18:38:28 +03:00
vyzo
30dbe4978b adjust compaction range 2021-07-04 18:38:28 +03:00
vyzo
a21f55919b CompactionThreshold should be 4 finalities
otherwise we'll wear clown shoes with the slack and end up in continuous compaction.
2021-07-04 18:38:28 +03:00
vyzo
a25ac80777 reintroduce compaction slack 2021-07-04 18:38:28 +03:00
vyzo
c4d95de987 coalesce back-to-back compactions
get rid of the CompactionCold construct, run a single compaction on catch up
2021-07-04 18:38:28 +03:00
vyzo
b7897595eb augment current epoch by +1
to account for off by one conditions
2021-07-04 18:38:28 +03:00
vyzo
933c786421 update write epoch in the background every second 2021-07-04 18:38:28 +03:00
vyzo
66f1630f14 fix lint issue 2021-07-04 18:38:28 +03:00
vyzo
bb17608ae0 track writeEpoch relative to current wall clock time
The issue: head change notifications are not emitted until after catching up,
which results in all writes during a catch up period being tracked at the base epoch.
2021-07-04 18:38:28 +03:00
vyzo
421f05eab9 save the warm up epoch only if successful in warming up 2021-07-04 18:38:28 +03:00
vyzo
9b6448518c refactor warmup to trigger at startup and not wait for sync 2021-07-04 18:38:28 +03:00
vyzo
3fe4261f12 don't attempt compaction while still syncing 2021-07-04 18:38:28 +03:00
vyzo
7b02673620 don't try to visit genesis parent blocks 2021-07-04 18:38:28 +03:00
vyzo
997f2c098b keep headers hot when running with a noop splitstore 2021-07-04 18:38:28 +03:00
vyzo
7c814cd2e3 refactor genesis state loading code into its own method 2021-07-04 18:38:28 +03:00
vyzo
41573f1fb2 also walk parent message receipts when including messages in the walk 2021-07-04 18:38:28 +03:00
vyzo
fa6481401d reduce SyncGapTime to 1 minute
for maximal safety.
2021-07-04 18:38:28 +03:00
vyzo
d33a44e67f first visit the cid, then short-circuit non dagcbor objects 2021-07-04 18:38:28 +03:00
vyzo
bdb97d6186 more robust handling of sync gap walks 2021-07-04 18:38:28 +03:00
vyzo
7cf75e667d keep genesis-linked state hot 2021-07-04 18:38:28 +03:00
Raúl Kripalani
b2b7eb2ded metrics: increment misses in View(). 2021-07-04 18:38:28 +03:00
vyzo
3a9b7c592d mark from current epoch to boundary epoch when necessary
this is necessary to avoid wearing clown shoes when the node stays
offline for an extended period of time (more than 1 finality).

Basically it gets quite slow if we do the full 2 finality walk, so we
try to avoid it unless necessary.
The conditions under which a full walk is necessary is if there is a
sync gap (most likely because the node was offline) during which the
tracking of writes is inaccurate because we have not yet delivered the
HeadChange notification.  In this case, it is possible to have
actually hot blocks to be tracked before the boundary and fail to mark
them accordingly.  So when we detect a sync gap, we do the full walk;
if there is no sync gap, we can just use the much faster boundary
epoch walk.
2021-07-04 18:38:28 +03:00
vyzo
d7ceef104e decrease CompactionThreshold to 3 finalities 2021-07-04 18:38:28 +03:00
vyzo
e3cbeec6ee implement chain walking 2021-07-04 18:38:28 +03:00
vyzo
04f2e102a1 kill full splitstore compaction, simplify splitstore configuration 2021-07-04 18:38:28 +03:00
Steven Allen
63db9e1633 fix(splitstore): fix a panic on revert-only head changes
Calling, e.g., `lotus chain sethead` on an ancestor tipset won't apply
any new blocks, it'll just revert a bunch. This will lead to HeadChange
calls with no new blocks to apply.

fixes #6125
2021-04-28 20:35:30 -07:00
vyzo
1b1d3606cd make linter happy 2021-03-11 13:10:44 +02:00
vyzo
353bb1881f compact hotstore if it provides the method 2021-03-11 11:45:19 +02:00