Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
2dot5
ClickHouse
提交
4064ec0b
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,发现更多精彩内容 >>
提交
4064ec0b
编写于
8月 20, 2018
作者:
V
VadimPE
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
CLICKHOUSE-3847 add value '1' and '2' in is_lost
上级
0c119d76
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
57 addition
and
19 deletion
+57
-19
dbms/src/Common/ErrorCodes.cpp
dbms/src/Common/ErrorCodes.cpp
+2
-0
dbms/src/Storages/MergeTree/ReplicatedMergeTreeCleanupThread.cpp
...c/Storages/MergeTree/ReplicatedMergeTreeCleanupThread.cpp
+1
-1
dbms/src/Storages/StorageReplicatedMergeTree.cpp
dbms/src/Storages/StorageReplicatedMergeTree.cpp
+50
-17
dbms/src/Storages/StorageReplicatedMergeTree.h
dbms/src/Storages/StorageReplicatedMergeTree.h
+4
-1
未找到文件。
dbms/src/Common/ErrorCodes.cpp
浏览文件 @
4064ec0b
...
...
@@ -377,6 +377,8 @@ namespace ErrorCodes
extern
const
int
CANNOT_STAT
=
400
;
extern
const
int
FEATURE_IS_NOT_ENABLED_AT_BUILD_TIME
=
401
;
extern
const
int
CANNOT_IOSETUP
=
402
;
extern
const
int
ALL_REPLICAS_LOST
=
413
;
extern
const
int
CAN_NOT_CLONE_REPLICA
=
414
;
extern
const
int
KEEPER_EXCEPTION
=
999
;
...
...
dbms/src/Storages/MergeTree/ReplicatedMergeTreeCleanupThread.cpp
浏览文件 @
4064ec0b
...
...
@@ -185,7 +185,7 @@ bool ReplicatedMergeTreeCleanupThread::markLostReplicas(const std::unordered_map
/// If log pointer and host change version we can not mark replicas, so we check it.
ops
.
emplace_back
(
zkutil
::
makeCheckRequest
(
storage
.
zookeeper_path
+
"/replicas/"
+
replica
+
"/host"
,
hosts_version
.
at
(
replica
)));
ops
.
emplace_back
(
zkutil
::
makeCheckRequest
(
storage
.
zookeeper_path
+
"/replicas/"
+
replica
+
"/log_pointer"
,
log_pointers_version
.
at
(
replica
)));
ops
.
emplace_back
(
zkutil
::
make
CreateRequest
(
storage
.
zookeeper_path
+
"/replicas/"
+
replica
+
"/is_lost"
,
"
"
,
zkutil
::
CreateMode
::
Persistent
));
ops
.
emplace_back
(
zkutil
::
make
SetRequest
(
storage
.
zookeeper_path
+
"/replicas/"
+
replica
+
"/is_lost"
,
"1
"
,
zkutil
::
CreateMode
::
Persistent
));
futures
.
push_back
(
zookeeper
->
tryAsyncMulti
(
ops
));
}
}
...
...
dbms/src/Storages/StorageReplicatedMergeTree.cpp
浏览文件 @
4064ec0b
...
...
@@ -600,6 +600,7 @@ void StorageReplicatedMergeTree::createReplica()
ops
.
emplace_back
(
zkutil
::
makeCreateRequest
(
replica_path
+
"/queue"
,
""
,
zkutil
::
CreateMode
::
Persistent
));
ops
.
emplace_back
(
zkutil
::
makeCreateRequest
(
replica_path
+
"/parts"
,
""
,
zkutil
::
CreateMode
::
Persistent
));
ops
.
emplace_back
(
zkutil
::
makeCreateRequest
(
replica_path
+
"/flags"
,
""
,
zkutil
::
CreateMode
::
Persistent
));
ops
.
emplace_back
(
zkutil
::
makeCreateRequest
(
replica_path
+
"/is_lost"
,
"1"
,
zkutil
::
CreateMode
::
Persistent
));
try
{
...
...
@@ -612,6 +613,10 @@ void StorageReplicatedMergeTree::createReplica()
throw
;
}
/// If replica is first, is lost will be "0".
if
((
zookeeper
->
getChildren
(
zookeeper_path
+
"/replicas"
)).
size
()
==
1
)
zookeeper
->
set
(
replica_path
+
"/is_lost"
,
"0"
,
zkutil
::
CreateMode
::
Persistent
);
/** You need to change the data of nodes/replicas to anything, so that the thread that removes old entries in the log,
* stumbled over this change and does not delete the entries we have not yet read.
...
...
@@ -1943,12 +1948,14 @@ bool StorageReplicatedMergeTree::executeReplaceRange(const LogEntry & entry)
bool
StorageReplicatedMergeTree
::
cloneReplica
(
const
String
&
source_replica
,
zkutil
::
ZooKeeperPtr
&
zookeeper
)
{
{
LOG_INFO
(
log
,
"Will mimic "
<<
source_replica
);
String
source_path
=
zookeeper_path
+
"/replicas/"
+
source_replica
;
zkutil
::
Stat
is_lost_stat
;
if
(
zookeeper
->
get
(
source_path
+
"/is_lost"
,
&
is_lost_stat
)
==
"1"
)
return
false
;
/** If the reference/master replica is not yet fully created, let's wait.
* NOTE: If something went wrong while creating it, we can hang around forever.
...
...
@@ -1972,16 +1979,28 @@ bool StorageReplicatedMergeTree::cloneReplica(const String & source_replica, zku
/// The order of the following three actions is important. Entries in the log can be duplicated, but they can not be lost.
zkutil
::
Requests
ops
;
/// We must set log_pointer atomically in order to cleanupThread can not clear log with our log_pointer.
String
raw_log_pointer
=
zookeeper
->
get
(
source_path
+
"/log_pointer"
);
zookeeper
->
set
(
replica_path
+
"/log_pointer"
,
raw_log_pointer
,
-
1
);
zkutil
::
Responses
resp
;
ops
.
push_back
(
zkutil
::
makeCheckRequest
(
source_path
+
"/is_lost"
,
is_lost_stat
.
version
));
ops
.
push_back
(
zkutil
::
makeSetRequest
(
replica_path
+
"/log_pointer"
,
raw_log_pointer
,
-
1
));
auto
error
=
zookeeper
->
tryMulti
(
ops
,
resp
);
if
(
error
!=
ZooKeeperImpl
::
ZooKeeper
::
ZOK
)
{
LOG_DEBUG
(
log
,
"Can not clone replica, because a source replica is lost"
);
return
false
;
}
ops
.
clear
();
resp
.
clear
();
/// Check that log_pointer in entries.
Strings
entries
=
zookeeper
->
getChildren
(
zookeeper_path
+
"/log"
);
if
(
entries
.
empty
())
LOG_DEBUG
(
log
,
"Can not clone replica, because log is empty"
);
return
false
;
return
true
;
auto
min_record
=
std
::
min_element
(
entries
.
begin
(),
entries
.
end
());
...
...
@@ -2003,6 +2022,16 @@ bool StorageReplicatedMergeTree::cloneReplica(const String & source_replica, zku
continue
;
source_queue
.
push_back
(
entry
);
}
ops
.
push_back
(
zkutil
::
makeCheckRequest
(
source_path
+
"/is_lost"
,
is_lost_stat
.
version
));
error
=
zookeeper
->
tryMulti
(
ops
,
resp
);
if
(
error
!=
ZooKeeperImpl
::
ZooKeeper
::
ZOK
)
{
LOG_DEBUG
(
log
,
"Can not clone replica, because a source replica is lost"
);
return
false
;
}
ops
.
clear
();
resp
.
clear
();
/// Add to the queue jobs to receive all the active parts that the reference/master replica has.
Strings
parts
=
zookeeper
->
getChildren
(
source_path
+
"/parts"
);
...
...
@@ -2017,8 +2046,18 @@ bool StorageReplicatedMergeTree::cloneReplica(const String & source_replica, zku
log_entry
.
new_part_name
=
name
;
log_entry
.
create_time
=
tryGetPartCreateTime
(
zookeeper
,
source_path
,
name
);
zookeeper
->
create
(
replica_path
+
"/queue/queue-"
,
log_entry
.
toString
(),
zkutil
::
CreateMode
::
PersistentSequential
);
ops
.
push_back
(
zkutil
::
makeCheckRequest
(
source_path
+
"/is_lost"
,
is_lost_stat
.
version
));
ops
.
push_back
(
zkutil
::
makeCreateRequest
(
replica_path
+
"/queue/queue-"
,
log_entry
.
toString
(),
zkutil
::
CreateMode
::
PersistentSequential
));
auto
error
=
zookeeper
->
tryMulti
(
ops
,
resp
);
if
(
error
!=
ZooKeeperImpl
::
ZooKeeper
::
ZOK
)
{
LOG_DEBUG
(
log
,
"Can not clone replica, because a source replica is lost"
);
return
false
;
}
ops
.
clear
();
resp
.
clear
();
}
LOG_DEBUG
(
log
,
"Queued "
<<
active_parts
.
size
()
<<
" parts to be fetched"
);
/// Add content of the reference/master replica queue to the queue.
...
...
@@ -2035,14 +2074,8 @@ bool StorageReplicatedMergeTree::cloneReplica(const String & source_replica, zku
void
StorageReplicatedMergeTree
::
cloneReplicaIfNeeded
()
{
auto
zookeeper
=
getZooKeeper
();
String
raw_log_pointer
=
zookeeper
->
get
(
replica_path
+
"/log_pointer"
);
Strings
entries
=
zookeeper
->
getChildren
(
zookeeper_path
+
"/log"
);
if
(
entries
.
empty
())
return
;
if
(
!
raw_log_pointer
.
empty
()
&&
!
zookeeper
->
exists
(
replica_path
+
"/is_lost
"
))
if
(
(
zookeeper
->
get
(
replica_path
+
"/is_lost"
)
==
"0
"
))
return
;
String
source_replica
;
...
...
@@ -2050,7 +2083,7 @@ void StorageReplicatedMergeTree::cloneReplicaIfNeeded()
for
(
const
String
&
replica_name
:
zookeeper
->
getChildren
(
zookeeper_path
+
"/replicas"
))
{
String
source_replica_path
=
zookeeper_path
+
"/replicas/"
+
replica_name
;
if
((
source_replica_path
!=
replica_path
)
&&
(
!
zookeeper
->
exists
(
source_replica_path
+
"/is_lost"
)
))
if
((
source_replica_path
!=
replica_path
)
&&
(
zookeeper
->
get
(
source_replica_path
+
"/is_lost"
)
==
"0"
))
source_replica
=
replica_name
;
}
...
...
@@ -2058,9 +2091,9 @@ void StorageReplicatedMergeTree::cloneReplicaIfNeeded()
throw
Exception
(
"All replicas are lost"
,
ErrorCodes
::
ALL_REPLICAS_LOST
);
if
(
!
cloneReplica
(
source_replica
,
zookeeper
))
throw
Exception
(
"Can not clone replica from"
+
source_replica
,
ErrorCodes
::
CAN_NOT_CLONE_REPLICA
);
throw
Exception
(
"Can not clone replica from
"
+
source_replica
,
ErrorCodes
::
CAN_NOT_CLONE_REPLICA
);
zookeeper
->
remove
(
replica_path
+
"/is_lost"
,
-
1
);
zookeeper
->
set
(
replica_path
+
"/is_lost"
,
"0"
);
}
...
...
dbms/src/Storages/StorageReplicatedMergeTree.h
浏览文件 @
4064ec0b
...
...
@@ -397,7 +397,10 @@ private:
void
mutationsUpdatingTask
();
/// Clone data from another replica.
/** Clone data from another replica.
* return true, if replica wil be cloned
* else return false (when source_replica was lost or log was empty).
*/
bool
cloneReplica
(
const
String
&
source_replica
,
zkutil
::
ZooKeeperPtr
&
zookeeper
);
/// Clone replica if it is lost.
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录