Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
indiff7643
Terarkdb
提交
04a5b483
T
Terarkdb
项目概览
indiff7643
/
Terarkdb
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
T
Terarkdb
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
04a5b483
编写于
4月 21, 2020
作者:
Z
ZhaoMing
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Refactor lazy compaction picker
上级
150e72e8
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
67 addition
and
35 deletion
+67
-35
db/builder.cc
db/builder.cc
+1
-1
db/compaction_picker.cc
db/compaction_picker.cc
+66
-34
未找到文件。
db/builder.cc
浏览文件 @
04a5b483
...
...
@@ -195,7 +195,7 @@ Status BuildTable(
separate_helper
.
file_writer
.
reset
();
EventHelpers
::
LogAndNotifyTableFileCreationFinished
(
event_logger
,
ioptions
.
listeners
,
dbname
,
column_family_name
,
separate_helper
.
fname
,
-
1
,
blob_meta
->
fd
,
tp
,
separate_helper
.
fname
,
job_id
,
blob_meta
->
fd
,
tp
,
TableFileCreationReason
::
kFlush
,
status
);
separate_helper
.
builder
.
reset
();
...
...
db/compaction_picker.cc
浏览文件 @
04a5b483
...
...
@@ -2507,29 +2507,35 @@ Compaction* LevelCompactionBuilder::PickLazyCompaction(
size_t
target_file_size_base
=
mutable_cf_options_
.
target_file_size_base
;
size_t
base_size
=
mutable_cf_options_
.
write_buffer_size
*
ioptions_
.
min_write_buffer_number_to_merge
*
mutable_cf_options_
.
level0_file_num_compaction_trigger
;
auto
get_q
=
[
&
]
{
std
::
vector
<
double
>
level_ratio
(
vstorage_
->
num_levels
()
-
1
);
int
n
=
vstorage_
->
num_levels
();
std
::
vector
<
double
>
level_ratio
(
n
*
2
);
auto
base_size_real
=
double
(
base_size
);
for
(
int
i
=
1
;
i
<
vstorage_
->
num_levels
()
;
++
i
)
{
for
(
int
i
=
1
;
i
<
n
;
++
i
)
{
auto
&
sr
=
sorted_runs
[
i
];
sr
.
level
=
i
;
for
(
auto
f
:
vstorage_
->
LevelFiles
(
i
))
{
sr
.
size
+=
vstorage_
->
FileSize
(
f
);
sr
.
compensated_file_size
+=
f
->
compensated_file_size
;
}
level_ratio
[
i
-
1
]
=
sr
.
compensated_file_size
/
base_size_real
;
level_ratio
[
i
]
=
sr
.
size
/
base_size_real
;
level_ratio
[
i
+
n
]
=
sr
.
compensated_file_size
/
base_size_real
;
}
return
std
::
max
<
double
>
(
double
q1
=
std
::
max
<
double
>
(
std
::
atan
(
1
)
*
4
,
CompactionPicker
::
GetQ
(
level_ratio
.
begin
(),
level_ratio
.
end
(),
level_ratio
.
size
()));
CompactionPicker
::
GetQ
(
level_ratio
.
begin
()
+
1
,
level_ratio
.
begin
()
+
n
,
n
-
1
));
double
q2
=
std
::
max
<
double
>
(
std
::
atan
(
1
)
*
4
,
CompactionPicker
::
GetQ
(
level_ratio
.
begin
()
+
n
+
1
,
level_ratio
.
end
(),
n
-
1
));
return
std
::
pair
<
double
,
double
>
(
q1
,
q2
);
};
double
q
=
get_q
();
sorted_runs
[
bottommost_level
].
being_compacted
=
picker
->
AreFilesInCompaction
(
vstorage_
->
LevelFiles
(
bottommost_level
));
auto
pick_map_compaction
=
[
&
](
int
level
,
uint64_t
pick_size
)
{
auto
pick_map_compaction
=
[
&
](
int
level
,
uint64_t
pick_size
,
double
q
)
{
auto
&
level_files
=
vstorage_
->
LevelFiles
(
level
);
auto
&
next_level_files
=
vstorage_
->
LevelFiles
(
level
+
1
);
DependenceMap
empty_dependence_map
;
...
...
@@ -2701,10 +2707,14 @@ Compaction* LevelCompactionBuilder::PickLazyCompaction(
}
}
while
(
queue_limit
!=
queue_end
);
std
::
sort
(
sections
.
begin
(),
sections
.
end
(),
[
&
](
const
LevelMapSection
&
lhs
,
const
LevelMapSection
&
rhs
)
{
return
lhs
.
weight
>
rhs
.
weight
;
});
if
(
sections
.
empty
())
{
fn_new_section
();
}
else
{
std
::
sort
(
sections
.
begin
(),
sections
.
end
(),
[
&
](
const
LevelMapSection
&
lhs
,
const
LevelMapSection
&
rhs
)
{
return
lhs
.
weight
>
rhs
.
weight
;
});
}
src_size
=
0
;
for
(
size_t
i
=
0
;
i
<
sections
.
size
();
++
i
)
{
for
(
ptrdiff_t
j
=
sections
[
i
].
start_index
;
...
...
@@ -2811,36 +2821,58 @@ Compaction* LevelCompactionBuilder::PickLazyCompaction(
}
}
double
level_size
=
double
(
base_size
);
double
level_compensated_size
=
double
(
base_size
);
auto
q_pair
=
get_q
();
for
(
int
i
=
1
;
i
<
vstorage_
->
num_levels
()
-
1
;
++
i
)
{
level_size
*=
q
;
level_size
*=
q_pair
.
first
;
level_compensated_size
*=
q_pair
.
second
;
if
(
vstorage_
->
LevelFiles
(
i
).
empty
())
{
continue
;
}
if
(
sorted_runs
[
i
].
being_compacted
||
sorted_runs
[
i
+
1
].
being_compacted
)
{
sorted_runs
[
i
+
1
].
skip_composite
=
true
;
continue
;
}
double
fixed_
level_
size
=
level_size
;
double
fixed_size
=
level_size
;
if
(
i
<
bottommost_level
)
{
fixed_level_size
=
std
::
min
(
fixed_level_size
,
double
(
sorted_runs
[
i
].
size
+
sorted_runs
[
i
+
1
].
size
)
/
(
q
+
1
));
}
if
(
sorted_runs
[
i
].
compensated_file_size
<=
fixed_level_size
||
vstorage_
->
LevelFiles
(
i
).
empty
())
{
continue
;
}
uint64_t
pick_size
=
target_file_size_base
;
double
diff_size
=
double
(
sorted_runs
[
i
].
size
)
-
fixed_level_size
+
target_file_size_base
/
2
;
if
(
diff_size
>
double
(
pick_size
))
{
pick_size
=
uint64_t
(
diff_size
);
fixed_size
=
std
::
min
(
fixed_size
,
double
(
sorted_runs
[
i
].
size
+
sorted_runs
[
i
+
1
].
size
)
/
(
q_pair
.
first
+
1
));
}
if
(
sorted_runs
[
i
].
size
>
fixed_size
)
{
uint64_t
pick_size
=
target_file_size_base
;
double
diff_size
=
double
(
sorted_runs
[
i
].
size
)
-
fixed_size
+
target_file_size_base
/
2
;
if
(
diff_size
>
double
(
pick_size
))
{
pick_size
=
uint64_t
(
diff_size
);
}
auto
s
=
pick_map_compaction
(
i
,
pick_size
,
q_pair
.
first
);
if
(
!
s
.
ok
())
{
ROCKS_LOG_BUFFER
(
log_buffer_
,
"[%s] PickCompaction map error %s."
,
cf_name_
.
c_str
(),
s
.
getState
());
return
nullptr
;
}
if
(
!
input_range_
.
empty
())
{
return
GetCompaction
();
}
}
auto
s
=
pick_map_compaction
(
i
,
pick_size
);
if
(
!
s
.
ok
())
{
ROCKS_LOG_BUFFER
(
log_buffer_
,
"[%s] PickCompaction map error %s."
,
cf_name_
.
c_str
(),
s
.
getState
());
return
nullptr
;
fixed_size
=
level_compensated_size
;
if
(
i
<
bottommost_level
)
{
fixed_size
=
std
::
min
(
fixed_size
,
double
(
sorted_runs
[
i
].
compensated_file_size
+
sorted_runs
[
i
+
1
].
compensated_file_size
)
/
(
q_pair
.
second
+
1
));
}
if
(
!
input_range_
.
empty
())
{
return
GetCompaction
();
if
(
sorted_runs
[
i
].
compensated_file_size
>
fixed_size
)
{
auto
s
=
pick_map_compaction
(
i
,
target_file_size_base
,
q_pair
.
second
);
if
(
!
s
.
ok
())
{
ROCKS_LOG_BUFFER
(
log_buffer_
,
"[%s] PickCompaction map error %s."
,
cf_name_
.
c_str
(),
s
.
getState
());
return
nullptr
;
}
if
(
!
input_range_
.
empty
())
{
return
GetCompaction
();
}
}
}
sorted_runs
.
erase
(
sorted_runs
.
begin
());
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录