Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
whqwjb
go-ethereum
提交
67a78571
G
go-ethereum
项目概览
whqwjb
/
go-ethereum
与 Fork 源项目一致
从无法访问的项目Fork
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
G
go-ethereum
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
未验证
提交
67a78571
编写于
7月 03, 2018
作者:
P
Péter Szilágyi
提交者:
GitHub
7月 03, 2018
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #17111 from karalabe/trie-memleak
trie: fix a temporary memory leak in the memcache
上级
c73b654f
319098cc
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
49 addition
and
1 deletion
+49
-1
trie/database.go
trie/database.go
+49
-1
未找到文件。
trie/database.go
浏览文件 @
67a78571
...
...
@@ -466,7 +466,13 @@ func (db *Database) dereference(child common.Hash, parent common.Hash) {
return
}
// If there are no more references to the child, delete it and cascade
node
.
parents
--
if
node
.
parents
>
0
{
// This is a special cornercase where a node loaded from disk (i.e. not in the
// memcache any more) gets reinjected as a new node (short node split into full,
// then reverted into short), causing a cached node to have no parents. That is
// no problem in itself, but don't make maxint parents out of it.
node
.
parents
--
}
if
node
.
parents
==
0
{
// Remove the node from the flush-list
if
child
==
db
.
oldest
{
...
...
@@ -717,3 +723,45 @@ func (db *Database) Size() (common.StorageSize, common.StorageSize) {
var
flushlistSize
=
common
.
StorageSize
((
len
(
db
.
nodes
)
-
1
)
*
2
*
common
.
HashLength
)
return
db
.
nodesSize
+
flushlistSize
,
db
.
preimagesSize
}
// verifyIntegrity is a debug method to iterate over the entire trie stored in
// memory and check whether every node is reachable from the meta root. The goal
// is to find any errors that might cause memory leaks and or trie nodes to go
// missing.
//
// This method is extremely CPU and memory intensive, only use when must.
func
(
db
*
Database
)
verifyIntegrity
()
{
// Iterate over all the cached nodes and accumulate them into a set
reachable
:=
map
[
common
.
Hash
]
struct
{}{{}
:
{}}
for
child
:=
range
db
.
nodes
[
common
.
Hash
{}]
.
children
{
db
.
accumulate
(
child
,
reachable
)
}
// Find any unreachable but cached nodes
unreachable
:=
[]
string
{}
for
hash
,
node
:=
range
db
.
nodes
{
if
_
,
ok
:=
reachable
[
hash
];
!
ok
{
unreachable
=
append
(
unreachable
,
fmt
.
Sprintf
(
"%x: {Node: %v, Parents: %d, Prev: %x, Next: %x}"
,
hash
,
node
.
node
,
node
.
parents
,
node
.
flushPrev
,
node
.
flushNext
))
}
}
if
len
(
unreachable
)
!=
0
{
panic
(
fmt
.
Sprintf
(
"trie cache memory leak: %v"
,
unreachable
))
}
}
// accumulate iterates over the trie defined by hash and accumulates all the
// cached children found in memory.
func
(
db
*
Database
)
accumulate
(
hash
common
.
Hash
,
reachable
map
[
common
.
Hash
]
struct
{})
{
// Mark the node reachable if present in the memory cache
node
,
ok
:=
db
.
nodes
[
hash
]
if
!
ok
{
return
}
reachable
[
hash
]
=
struct
{}{}
// Iterate over all the children and accumulate them too
for
_
,
child
:=
range
node
.
childs
()
{
db
.
accumulate
(
child
,
reachable
)
}
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录