2022-08-08 12:08:36 +03:00
|
|
|
// Copyright 2022 The go-ethereum Authors
|
|
|
|
// This file is part of the go-ethereum library.
|
|
|
|
//
|
|
|
|
// The go-ethereum library is free software: you can redistribute it and/or modify
|
|
|
|
// it under the terms of the GNU Lesser General Public License as published by
|
|
|
|
// the Free Software Foundation, either version 3 of the License, or
|
|
|
|
// (at your option) any later version.
|
|
|
|
//
|
|
|
|
// The go-ethereum library is distributed in the hope that it will be useful,
|
|
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
// GNU Lesser General Public License for more details.
|
|
|
|
//
|
|
|
|
// You should have received a copy of the GNU Lesser General Public License
|
|
|
|
// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
|
|
|
|
package rawdb
|
|
|
|
|
2024-04-30 12:33:22 +03:00
|
|
|
import (
|
|
|
|
"path/filepath"
|
|
|
|
|
|
|
|
"github.com/ethereum/go-ethereum/ethdb"
|
|
|
|
)
|
2023-08-01 15:17:32 +03:00
|
|
|
|
2022-08-08 12:08:36 +03:00
|
|
|
// The list of table names of chain freezer.
|
|
|
|
const (
|
2023-02-21 13:17:34 +03:00
|
|
|
// ChainFreezerHeaderTable indicates the name of the freezer header table.
|
|
|
|
ChainFreezerHeaderTable = "headers"
|
2022-08-08 12:08:36 +03:00
|
|
|
|
2023-02-21 13:17:34 +03:00
|
|
|
// ChainFreezerHashTable indicates the name of the freezer canonical hash table.
|
|
|
|
ChainFreezerHashTable = "hashes"
|
2022-08-08 12:08:36 +03:00
|
|
|
|
2023-02-21 13:17:34 +03:00
|
|
|
// ChainFreezerBodiesTable indicates the name of the freezer block body table.
|
|
|
|
ChainFreezerBodiesTable = "bodies"
|
2022-08-08 12:08:36 +03:00
|
|
|
|
2023-02-21 13:17:34 +03:00
|
|
|
// ChainFreezerReceiptTable indicates the name of the freezer receipts table.
|
|
|
|
ChainFreezerReceiptTable = "receipts"
|
2022-08-08 12:08:36 +03:00
|
|
|
|
2023-02-21 13:17:34 +03:00
|
|
|
// ChainFreezerDifficultyTable indicates the name of the freezer total difficulty table.
|
|
|
|
ChainFreezerDifficultyTable = "diffs"
|
2022-08-08 12:08:36 +03:00
|
|
|
)
|
|
|
|
|
|
|
|
// chainFreezerNoSnappy configures whether compression is disabled for the ancient-tables.
|
|
|
|
// Hashes and difficulties don't compress well.
|
|
|
|
var chainFreezerNoSnappy = map[string]bool{
|
2023-02-21 13:17:34 +03:00
|
|
|
ChainFreezerHeaderTable: false,
|
|
|
|
ChainFreezerHashTable: true,
|
|
|
|
ChainFreezerBodiesTable: false,
|
|
|
|
ChainFreezerReceiptTable: false,
|
|
|
|
ChainFreezerDifficultyTable: true,
|
2022-08-08 12:08:36 +03:00
|
|
|
}
|
|
|
|
|
2023-08-01 15:17:32 +03:00
|
|
|
const (
|
|
|
|
// stateHistoryTableSize defines the maximum size of freezer data files.
|
|
|
|
stateHistoryTableSize = 2 * 1000 * 1000 * 1000
|
|
|
|
|
|
|
|
// stateHistoryAccountIndex indicates the name of the freezer state history table.
|
|
|
|
stateHistoryMeta = "history.meta"
|
|
|
|
stateHistoryAccountIndex = "account.index"
|
|
|
|
stateHistoryStorageIndex = "storage.index"
|
|
|
|
stateHistoryAccountData = "account.data"
|
|
|
|
stateHistoryStorageData = "storage.data"
|
|
|
|
)
|
|
|
|
|
all: activate pbss as experimental feature (#26274)
* all: activate pbss
* core/rawdb: fix compilation error
* cma, core, eth, les, trie: address comments
* cmd, core, eth, trie: polish code
* core, cmd, eth: address comments
* cmd, core, eth, les, light, tests: address comment
* cmd/utils: shorten log message
* trie/triedb/pathdb: limit node buffer size to 1gb
* cmd/utils: fix opening non-existing db
* cmd/utils: rename flag name
* cmd, core: group chain history flags and fix tests
* core, eth, trie: fix memory leak in snapshot generation
* cmd, eth, internal: deprecate flags
* all: enable state tests for pathdb, fixes
* cmd, core: polish code
* trie/triedb/pathdb: limit the node buffer size to 256mb
---------
Co-authored-by: Martin Holst Swende <martin@swende.se>
Co-authored-by: Péter Szilágyi <peterke@gmail.com>
2023-08-10 22:21:36 +03:00
|
|
|
var stateFreezerNoSnappy = map[string]bool{
|
2023-08-01 15:17:32 +03:00
|
|
|
stateHistoryMeta: true,
|
|
|
|
stateHistoryAccountIndex: false,
|
|
|
|
stateHistoryStorageIndex: false,
|
|
|
|
stateHistoryAccountData: false,
|
|
|
|
stateHistoryStorageData: false,
|
|
|
|
}
|
|
|
|
|
2022-08-08 12:08:36 +03:00
|
|
|
// The list of identifiers of ancient stores.
|
|
|
|
var (
|
core, cmd, trie: fix the condition of pathdb initialization (#28718)
Original problem was caused by #28595, where we made it so that as soon as we start to sync, the root of the disk layer is deleted. That is not wrong per se, but another part of the code uses the "presence of the root" as an init-check for the pathdb. And, since the init-check now failed, the code tried to re-initialize it which failed since a sync was already ongoing.
The total impact being: after a state-sync has begun, if the node for some reason is is shut down, it will refuse to start up again, with the error message: `Fatal: Failed to register the Ethereum service: waiting for sync.`.
This change also modifies how `geth removedb` works, so that the user is prompted for two things: `state data` and `ancient chain`. The former includes both the chaindb aswell as any state history stored in ancients.
---------
Co-authored-by: Martin HS <martin@swende.se>
2023-12-21 22:28:32 +03:00
|
|
|
ChainFreezerName = "chain" // the folder name of chain segment ancient store.
|
|
|
|
StateFreezerName = "state" // the folder name of reverse diff ancient store.
|
2022-08-08 12:08:36 +03:00
|
|
|
)
|
|
|
|
|
|
|
|
// freezers the collections of all builtin freezers.
|
core, cmd, trie: fix the condition of pathdb initialization (#28718)
Original problem was caused by #28595, where we made it so that as soon as we start to sync, the root of the disk layer is deleted. That is not wrong per se, but another part of the code uses the "presence of the root" as an init-check for the pathdb. And, since the init-check now failed, the code tried to re-initialize it which failed since a sync was already ongoing.
The total impact being: after a state-sync has begun, if the node for some reason is is shut down, it will refuse to start up again, with the error message: `Fatal: Failed to register the Ethereum service: waiting for sync.`.
This change also modifies how `geth removedb` works, so that the user is prompted for two things: `state data` and `ancient chain`. The former includes both the chaindb aswell as any state history stored in ancients.
---------
Co-authored-by: Martin HS <martin@swende.se>
2023-12-21 22:28:32 +03:00
|
|
|
var freezers = []string{ChainFreezerName, StateFreezerName}
|
2023-08-01 15:17:32 +03:00
|
|
|
|
2024-04-30 12:33:22 +03:00
|
|
|
// NewStateFreezer initializes the ancient store for state history.
|
|
|
|
//
|
|
|
|
// - if the empty directory is given, initializes the pure in-memory
|
|
|
|
// state freezer (e.g. dev mode).
|
|
|
|
// - if non-empty directory is given, initializes the regular file-based
|
|
|
|
// state freezer.
|
|
|
|
func NewStateFreezer(ancientDir string, readOnly bool) (ethdb.ResettableAncientStore, error) {
|
|
|
|
if ancientDir == "" {
|
|
|
|
return NewMemoryFreezer(readOnly, stateFreezerNoSnappy), nil
|
|
|
|
}
|
|
|
|
return newResettableFreezer(filepath.Join(ancientDir, StateFreezerName), "eth/db/state", readOnly, stateHistoryTableSize, stateFreezerNoSnappy)
|
2023-08-01 15:17:32 +03:00
|
|
|
}
|