Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
YottaChain
YTBP
提交
a8981ead
Y
YTBP
项目概览
YottaChain
/
YTBP
通知
0
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
Y
YTBP
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
a8981ead
编写于
6月 01, 2018
作者:
C
Ciju John
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Add new test for dirty db flag stickiness.
上级
0961a560
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
137 addition
and
1 deletion
+137
-1
tests/CMakeLists.txt
tests/CMakeLists.txt
+2
-0
tests/testUtils.py
tests/testUtils.py
+5
-1
tests/validate-dirty-db.py
tests/validate-dirty-db.py
+130
-0
未找到文件。
tests/CMakeLists.txt
浏览文件 @
a8981ead
...
...
@@ -34,6 +34,7 @@ configure_file(${CMAKE_CURRENT_SOURCE_DIR}/testUtils.py ${CMAKE_CURRENT_BINARY_D
configure_file
(
${
CMAKE_CURRENT_SOURCE_DIR
}
/nodeos_run_test.py
${
CMAKE_CURRENT_BINARY_DIR
}
/nodeos_run_test.py COPYONLY
)
configure_file
(
${
CMAKE_CURRENT_SOURCE_DIR
}
/nodeos_run_remote_test.py
${
CMAKE_CURRENT_BINARY_DIR
}
/nodeos_run_remote_test.py COPYONLY
)
configure_file
(
${
CMAKE_CURRENT_SOURCE_DIR
}
/consensus-validation-malicious-producers.py
${
CMAKE_CURRENT_BINARY_DIR
}
/consensus-validation-malicious-producers.py COPYONLY
)
configure_file
(
${
CMAKE_CURRENT_SOURCE_DIR
}
/validate-dirty-db.py
${
CMAKE_CURRENT_BINARY_DIR
}
/validate-dirty-db.py COPYONLY
)
#To run plugin_test with all log from blockchain displayed, put --verbose after --, i.e. plugin_test -- --verbose
add_test
(
NAME plugin_test COMMAND plugin_test --report_level=detailed --color_output
)
...
...
@@ -54,6 +55,7 @@ add_test(NAME distributed-transactions-remote-test COMMAND tests/distributed-tra
# add_test(NAME restart-scenarios-test_replay COMMAND tests/restart-scenarios-test.py -c replay -p4 -v --dump-error-details WORKING_DIRECTORY ${CMAKE_BINARY_DIR})
add_test
(
NAME restart-scenarios-test_hard_replay COMMAND tests/restart-scenarios-test.py -c hardReplay -p4 -v --dump-error-details WORKING_DIRECTORY
${
CMAKE_BINARY_DIR
}
)
# TODO: add_test(NAME consensus-validation-malicious-producers COMMAND tests/consensus-validation-malicious-producers.py -w 80 --dump-error-details WORKING_DIRECTORY ${CMAKE_BINARY_DIR})
add_test
(
NAME validate_dirty_db_test COMMAND tests/validate-dirty-db.py -v --dump-error-detail WORKING_DIRECTORY
${
CMAKE_BINARY_DIR
}
)
if
(
ENABLE_COVERAGE_TESTING
)
...
...
tests/testUtils.py
浏览文件 @
a8981ead
...
...
@@ -1393,7 +1393,7 @@ class Cluster(object):
# pylint: disable=too-many-return-statements
# pylint: disable=too-many-branches
# pylint: disable=too-many-statements
def
launch
(
self
,
pnodes
=
1
,
totalNodes
=
1
,
prodCount
=
1
,
topo
=
"mesh"
,
delay
=
1
,
onlyBios
=
False
,
dontKill
=
False
):
def
launch
(
self
,
pnodes
=
1
,
totalNodes
=
1
,
prodCount
=
1
,
topo
=
"mesh"
,
delay
=
1
,
onlyBios
=
False
,
dontKill
=
False
,
dontBootstrap
=
False
):
"""Launch cluster.
pnodes: producer nodes count
totalNodes: producer + non-producer nodes count
...
...
@@ -1456,6 +1456,10 @@ class Cluster(object):
Utils
.
Print
(
"ERROR: Cluster doesn't seem to be in sync. Some nodes missing block 1"
)
return
False
if
dontBootstrap
:
Utils
.
Print
(
"Skipping bootstrap."
)
return
True
Utils
.
Print
(
"Bootstrap cluster."
)
if
not
Cluster
.
bootstrap
(
totalNodes
,
prodCount
,
Cluster
.
__BiosHost
,
Cluster
.
__BiosPort
,
dontKill
,
onlyBios
):
Utils
.
Print
(
"ERROR: Bootstrap failed."
)
...
...
tests/validate-dirty-db.py
0 → 100755
浏览文件 @
a8981ead
#!/usr/bin/env python3
import
testUtils
import
argparse
import
random
import
subprocess
import
time
import
os
import
signal
###############################################################
# Test for validating the dirty db flag sticks repeated nodeos restart attempts
###############################################################
Print
=
testUtils
.
Utils
.
Print
def
errorExit
(
msg
=
""
,
errorCode
=
1
):
Print
(
"ERROR:"
,
msg
)
exit
(
errorCode
)
parser
=
argparse
.
ArgumentParser
()
parser
.
add_argument
(
"-v"
,
help
=
"verbose logging"
,
action
=
'store_true'
)
parser
.
add_argument
(
"--dont-kill"
,
help
=
"Leave cluster running after test finishes"
,
action
=
'store_true'
)
parser
.
add_argument
(
"--dump-error-details"
,
help
=
"Upon error print etc/eosio/node_*/config.ini and var/lib/node_*/stderr.log to stdout"
,
action
=
'store_true'
)
parser
.
add_argument
(
"--keep-logs"
,
help
=
"Don't delete var/lib/node_* folders upon test completion"
,
action
=
'store_true'
)
args
=
parser
.
parse_args
()
debug
=
args
.
v
pnodes
=
1
topo
=
"mesh"
delay
=
1
chainSyncStrategyStr
=
testUtils
.
Utils
.
SyncResyncTag
total_nodes
=
pnodes
killCount
=
1
killSignal
=
testUtils
.
Utils
.
SigKillTag
killEosInstances
=
not
args
.
dont_kill
dumpErrorDetails
=
args
.
dump_error_details
keepLogs
=
args
.
keep_logs
seed
=
1
testUtils
.
Utils
.
Debug
=
debug
testSuccessful
=
False
random
.
seed
(
seed
)
# Use a fixed seed for repeatability.
cluster
=
testUtils
.
Cluster
(
walletd
=
True
)
try
:
cluster
.
setChainStrategy
(
chainSyncStrategyStr
)
cluster
.
killall
()
cluster
.
cleanup
()
Print
(
"producing nodes: %d, topology: %s, delay between nodes launch(seconds): %d, chain sync strategy: %s"
%
(
pnodes
,
topo
,
delay
,
chainSyncStrategyStr
))
Print
(
"Stand up cluster"
)
if
cluster
.
launch
(
pnodes
,
total_nodes
,
topo
=
topo
,
delay
=
delay
,
dontBootstrap
=
True
)
is
False
:
errorExit
(
"Failed to stand up eos cluster."
)
node
=
cluster
.
getNode
(
0
)
if
node
is
None
:
errorExit
(
"Cluster in bad state, received None node"
)
Print
(
"Kill cluster nodes."
)
cluster
.
killall
()
def
runNodeosAndGetOutput
(
nodeId
,
waitTime
=
3
):
"""Startup nodeos, wait for waitTime (before forced shutdown) and collect output. Stdout, stderr and return code are returned in a dictionary.
Large waittimes have potential to deadlock as the popen PIPE buffer can get filled up."""
Print
(
"Launching nodeos process id: %d"
%
(
nodeId
))
dataDir
=
"var/lib/node_%02d"
%
(
nodeId
)
cmd
=
"programs/nodeos/nodeos --config-dir etc/eosio/node_bios --data-dir var/lib/node_bios"
Print
(
"cmd: %s"
%
(
cmd
))
proc
=
subprocess
.
Popen
(
cmd
.
split
(),
stdout
=
subprocess
.
PIPE
,
stderr
=
subprocess
.
PIPE
)
try
:
proc
.
wait
(
waitTime
)
except
(
subprocess
.
TimeoutExpired
)
as
_
:
Print
(
"ERROR: Nodeos is running beyond the defined wait time. Hard killing nodeos instance."
)
proc
.
send_signal
(
signal
.
SIGKILL
)
return
(
False
,
None
)
output
=
{}
output
[
"stdout"
]
=
proc
.
stdout
.
read
().
decode
(
"utf-8"
)
output
[
"stderr"
]
=
proc
.
stderr
.
read
().
decode
(
"utf-8"
)
output
[
"returncode"
]
=
proc
.
returncode
return
(
True
,
output
)
Print
(
"Restart nodeos repeatedly to ensure dirty database flag sticks."
)
nodeId
=
0
waitTime
=
3
for
i
in
range
(
0
,
3
):
Print
(
"Attempt %d."
%
(
i
))
ret
=
runNodeosAndGetOutput
(
nodeId
,
waitTime
)
if
not
ret
or
not
ret
[
0
]:
exit
(
1
)
#Print(ret)
stderr
=
ret
[
1
][
"stderr"
]
retCode
=
ret
[
1
][
"returncode"
]
assert
(
retCode
==
2
)
assert
(
"database dirty flag set"
in
stderr
)
testSuccessful
=
True
finally
:
if
testSuccessful
:
Print
(
"Test succeeded."
)
else
:
Print
(
"Test failed."
)
if
not
testSuccessful
and
dumpErrorDetails
:
cluster
.
dumpErrorDetails
()
Print
(
"== Errors see above =="
)
if
killEosInstances
:
Print
(
"Shut down the cluster."
)
cluster
.
killall
()
if
testSuccessful
and
not
keepLogs
:
Print
(
"Cleanup cluster data."
)
cluster
.
cleanup
()
exit
(
0
)
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录