Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
2dot5
ClickHouse
提交
50ba6ca8
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,发现更多精彩内容 >>
提交
50ba6ca8
编写于
4月 03, 2014
作者:
M
Michael Kolupaev
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Merge
上级
b4d85c16
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
72 addition
and
30 deletion
+72
-30
dbms/include/DB/Storages/MergeTree/ReplicatedMergeTreeBlockOutputStream.h
...Storages/MergeTree/ReplicatedMergeTreeBlockOutputStream.h
+1
-1
dbms/src/Interpreters/loadMetadata.cpp
dbms/src/Interpreters/loadMetadata.cpp
+2
-1
dbms/src/Storages/StorageReplicatedMergeTree.cpp
dbms/src/Storages/StorageReplicatedMergeTree.cpp
+69
-28
未找到文件。
dbms/include/DB/Storages/MergeTree/ReplicatedMergeTreeBlockOutputStream.h
浏览文件 @
50ba6ca8
...
...
@@ -22,7 +22,7 @@ public:
String
block_id
=
insert_id
.
empty
()
?
""
:
insert_id
+
"__"
+
toString
(
block_index
);
AbandonableLockInZooKeeper
block_number_lock
(
storage
.
zookeeper_path
+
"/block
-
numbers/block-"
,
storage
.
zookeeper_path
+
"/block
_
numbers/block-"
,
storage
.
zookeeper_path
+
"/temp"
,
storage
.
zookeeper
);
UInt64
part_number
=
block_number_lock
.
getNumber
();
...
...
dbms/src/Interpreters/loadMetadata.cpp
浏览文件 @
50ba6ca8
...
...
@@ -133,7 +133,8 @@ void loadMetadata(Context & context)
}
catch
(
const
Exception
&
e
)
{
throw
Exception
(
"Cannot create table from metadata file "
+
tables
[
j
]
+
", error: "
+
e
.
displayText
(),
throw
Exception
(
"Cannot create table from metadata file "
+
tables
[
j
]
+
", error: "
+
e
.
displayText
()
+
", stack trace:
\n
"
+
e
.
getStackTrace
().
toString
(),
ErrorCodes
::
CANNOT_CREATE_TABLE_FROM_METADATA
);
}
}
...
...
dbms/src/Storages/StorageReplicatedMergeTree.cpp
浏览文件 @
50ba6ca8
...
...
@@ -129,7 +129,7 @@ void StorageReplicatedMergeTree::createTable()
/// Создадим нужные "директории".
zookeeper
.
create
(
zookeeper_path
+
"/replicas"
,
""
,
zkutil
::
CreateMode
::
Persistent
);
zookeeper
.
create
(
zookeeper_path
+
"/blocks"
,
""
,
zkutil
::
CreateMode
::
Persistent
);
zookeeper
.
create
(
zookeeper_path
+
"/block
-
numbers"
,
""
,
zkutil
::
CreateMode
::
Persistent
);
zookeeper
.
create
(
zookeeper_path
+
"/block
_
numbers"
,
""
,
zkutil
::
CreateMode
::
Persistent
);
zookeeper
.
create
(
zookeeper_path
+
"/temp"
,
""
,
zkutil
::
CreateMode
::
Persistent
);
}
...
...
@@ -249,7 +249,7 @@ void StorageReplicatedMergeTree::loadQueue()
std
::
sort
(
children
.
begin
(),
children
.
end
());
for
(
const
String
&
child
:
children
)
{
String
s
=
zookeeper
.
get
(
child
);
String
s
=
zookeeper
.
get
(
replica_path
+
"/queue/"
+
child
);
LogEntry
entry
=
LogEntry
::
parse
(
s
);
entry
.
znode_name
=
child
;
queue
.
push_back
(
entry
);
...
...
@@ -260,47 +260,88 @@ void StorageReplicatedMergeTree::pullLogsToQueue()
{
Poco
::
ScopedLock
<
Poco
::
FastMutex
>
lock
(
queue_mutex
);
/// Сольем все логи в хронологическом порядке.
struct
LogIterator
{
String
replica
;
/// Имя реплики.
UInt64
index
;
/// Номер записи в логе (суффикс имени ноды).
Int64
timestamp
;
/// Время (czxid) создания записи в логе.
String
entry_str
;
/// Сама запись.
bool
operator
<
(
const
LogIterator
&
rhs
)
const
{
return
timestamp
<
rhs
.
timestamp
;
}
bool
readEntry
(
zkutil
::
ZooKeeper
&
zookeeper
,
const
String
&
zookeeper_path
)
{
String
index_str
=
toString
(
index
);
while
(
index_str
.
size
()
<
10
)
index_str
=
'0'
+
index_str
;
zkutil
::
Stat
stat
;
if
(
!
zookeeper
.
tryGet
(
zookeeper_path
+
"/replicas/"
+
replica
+
"/log/log-"
+
index_str
,
entry_str
,
&
stat
))
return
false
;
timestamp
=
stat
.
getczxid
();
return
true
;
}
};
typedef
std
::
priority_queue
<
LogIterator
>
PriorityQueue
;
PriorityQueue
priority_queue
;
Strings
replicas
=
zookeeper
.
getChildren
(
zookeeper_path
+
"/replicas"
);
for
(
const
String
&
replica
:
replicas
)
{
String
log_path
=
zookeeper_path
+
"/"
+
replica
+
"/log"
;
String
pointer_str
;
UInt64
pointer
;
String
index_str
;
UInt64
index
;
if
(
zookeeper
.
tryGet
(
replica_path
+
"/log_pointers/"
+
replica
,
pointer
_str
))
if
(
zookeeper
.
tryGet
(
replica_path
+
"/log_pointers/"
+
replica
,
index
_str
))
{
pointer
=
Poco
::
NumberParser
::
parseUnsigned64
(
pointer
_str
);
index
=
Poco
::
NumberParser
::
parseUnsigned64
(
index
_str
);
}
else
{
/// Если у нас еще нет указателя на лог этой реплики, поставим указатель на первую запись в нем.
Strings
entries
=
zookeeper
.
getChildren
(
log_path
);
Strings
entries
=
zookeeper
.
getChildren
(
zookeeper_path
+
"/replicas/"
+
replica
+
"/log"
);
std
::
sort
(
entries
.
begin
(),
entries
.
end
());
pointer
=
entries
.
empty
()
?
0
:
Poco
::
NumberParser
::
parseUnsigned64
(
entries
[
0
].
substr
(
strlen
(
"log-"
)));
index
=
entries
.
empty
()
?
0
:
Poco
::
NumberParser
::
parseUnsigned64
(
entries
[
0
].
substr
(
strlen
(
"log-"
)));
zookeeper
.
create
(
replica_path
+
"/log_pointers/"
+
replica
,
toString
(
pointer
),
zkutil
::
CreateMode
::
Persistent
);
zookeeper
.
create
(
replica_path
+
"/log_pointers/"
+
replica
,
toString
(
index
),
zkutil
::
CreateMode
::
Persistent
);
}
String
entry_str
;
while
(
zookeeper
.
tryGet
(
log_path
+
"/log-"
+
toString
(
pointer
),
entry_str
))
{
LogEntry
entry
=
LogEntry
::
parse
(
entry_str
);
LogIterator
iterator
;
iterator
.
replica
=
replica
;
iterator
.
index
=
index
;
if
(
iterator
.
readEntry
(
zookeeper
,
zookeeper_path
))
priority_queue
.
push
(
iterator
);
}
/// Одновременно добавим запись в очередь и продвинем указатель на лог.
zkutil
::
Ops
ops
;
ops
.
push_back
(
new
zkutil
::
Op
::
Create
(
replica_path
+
"/queue/queue-"
,
entry_str
,
zookeeper
.
getDefaultACL
(),
zkutil
::
CreateMode
::
PersistentSequential
));
ops
.
push_back
(
new
zkutil
::
Op
::
SetData
(
replica_path
+
"/log_pointers/"
+
replica
,
toString
(
pointer
+
1
),
-
1
));
auto
results
=
zookeeper
.
multi
(
ops
);
while
(
!
priority_queue
.
empty
())
{
LogIterator
iterator
=
priority_queue
.
top
();
priority_queue
.
pop
();
String
path_created
=
dynamic_cast
<
zkutil
::
OpResult
::
Create
&>
((
*
results
)[
0
]).
getPathCreated
();
entry
.
znode_name
=
path
.
substr
(
path
.
find_last_of
(
'/'
)
+
1
);
queue
.
push_back
(
entry
);
LogEntry
entry
=
LogEntry
::
parse
(
iterator
.
entry_str
);
++
pointer
;
}
/// Одновременно добавим запись в очередь и продвинем указатель на лог.
zkutil
::
Ops
ops
;
ops
.
push_back
(
new
zkutil
::
Op
::
Create
(
replica_path
+
"/queue/queue-"
,
iterator
.
entry_str
,
zookeeper
.
getDefaultACL
(),
zkutil
::
CreateMode
::
PersistentSequential
));
ops
.
push_back
(
new
zkutil
::
Op
::
SetData
(
replica_path
+
"/log_pointers/"
+
iterator
.
replica
,
toString
(
iterator
.
index
+
1
),
-
1
));
auto
results
=
zookeeper
.
multi
(
ops
);
String
path_created
=
dynamic_cast
<
zkutil
::
OpResult
::
Create
&>
((
*
results
)[
0
]).
getPathCreated
();
entry
.
znode_name
=
path
.
substr
(
path
.
find_last_of
(
'/'
)
+
1
);
queue
.
push_back
(
entry
);
++
iterator
.
index
;
if
(
iterator
.
readEntry
(
zookeeper
,
zookeeper_path
))
priority_queue
.
push
(
iterator
);
}
}
...
...
@@ -441,7 +482,7 @@ void StorageReplicatedMergeTree::fetchPart(const String & part_name, const Strin
assertString
(
"
\n
"
,
buf
);
assertEOF
(
buf
);
MergeTreeData
::
MutableDataPartPtr
part
=
fetcher
.
fetchPart
(
name
,
zookeeper_path
+
"/replicas/"
+
replica_name
,
host
,
port
);
MergeTreeData
::
MutableDataPartPtr
part
=
fetcher
.
fetchPart
(
part_
name
,
zookeeper_path
+
"/replicas/"
+
replica_name
,
host
,
port
);
data
.
renameTempPartAndAdd
(
part
,
nullptr
);
zkutil
::
Ops
ops
;
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录