2019-05-27 13:51:49 +00:00
package dbutils
2020-06-08 10:53:03 +00:00
import (
"sort"
2020-08-10 23:55:32 +00:00
"strings"
2021-04-24 15:46:29 +00:00
2021-07-01 21:31:14 +00:00
"github.com/ledgerwatch/erigon-lib/gointerfaces/types"
2020-06-08 10:53:03 +00:00
)
2019-05-27 13:51:49 +00:00
2021-04-24 15:46:29 +00:00
// DBSchemaVersion
2021-06-20 19:46:57 +00:00
var DBSchemaVersion = types . VersionReply { Major : 3 , Minor : 0 , Patch : 0 }
2021-04-24 15:46:29 +00:00
2020-08-05 10:13:35 +00:00
// Buckets
2021-03-13 02:30:54 +00:00
// Dictionary:
// "Plain State" - state where keys arent' hashed. "CurrentState" - same, but keys are hashed. "PlainState" used for blocks execution. "CurrentState" used mostly for Merkle root calculation.
// "incarnation" - uint64 number - how much times given account was SelfDestruct'ed.
2021-05-31 08:29:46 +00:00
/ *
PlainStateBucket logical layout :
2021-03-13 02:30:54 +00:00
Contains Accounts :
key - address ( unhashed )
value - account encoded for storage
Contains Storage :
key - address ( unhashed ) + incarnation + storage key ( unhashed )
value - storage value ( common . hash )
Physical layout :
2021-06-16 10:57:58 +00:00
PlainStateBucket and HashedStorageBucket utilises DupSort feature of MDBX ( store multiple values inside 1 key ) .
2021-03-13 02:30:54 +00:00
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -
key | value
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -
[ acc_hash ] | [ acc_value ]
[ acc_hash ] + [ inc ] | [ storage1_hash ] + [ storage1_value ]
| [ storage2_hash ] + [ storage2_value ] // this value has no own key. it's 2nd value of [acc_hash]+[inc] key.
| [ storage3_hash ] + [ storage3_value ]
| ...
[ acc_hash ] + [ old_inc ] | [ storage1_hash ] + [ storage1_value ]
| ...
[ acc2_hash ] | [ acc2_value ]
...
* /
2021-06-20 19:46:57 +00:00
const PlainStateBucket = "PlainState"
2021-03-13 02:30:54 +00:00
2021-05-31 08:29:46 +00:00
//PlainContractCodeBucket -
//key - address+incarnation
//value - code hash
2021-06-20 19:46:57 +00:00
const PlainContractCodeBucket = "PlainCodeHash"
2021-05-31 08:29:46 +00:00
/ *
2021-05-31 09:49:39 +00:00
AccountChangeSetBucket and StorageChangeSetBucket - of block N store values of state before block N changed them .
Because values "after" change stored in PlainState .
Logical format :
2021-05-31 08:29:46 +00:00
key - blockNum_u64 + key_in_plain_state
value - value_in_plain_state_before_blockNum_changes
2020-05-15 07:52:45 +00:00
2021-05-31 08:29:46 +00:00
Example : If block N changed account A from value X to Y . Then :
AccountChangeSetBucket has record : bigEndian ( N ) + A - > X
PlainStateBucket has record : A - > Y
2020-05-15 07:52:45 +00:00
2021-05-31 08:29:46 +00:00
See also : docs / programmers_guide / db_walkthrough . MD # table - history - of - accounts
As you can see if block N changes much accounts - then all records have repetitive prefix ` bigEndian(N) ` .
MDBX can store such prefixes only once - by DupSort feature ( see ` docs/programmers_guide/dupsort.md ` ) .
Both buckets are DupSort - ed and have physical format :
AccountChangeSetBucket :
key - blockNum_u64
value - address + account ( encoded )
StorageChangeSetBucket :
key - blockNum_u64 + address + incarnation_u64
value - plain_storage_key + value
* /
2021-06-20 19:46:57 +00:00
const AccountChangeSetBucket = "AccountChangeSet"
const StorageChangeSetBucket = "StorageChangeSet"
2021-05-31 08:29:46 +00:00
const (
2020-05-15 07:52:45 +00:00
2021-03-13 02:30:54 +00:00
//HashedAccountsBucket
2019-12-20 12:25:40 +00:00
// key - address hash
// value - account encoded for storage
2020-04-19 19:51:32 +00:00
// Contains Storage:
//key - address hash + incarnation + storage key hash
//value - storage value(common.hash)
2021-06-20 19:46:57 +00:00
HashedAccountsBucket = "HashedAccount"
HashedStorageBucket = "HashedStorage"
2021-05-31 05:30:30 +00:00
)
2019-12-20 12:25:40 +00:00
2021-05-31 08:29:46 +00:00
/ *
AccountsHistoryBucket and StorageHistoryBucket - indices designed to serve next 2 type of requests :
2021-05-31 05:30:30 +00:00
1. what is smallest block number >= X where account A changed
2. get last shard of A - to append there new block numbers
2021-05-31 09:49:39 +00:00
Task 1. is part of "get historical state" operation ( see ` core/state:GetAsOf ` ) :
If ` db.Seek(A+bigEndian(X)) ` returns non - last shard -
then get block number from shard value Y := RoaringBitmap ( shard_value ) . GetGte ( X )
and with Y go to ChangeSets : db . Get ( ChangeSets , Y + A )
If ` db.Seek(A+bigEndian(X)) ` returns last shard -
then we go to PlainState : db . Get ( PlainState , A )
2021-05-31 05:30:30 +00:00
Format :
- index split to shards by 2 Kb - RoaringBitmap encoded sorted list of block numbers
( to avoid performance degradation of popular accounts or look deep into history .
Also 2 Kb allows avoid Overflow pages inside DB . )
- if shard is not last - then key has suffix 8 bytes = bigEndian ( max_block_num_in_this_shard )
- if shard is last - then key has suffix 8 bytes = 0xFF
It allows :
- server task 1. by 1 db operation db . Seek ( A + bigEndian ( X ) )
- server task 2. by 1 db operation db . Get ( A + 0xFF )
2021-05-31 08:29:46 +00:00
see also : docs / programmers_guide / db_walkthrough . MD # table - change - sets
2021-05-31 05:30:30 +00:00
AccountsHistoryBucket :
key - address + shard_id_u64
value - roaring bitmap - list of block where it changed
StorageHistoryBucket
key - address + storage_key + shard_id_u64
value - roaring bitmap - list of block where it changed
* /
2021-06-20 19:46:57 +00:00
var AccountsHistoryBucket = "AccountHistory"
var StorageHistoryBucket = "StorageHistory"
2019-05-27 13:51:49 +00:00
2021-05-31 05:30:30 +00:00
var (
2019-12-20 12:25:40 +00:00
//key - contract code hash
//value - contract code
2021-06-20 19:46:57 +00:00
CodeBucket = "Code"
2019-12-20 12:25:40 +00:00
//key - addressHash+incarnation
//value - code hash
2021-06-20 19:46:57 +00:00
ContractCodeBucket = "HashedCodeHash"
2019-12-20 12:25:40 +00:00
2021-02-21 18:41:59 +00:00
// IncarnationMapBucket for deleted accounts
2020-05-26 12:27:21 +00:00
//key - address
//value - incarnation of account when it was last deleted
2021-06-20 19:46:57 +00:00
IncarnationMapBucket = "IncarnationMap"
2021-05-27 13:54:55 +00:00
//TEVMCodeBucket -
//key - contract code hash
2021-06-11 08:34:25 +00:00
//value - contract TEVM code
2021-05-27 15:58:39 +00:00
ContractTEVMCodeBucket = "TEVMCode"
2021-03-13 02:30:54 +00:00
)
2020-05-26 12:27:21 +00:00
2021-03-13 02:30:54 +00:00
/ * TrieOfAccountsBucket and TrieOfStorageBucket
hasState , groups - mark prefixes existing in hashed_account table
hasTree - mark prefixes existing in trie_account table ( not related with branchNodes )
hasHash - mark prefixes which hashes are saved in current trie_account record ( actually only hashes of branchNodes can be saved )
@ see UnmarshalTrieNode
@ see integrity . Trie
+ -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- - +
| DB record : 0x0B , hasState : 0b1011 , hasTree : 0b1001 , hasHash : 0b1001 , hashes : [ x , x ] |
+ -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- - +
| | |
v | v
+ -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- - + | + -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- +
| DB record : 0x0B00 , hasState : 0b10001 | | | DB record : 0x0B03 , hasState : 0b10010 |
| hasTree : 0 , hasHash : 0b10000 , hashes : [ x ] | | | hasTree : 0 , hasHash : 0 , hashes : [ ] |
+ -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- - + | + -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- +
| | | | |
v v v v v
+ -- -- -- -- -- -- -- -- -- + + -- -- -- -- -- -- -- -- -- -- -- + + -- -- -- -- -- -- -- - + + -- -- -- -- -- -- -- - + + -- -- -- -- -- -- -- - +
| Account : | | BranchNode : 0x0B0004 | | Account : | | Account : | | Account : |
2021-03-20 09:38:45 +00:00
| 0x0B0000 ... | | has no record in | | 0x0B01 ... | | 0x0B0301 ... | | 0x0B0304 ... |
2021-03-13 02:30:54 +00:00
| in HashedAccount | | TrieAccount | | | | | | |
+ -- -- -- -- -- -- -- -- -- + + -- -- -- -- -- -- -- -- -- -- -- + + -- -- -- -- -- -- -- - + + -- -- -- -- -- -- -- - + + -- -- -- -- -- -- -- - +
| |
v v
2021-02-21 18:41:59 +00:00
+ -- -- -- -- -- -- -- - + + -- -- -- -- -- -- -- - +
| Account : | | Account : |
| 0x0B000400 ... | | 0x0B000401 ... |
+ -- -- -- -- -- -- -- - + + -- -- -- -- -- -- -- - +
2021-03-13 02:30:54 +00:00
Invariants :
- hasTree is subset of hasState
- hasHash is subset of hasState
- first level in account_trie always exists if hasState > 0
- TrieStorage record of account . root ( length = 40 ) must have + 1 hash - it ' s account . root
- each record in TrieAccount table must have parent ( may be not direct ) and this parent must have correct bit in hasTree bitmap
- if hasState has bit - then HashedAccount table must have record according to this bit
- each TrieAccount record must cover some state ( means hasState is always > 0 )
- TrieAccount records with length = 1 can satisfy ( hasBranch == 0 && hasHash == 0 ) condition
- Other records in TrieAccount and TrieStorage must ( hasTree != 0 || hasHash != 0 )
* /
2021-06-20 19:46:57 +00:00
const TrieOfAccountsBucket = "TrieAccount"
const TrieOfStorageBucket = "TrieStorage"
2020-01-31 04:11:20 +00:00
2021-04-08 02:46:11 +00:00
const (
2020-02-13 14:45:02 +00:00
// DatabaseInfoBucket is used to store information about data layout.
2021-07-06 22:33:26 +00:00
DatabaseInfoBucket = "DbInfo"
SnapshotInfoBucket = "SnapshotInfo"
BittorrentInfoBucket = "BittorrentInfo"
2020-02-13 14:45:02 +00:00
2019-05-27 13:51:49 +00:00
// Data item prefixes (use single byte to avoid mixing data types, avoid `i`, used for indexes).
2021-06-20 19:46:57 +00:00
HeaderPrefixOld = "h" // block_num_u64 + hash -> header
HeaderNumberBucket = "HeaderNumber" // headerNumberPrefix + hash -> num (uint64 big endian)
2021-03-19 12:54:47 +00:00
2021-06-20 19:46:57 +00:00
HeaderCanonicalBucket = "CanonicalHeader" // block_num_u64 -> header hash
HeadersBucket = "Header" // block_num_u64 + hash -> header (RLP)
HeaderTDBucket = "HeadersTotalDifficulty" // block_num_u64 + hash -> td (RLP)
2019-05-27 13:51:49 +00:00
2021-06-20 19:46:57 +00:00
BlockBodyPrefix = "BlockBody" // block_num_u64 + hash -> block body
EthTx = "BlockTransaction" // tbl_sequence_u64 -> rlp(tx)
BlockReceiptsPrefix = "Receipt" // block_num_u64 -> canonical block receipts (non-canonical are not stored)
Log = "TransactionLog" // block_num_u64 + txId -> logs of transaction
2019-05-27 13:51:49 +00:00
2020-09-28 17:18:36 +00:00
// Stores bitmap indices - in which block numbers saw logs of given 'address' or 'topic'
// [addr or topic] + [2 bytes inverted shard number] -> bitmap(blockN)
// indices are sharded - because some bitmaps are >1Mb and when new incoming blocks process it
2021-06-16 10:57:58 +00:00
// updates ~300 of bitmaps - by append small amount new values. It cause much big writes (MDBX does copy-on-write).
2020-09-28 17:18:36 +00:00
//
2020-10-02 03:54:11 +00:00
// if last existing shard size merge it with delta
// if serialized size of delta > ShardLimit - break down to multiple shards
// shard number - it's biggest value in bitmap
2021-06-20 19:46:57 +00:00
LogTopicIndex = "LogTopicIndex"
LogAddressIndex = "LogAddressIndex"
2020-09-28 17:18:36 +00:00
2021-05-10 15:07:22 +00:00
// CallTraceSet is the name of the table that contain the mapping of block number to the set (sorted) of all accounts
// touched by call traces. It is DupSort-ed table
2021-06-11 08:34:25 +00:00
// 8-byte BE block number -> account address -> two bits (one for "from", another for "to")
2021-06-20 19:46:57 +00:00
CallTraceSet = "CallTraceSet"
2020-10-12 08:39:04 +00:00
// Indices for call traces - have the same format as LogTopicIndex and LogAddressIndex
// Store bitmap indices - in which block number we saw calls from (CallFromIndex) or to (CallToIndex) some addresses
2021-06-20 19:46:57 +00:00
CallFromIndex = "CallFromIndex"
CallToIndex = "CallToIndex"
2020-10-12 08:39:04 +00:00
2021-06-20 19:46:57 +00:00
TxLookupPrefix = "BlockTransactionLookup" // hash -> transaction/receipt lookup metadata
BloomBitsPrefix = "BloomBits" // bit (uint16 big endian) + section (uint64 big endian) + hash -> bloom bits
2019-05-27 13:51:49 +00:00
2021-06-20 19:46:57 +00:00
ConfigPrefix = "Config" // config prefix for the db
2019-05-27 13:51:49 +00:00
// Chain index prefixes (use `i` + single byte to avoid mixing data types).
2021-06-20 19:46:57 +00:00
BloomBitsIndexPrefix = "BloomBitsIndex" // BloomBitsIndexPrefix is the data table of a chain indexer to track its progress
2020-08-04 09:25:28 +00:00
2020-08-05 10:13:35 +00:00
// Progress of sync stages: stageName -> stageData
2021-06-20 19:46:57 +00:00
SyncStageProgress = "SyncStage"
2020-08-05 10:13:35 +00:00
// Position to where to unwind sync stages: stageName -> stageData
2021-06-20 19:46:57 +00:00
SyncStageUnwind = "SyncStageUnwind"
2020-08-05 10:13:35 +00:00
2021-06-20 19:46:57 +00:00
CliqueBucket = "Clique"
CliqueSeparateBucket = "CliqueSeparate"
CliqueSnapshotBucket = "CliqueSnapshot"
CliqueLastSnapshotBucket = "CliqueLastSnapshot"
2020-08-04 09:25:28 +00:00
2020-08-05 10:13:35 +00:00
// this bucket stored in separated database
2021-06-20 19:46:57 +00:00
InodesBucket = "Inode"
2020-08-05 10:13:35 +00:00
// Transaction senders - stored separately from the block bodies
2021-06-20 19:46:57 +00:00
Senders = "TxSender" // block_num_u64 + blockHash -> sendersList (no serialization format, every 20 bytes is new sender)
2020-08-05 10:13:35 +00:00
// headBlockKey tracks the latest know full block's hash.
2020-08-10 23:55:32 +00:00
HeadBlockKey = "LastBlock"
2020-08-05 10:13:35 +00:00
// migrationName -> serialized SyncStageProgress and SyncStageUnwind buckets
// it stores stages progress to understand in which context was executed migration
// in case of bug-report developer can ask content of this bucket
2021-06-20 19:46:57 +00:00
Migrations = "Migration"
2020-11-14 13:48:29 +00:00
2021-06-20 19:46:57 +00:00
Sequence = "Sequence" // tbl_name -> seq_u64
2021-05-22 03:03:02 +00:00
HeadHeaderKey = "LastHeader"
2021-07-02 08:00:41 +00:00
Epoch = "Epoch"
2020-08-05 10:13:35 +00:00
)
// Keys
var (
2020-02-13 14:45:02 +00:00
//StorageModeHistory - does node save history.
StorageModeHistory = [ ] byte ( "smHistory" )
//StorageModeReceipts - does node save receipts.
StorageModeReceipts = [ ] byte ( "smReceipts" )
//StorageModeTxIndex - does node save transactions index.
StorageModeTxIndex = [ ] byte ( "smTxIndex" )
2020-10-12 08:39:04 +00:00
//StorageModeCallTraces - does not build index of call traces
StorageModeCallTraces = [ ] byte ( "smCallTraces" )
2021-05-27 13:54:55 +00:00
//StorageModeTEVM - does not translate EVM to TEVM
StorageModeTEVM = [ ] byte ( "smTEVM" )
2020-08-10 23:55:32 +00:00
2021-04-24 15:46:29 +00:00
DBSchemaVersionKey = [ ] byte ( "dbVersion" )
2021-05-08 08:45:40 +00:00
BittorrentPeerID = "peerID"
CurrentHeadersSnapshotHash = [ ] byte ( "CurrentHeadersSnapshotHash" )
CurrentHeadersSnapshotBlock = [ ] byte ( "CurrentHeadersSnapshotBlock" )
2021-07-06 22:33:26 +00:00
CurrentBodiesSnapshotHash = [ ] byte ( "CurrentBodiesSnapshotHash" )
CurrentBodiesSnapshotBlock = [ ] byte ( "CurrentBodiesSnapshotBlock" )
2020-08-05 10:13:35 +00:00
)
2020-08-04 10:05:27 +00:00
2020-06-08 10:53:03 +00:00
// Buckets - list of all buckets. App will panic if some bucket is not in this list.
// This list will be sorted in `init` method.
2020-08-30 17:34:18 +00:00
// BucketsConfigs - can be used to find index in sorted version of Buckets list by name
2020-08-10 23:55:32 +00:00
var Buckets = [ ] string {
2020-03-11 10:31:49 +00:00
AccountsHistoryBucket ,
StorageHistoryBucket ,
CodeBucket ,
ContractCodeBucket ,
2021-03-19 12:54:47 +00:00
HeaderNumberBucket ,
2020-03-11 10:31:49 +00:00
BlockBodyPrefix ,
BlockReceiptsPrefix ,
TxLookupPrefix ,
BloomBitsPrefix ,
ConfigPrefix ,
BloomBitsIndexPrefix ,
2020-05-30 08:12:21 +00:00
DatabaseInfoBucket ,
IncarnationMapBucket ,
2021-05-27 13:54:55 +00:00
ContractTEVMCodeBucket ,
2021-04-19 21:58:05 +00:00
CliqueSeparateBucket ,
CliqueLastSnapshotBucket ,
CliqueSnapshotBucket ,
2020-05-30 08:12:21 +00:00
SyncStageProgress ,
SyncStageUnwind ,
PlainStateBucket ,
PlainContractCodeBucket ,
2021-05-04 12:34:08 +00:00
AccountChangeSetBucket ,
StorageChangeSetBucket ,
2020-07-03 07:23:49 +00:00
Senders ,
2020-08-05 10:13:35 +00:00
HeadBlockKey ,
HeadHeaderKey ,
Migrations ,
2020-09-28 17:18:36 +00:00
LogTopicIndex ,
LogAddressIndex ,
2020-10-13 12:56:16 +00:00
SnapshotInfoBucket ,
2021-05-10 15:07:22 +00:00
CallTraceSet ,
2020-10-12 08:39:04 +00:00
CallFromIndex ,
CallToIndex ,
2020-10-25 08:38:55 +00:00
Log ,
2020-11-14 13:48:29 +00:00
Sequence ,
2020-11-22 21:25:26 +00:00
EthTx ,
2021-02-21 18:41:59 +00:00
TrieOfAccountsBucket ,
TrieOfStorageBucket ,
HashedAccountsBucket ,
HashedStorageBucket ,
2021-05-08 08:45:40 +00:00
BittorrentInfoBucket ,
2021-03-19 12:54:47 +00:00
HeaderCanonicalBucket ,
HeadersBucket ,
HeaderTDBucket ,
2020-08-05 10:13:35 +00:00
}
// DeprecatedBuckets - list of buckets which can be programmatically deleted - for example after migration
2020-08-10 23:55:32 +00:00
var DeprecatedBuckets = [ ] string {
2021-03-19 12:54:47 +00:00
HeaderPrefixOld ,
2021-04-19 21:58:05 +00:00
CliqueBucket ,
2020-03-11 10:31:49 +00:00
}
2020-06-08 10:53:03 +00:00
2020-09-10 12:35:58 +00:00
type CmpFunc func ( k1 , k2 , v1 , v2 [ ] byte ) int
2020-08-30 17:34:18 +00:00
type BucketsCfg map [ string ] BucketConfigItem
type Bucket string
2020-10-28 03:18:10 +00:00
type DBI uint
type BucketFlags uint
const (
Default BucketFlags = 0x00
ReverseKey BucketFlags = 0x02
DupSort BucketFlags = 0x04
IntegerKey BucketFlags = 0x08
IntegerDup BucketFlags = 0x20
ReverseDup BucketFlags = 0x40
)
2020-08-30 17:34:18 +00:00
type BucketConfigItem struct {
2020-10-28 03:18:10 +00:00
Flags BucketFlags
2020-09-04 03:54:15 +00:00
// AutoDupSortKeysConversion - enables some keys transformation - to change db layout without changing app code.
// Use it wisely - it helps to do experiments with DB format faster, but better reduce amount of Magic in app.
// If good DB format found, push app code to accept this format and then disable this property.
AutoDupSortKeysConversion bool
IsDeprecated bool
2020-10-28 03:18:10 +00:00
DBI DBI
2020-09-04 03:54:15 +00:00
// DupFromLen - if user provide key of this length, then next transformation applied:
// v = append(k[DupToLen:], v...)
// k = k[:DupToLen]
// And opposite at retrieval
// Works only if AutoDupSortKeysConversion enabled
2021-06-30 03:31:36 +00:00
DupFromLen int
DupToLen int
2020-08-02 11:53:08 +00:00
}
2020-08-30 17:34:18 +00:00
var BucketsConfigs = BucketsCfg {
2021-02-21 18:41:59 +00:00
HashedStorageBucket : {
2020-10-28 03:18:10 +00:00
Flags : DupSort ,
2020-09-04 03:54:15 +00:00
AutoDupSortKeysConversion : true ,
DupFromLen : 72 ,
DupToLen : 40 ,
2020-08-02 11:53:08 +00:00
} ,
2021-05-04 12:34:08 +00:00
AccountChangeSetBucket : {
2020-11-16 12:08:28 +00:00
Flags : DupSort ,
} ,
2021-05-04 12:34:08 +00:00
StorageChangeSetBucket : {
2020-11-16 12:08:28 +00:00
Flags : DupSort ,
} ,
2020-08-30 17:34:18 +00:00
PlainStateBucket : {
2020-10-28 03:18:10 +00:00
Flags : DupSort ,
2020-09-04 03:54:15 +00:00
AutoDupSortKeysConversion : true ,
DupFromLen : 60 ,
DupToLen : 28 ,
2020-08-02 11:53:08 +00:00
} ,
2021-05-10 15:07:22 +00:00
CallTraceSet : {
Flags : DupSort ,
} ,
2020-08-02 11:53:08 +00:00
}
2020-06-08 10:53:03 +00:00
2020-09-06 15:33:05 +00:00
func sortBuckets ( ) {
2020-06-08 10:53:03 +00:00
sort . SliceStable ( Buckets , func ( i , j int ) bool {
2020-08-10 23:55:32 +00:00
return strings . Compare ( Buckets [ i ] , Buckets [ j ] ) < 0
2020-06-08 10:53:03 +00:00
} )
2020-09-06 15:33:05 +00:00
}
func DefaultBuckets ( ) BucketsCfg {
return BucketsConfigs
}
func UpdateBucketsList ( newBucketCfg BucketsCfg ) {
newBuckets := make ( [ ] string , 0 )
for k , v := range newBucketCfg {
if ! v . IsDeprecated {
newBuckets = append ( newBuckets , k )
}
}
Buckets = newBuckets
BucketsConfigs = newBucketCfg
reinit ( )
}
func init ( ) {
reinit ( )
}
func reinit ( ) {
sortBuckets ( )
2020-06-08 10:53:03 +00:00
2020-08-30 17:34:18 +00:00
for _ , name := range Buckets {
_ , ok := BucketsConfigs [ name ]
if ! ok {
BucketsConfigs [ name ] = BucketConfigItem { }
}
2020-08-05 10:13:35 +00:00
}
2020-08-30 17:34:18 +00:00
for _ , name := range DeprecatedBuckets {
_ , ok := BucketsConfigs [ name ]
if ! ok {
BucketsConfigs [ name ] = BucketConfigItem { }
2020-08-05 10:13:35 +00:00
}
2020-08-30 17:34:18 +00:00
tmp := BucketsConfigs [ name ]
tmp . IsDeprecated = true
BucketsConfigs [ name ] = tmp
2020-06-08 10:53:03 +00:00
}
}