Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
G
Geth-Modification
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
张蕾
Geth-Modification
Commits
d6ffa140
Unverified
Commit
d6ffa140
authored
4 years ago
by
gary rong
Committed by
GitHub
4 years ago
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
core: nuke legacy snapshot supporting (#22663)
parent
653b7e95
Changes
4
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
12 additions
and
472 deletions
+12
-472
blockchain.go
core/blockchain.go
+4
-11
blockchain_snapshot_test.go
core/blockchain_snapshot_test.go
+7
-313
journal.go
core/state/snapshot/journal.go
+1
-121
snapshot.go
core/state/snapshot/snapshot.go
+0
-27
No files found.
core/blockchain.go
View file @
d6ffa140
...
...
@@ -207,9 +207,8 @@ type BlockChain struct {
processor
Processor
// Block transaction processor interface
vmConfig
vm
.
Config
shouldPreserve
func
(
*
types
.
Block
)
bool
// Function used to determine whether should preserve the given block.
terminateInsert
func
(
common
.
Hash
,
uint64
)
bool
// Testing hook used to terminate ancient receipt chain insertion.
writeLegacyJournal
bool
// Testing flag used to flush the snapshot journal in legacy format.
shouldPreserve
func
(
*
types
.
Block
)
bool
// Function used to determine whether should preserve the given block.
terminateInsert
func
(
common
.
Hash
,
uint64
)
bool
// Testing hook used to terminate ancient receipt chain insertion.
}
// NewBlockChain returns a fully initialised block chain using information
...
...
@@ -1002,14 +1001,8 @@ func (bc *BlockChain) Stop() {
var
snapBase
common
.
Hash
if
bc
.
snaps
!=
nil
{
var
err
error
if
bc
.
writeLegacyJournal
{
if
snapBase
,
err
=
bc
.
snaps
.
LegacyJournal
(
bc
.
CurrentBlock
()
.
Root
());
err
!=
nil
{
log
.
Error
(
"Failed to journal state snapshot"
,
"err"
,
err
)
}
}
else
{
if
snapBase
,
err
=
bc
.
snaps
.
Journal
(
bc
.
CurrentBlock
()
.
Root
());
err
!=
nil
{
log
.
Error
(
"Failed to journal state snapshot"
,
"err"
,
err
)
}
if
snapBase
,
err
=
bc
.
snaps
.
Journal
(
bc
.
CurrentBlock
()
.
Root
());
err
!=
nil
{
log
.
Error
(
"Failed to journal state snapshot"
,
"err"
,
err
)
}
}
// Ensure the state of a recent block is also stored to disk before exiting.
...
...
This diff is collapsed.
Click to expand it.
core/blockchain_snapshot_test.go
View file @
d6ffa140
This diff is collapsed.
Click to expand it.
core/state/snapshot/journal.go
View file @
d6ffa140
...
...
@@ -66,30 +66,6 @@ type journalStorage struct {
Vals
[][]
byte
}
// loadAndParseLegacyJournal tries to parse the snapshot journal in legacy format.
func
loadAndParseLegacyJournal
(
db
ethdb
.
KeyValueStore
,
base
*
diskLayer
)
(
snapshot
,
journalGenerator
,
error
)
{
// Retrieve the journal, for legacy journal it must exist since even for
// 0 layer it stores whether we've already generated the snapshot or are
// in progress only.
journal
:=
rawdb
.
ReadSnapshotJournal
(
db
)
if
len
(
journal
)
==
0
{
return
nil
,
journalGenerator
{},
errors
.
New
(
"missing or corrupted snapshot journal"
)
}
r
:=
rlp
.
NewStream
(
bytes
.
NewReader
(
journal
),
0
)
// Read the snapshot generation progress for the disk layer
var
generator
journalGenerator
if
err
:=
r
.
Decode
(
&
generator
);
err
!=
nil
{
return
nil
,
journalGenerator
{},
fmt
.
Errorf
(
"failed to load snapshot progress marker: %v"
,
err
)
}
// Load all the snapshot diffs from the journal
snapshot
,
err
:=
loadDiffLayer
(
base
,
r
)
if
err
!=
nil
{
return
nil
,
generator
,
err
}
return
snapshot
,
generator
,
nil
}
// loadAndParseJournal tries to parse the snapshot journal in latest format.
func
loadAndParseJournal
(
db
ethdb
.
KeyValueStore
,
base
*
diskLayer
)
(
snapshot
,
journalGenerator
,
error
)
{
// Retrieve the disk layer generator. It must exist, no matter the
...
...
@@ -163,14 +139,9 @@ func loadSnapshot(diskdb ethdb.KeyValueStore, triedb *trie.Database, cache int,
cache
:
fastcache
.
New
(
cache
*
1024
*
1024
),
root
:
baseRoot
,
}
var
legacy
bool
snapshot
,
generator
,
err
:=
loadAndParseJournal
(
diskdb
,
base
)
if
err
!=
nil
{
log
.
Warn
(
"Failed to load new-format journal"
,
"error"
,
err
)
snapshot
,
generator
,
err
=
loadAndParseLegacyJournal
(
diskdb
,
base
)
legacy
=
true
}
if
err
!=
nil
{
return
nil
,
err
}
// Entire snapshot journal loaded, sanity check the head. If the loaded
...
...
@@ -185,7 +156,7 @@ func loadSnapshot(diskdb ethdb.KeyValueStore, triedb *trie.Database, cache int,
// If it's legacy snapshot, or it's new-format snapshot but
// it's not in recovery mode, returns the error here for
// rebuilding the entire snapshot forcibly.
if
legacy
||
!
recovery
{
if
!
recovery
{
return
nil
,
fmt
.
Errorf
(
"head doesn't match snapshot: have %#x, want %#x"
,
head
,
root
)
}
// It's in snapshot recovery, the assumption is held that
...
...
@@ -346,94 +317,3 @@ func (dl *diffLayer) Journal(buffer *bytes.Buffer) (common.Hash, error) {
log
.
Debug
(
"Journalled diff layer"
,
"root"
,
dl
.
root
,
"parent"
,
dl
.
parent
.
Root
())
return
base
,
nil
}
// LegacyJournal writes the persistent layer generator stats into a buffer
// to be stored in the database as the snapshot journal.
//
// Note it's the legacy version which is only used in testing right now.
func
(
dl
*
diskLayer
)
LegacyJournal
(
buffer
*
bytes
.
Buffer
)
(
common
.
Hash
,
error
)
{
// If the snapshot is currently being generated, abort it
var
stats
*
generatorStats
if
dl
.
genAbort
!=
nil
{
abort
:=
make
(
chan
*
generatorStats
)
dl
.
genAbort
<-
abort
if
stats
=
<-
abort
;
stats
!=
nil
{
stats
.
Log
(
"Journalling in-progress snapshot"
,
dl
.
root
,
dl
.
genMarker
)
}
}
// Ensure the layer didn't get stale
dl
.
lock
.
RLock
()
defer
dl
.
lock
.
RUnlock
()
if
dl
.
stale
{
return
common
.
Hash
{},
ErrSnapshotStale
}
// Write out the generator marker
entry
:=
journalGenerator
{
Done
:
dl
.
genMarker
==
nil
,
Marker
:
dl
.
genMarker
,
}
if
stats
!=
nil
{
entry
.
Accounts
=
stats
.
accounts
entry
.
Slots
=
stats
.
slots
entry
.
Storage
=
uint64
(
stats
.
storage
)
}
log
.
Debug
(
"Legacy journalled disk layer"
,
"root"
,
dl
.
root
)
if
err
:=
rlp
.
Encode
(
buffer
,
entry
);
err
!=
nil
{
return
common
.
Hash
{},
err
}
return
dl
.
root
,
nil
}
// Journal writes the memory layer contents into a buffer to be stored in the
// database as the snapshot journal.
//
// Note it's the legacy version which is only used in testing right now.
func
(
dl
*
diffLayer
)
LegacyJournal
(
buffer
*
bytes
.
Buffer
)
(
common
.
Hash
,
error
)
{
// Journal the parent first
base
,
err
:=
dl
.
parent
.
LegacyJournal
(
buffer
)
if
err
!=
nil
{
return
common
.
Hash
{},
err
}
// Ensure the layer didn't get stale
dl
.
lock
.
RLock
()
defer
dl
.
lock
.
RUnlock
()
if
dl
.
Stale
()
{
return
common
.
Hash
{},
ErrSnapshotStale
}
// Everything below was journalled, persist this layer too
if
err
:=
rlp
.
Encode
(
buffer
,
dl
.
root
);
err
!=
nil
{
return
common
.
Hash
{},
err
}
destructs
:=
make
([]
journalDestruct
,
0
,
len
(
dl
.
destructSet
))
for
hash
:=
range
dl
.
destructSet
{
destructs
=
append
(
destructs
,
journalDestruct
{
Hash
:
hash
})
}
if
err
:=
rlp
.
Encode
(
buffer
,
destructs
);
err
!=
nil
{
return
common
.
Hash
{},
err
}
accounts
:=
make
([]
journalAccount
,
0
,
len
(
dl
.
accountData
))
for
hash
,
blob
:=
range
dl
.
accountData
{
accounts
=
append
(
accounts
,
journalAccount
{
Hash
:
hash
,
Blob
:
blob
})
}
if
err
:=
rlp
.
Encode
(
buffer
,
accounts
);
err
!=
nil
{
return
common
.
Hash
{},
err
}
storage
:=
make
([]
journalStorage
,
0
,
len
(
dl
.
storageData
))
for
hash
,
slots
:=
range
dl
.
storageData
{
keys
:=
make
([]
common
.
Hash
,
0
,
len
(
slots
))
vals
:=
make
([][]
byte
,
0
,
len
(
slots
))
for
key
,
val
:=
range
slots
{
keys
=
append
(
keys
,
key
)
vals
=
append
(
vals
,
val
)
}
storage
=
append
(
storage
,
journalStorage
{
Hash
:
hash
,
Keys
:
keys
,
Vals
:
vals
})
}
if
err
:=
rlp
.
Encode
(
buffer
,
storage
);
err
!=
nil
{
return
common
.
Hash
{},
err
}
log
.
Debug
(
"Legacy journalled diff layer"
,
"root"
,
dl
.
root
,
"parent"
,
dl
.
parent
.
Root
())
return
base
,
nil
}
This diff is collapsed.
Click to expand it.
core/state/snapshot/snapshot.go
View file @
d6ffa140
...
...
@@ -137,10 +137,6 @@ type snapshot interface {
// flattening everything down (bad for reorgs).
Journal
(
buffer
*
bytes
.
Buffer
)
(
common
.
Hash
,
error
)
// LegacyJournal is basically identical to Journal. it's the legacy version for
// flushing legacy journal. Now the only purpose of this function is for testing.
LegacyJournal
(
buffer
*
bytes
.
Buffer
)
(
common
.
Hash
,
error
)
// Stale return whether this layer has become stale (was flattened across) or
// if it's still live.
Stale
()
bool
...
...
@@ -622,29 +618,6 @@ func (t *Tree) Journal(root common.Hash) (common.Hash, error) {
return
base
,
nil
}
// LegacyJournal is basically identical to Journal. it's the legacy
// version for flushing legacy journal. Now the only purpose of this
// function is for testing.
func
(
t
*
Tree
)
LegacyJournal
(
root
common
.
Hash
)
(
common
.
Hash
,
error
)
{
// Retrieve the head snapshot to journal from var snap snapshot
snap
:=
t
.
Snapshot
(
root
)
if
snap
==
nil
{
return
common
.
Hash
{},
fmt
.
Errorf
(
"snapshot [%#x] missing"
,
root
)
}
// Run the journaling
t
.
lock
.
Lock
()
defer
t
.
lock
.
Unlock
()
journal
:=
new
(
bytes
.
Buffer
)
base
,
err
:=
snap
.
(
snapshot
)
.
LegacyJournal
(
journal
)
if
err
!=
nil
{
return
common
.
Hash
{},
err
}
// Store the journal into the database and return
rawdb
.
WriteSnapshotJournal
(
t
.
diskdb
,
journal
.
Bytes
())
return
base
,
nil
}
// Rebuild wipes all available snapshot data from the persistent database and
// discard all caches and diff layers. Afterwards, it starts a new snapshot
// generator with the given root hash.
...
...
This diff is collapsed.
Click to expand it.
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment