Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
2dot5
ClickHouse
提交
f8d94fcb
C
ClickHouse
项目概览
2dot5
/
ClickHouse
通知
3
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
C
ClickHouse
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
f8d94fcb
编写于
9月 24, 2015
作者:
A
Alexey Milovidov
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
dbms: just-written parts does not participate in sanity check [#METR-18169].
上级
a840af70
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
30 addition
and
18 deletion
+30
-18
dbms/src/Storages/StorageReplicatedMergeTree.cpp
dbms/src/Storages/StorageReplicatedMergeTree.cpp
+30
-18
未找到文件。
dbms/src/Storages/StorageReplicatedMergeTree.cpp
浏览文件 @
f8d94fcb
...
...
@@ -554,36 +554,48 @@ void StorageReplicatedMergeTree::checkParts(bool skip_sanity_checks)
for
(
const
String
&
name
:
parts_to_fetch
)
expected_parts
.
erase
(
name
);
String
sanity_report
=
"There are "
+
toString
(
unexpected_parts
.
size
())
+
" unexpected parts, "
+
toString
(
parts_to_add
.
size
())
+
" unexpectedly merged parts, "
+
toString
(
expected_parts
.
size
())
+
" missing obsolete parts, "
+
toString
(
parts_to_fetch
.
size
())
+
" missing parts"
;
/** Для проверки адекватности, для кусков, которые есть в ФС, но нет в ZK, будем учитывать только не самые новые куски.
* Потому что неожиданные новые куски обычно возникают лишь оттого, что они не успели записаться в ZK при грубом перезапуске сервера.
* Также это возникает от дедуплицированных кусков, которые не успели удалиться.
*/
size_t
unexpected_parts_nonnew
=
0
;
for
(
const
auto
&
part
:
unexpected_parts
)
if
(
part
->
level
>
0
||
part
->
right
<
RESERVED_BLOCK_NUMBERS
)
++
unexpected_parts_nonnew
;
String
sanity_report
=
"There are "
+
toString
(
unexpected_parts
.
size
())
+
" unexpected parts ("
+
toString
(
unexpected_parts_nonnew
)
+
" of them is not just-written), "
+
toString
(
parts_to_add
.
size
())
+
" unexpectedly merged parts, "
+
toString
(
expected_parts
.
size
())
+
" missing obsolete parts, "
+
toString
(
parts_to_fetch
.
size
())
+
" missing parts"
;
/** Можно автоматически синхронизировать данные,
* если количество ошибок каждого из четырёх типов не больше соответствующих порогов,
* или если отношение общего количества ошибок к общему количеству кусков (минимальному - в локальной файловой системе или в ZK)
*
если количество ошибок каждого из четырёх типов не больше соответствующих порогов,
*
или если отношение общего количества ошибок к общему количеству кусков (минимальному - в локальной файловой системе или в ZK)
* не больше некоторого отношения (например 5%).
*
* Большое количество несовпадений в данных на файловой системе и ожидаемых данных
* может свидетельствовать об ошибке конфигурации (сервер случайно подключили как реплику не от того шарда).
* В этом случае, защитный механизм не даёт стартовать серверу.
*/
size_t
min_parts_local_or_expected
=
std
::
min
(
expected_parts_vec
.
size
(),
parts
.
size
());
size_t
total_difference
=
parts_to_add
.
size
()
+
unexpected_parts_nonnew
+
expected_parts
.
size
()
+
parts_to_fetch
.
size
();
bool
insane
=
(
parts_to_add
.
size
()
>
data
.
settings
.
replicated_max_unexpectedly_merged_parts
||
unexpected_parts
.
size
()
>
data
.
settings
.
replicated_max_unexpected_parts
||
unexpected_parts
_nonnew
>
data
.
settings
.
replicated_max_unexpected_parts
||
expected_parts
.
size
()
>
data
.
settings
.
replicated_max_missing_obsolete_parts
||
parts_to_fetch
.
size
()
>
data
.
settings
.
replicated_max_missing_active_parts
)
&&
((
parts_to_add
.
size
()
+
unexpected_parts
.
size
()
+
expected_parts
.
size
()
+
parts_to_fetch
.
size
())
>
min_parts_local_or_expected
*
data
.
settings
.
replicated_max_ratio_of_wrong_parts
);
&&
(
total_difference
>
min_parts_local_or_expected
*
data
.
settings
.
replicated_max_ratio_of_wrong_parts
);
if
(
insane
)
{
if
(
skip_sanity_checks
)
LOG_WARNING
(
log
,
sanity_report
);
else
throw
Exception
(
"The local set of parts of table "
+
getTableName
()
+
" doesn't look like the set of parts in ZooKeeper. "
+
sanity_report
,
ErrorCodes
::
TOO_MANY_UNEXPECTED_DATA_PARTS
);
}
if
(
insane
&&
!
skip_sanity_checks
)
throw
Exception
(
"The local set of parts of table "
+
getTableName
()
+
" doesn't look like the set of parts in ZooKeeper. "
+
sanity_report
,
ErrorCodes
::
TOO_MANY_UNEXPECTED_DATA_PARTS
);
if
(
total_difference
>
0
)
LOG_WARNING
(
log
,
sanity_report
);
/// Добавим в ZK информацию о кусках, покрывающих недостающие куски.
for
(
const
MergeTreeData
::
DataPartPtr
&
part
:
parts_to_add
)
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录