Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in
Toggle navigation
R
rust-rocksdb
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
fangzongwu
rust-rocksdb
Commits
9a1c83c5
Unverified
Commit
9a1c83c5
authored
Jun 08, 2018
by
Huachao Huang
Committed by
GitHub
Jun 08, 2018
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
update rocksdb with CompactFiles related fixes
parent
e1b68e75
Show whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
152 additions
and
17 deletions
+152
-17
compaction_picker.cc
librocksdb_sys/rocksdb/db/compaction_picker.cc
+11
-14
compaction_picker.h
librocksdb_sys/rocksdb/db/compaction_picker.h
+4
-0
db_compaction_test.cc
librocksdb_sys/rocksdb/db/db_compaction_test.cc
+133
-0
db_impl_compaction_flush.cc
librocksdb_sys/rocksdb/db/db_impl_compaction_flush.cc
+4
-3
No files found.
librocksdb_sys/rocksdb/db/compaction_picker.cc
View file @
9a1c83c5
...
...
@@ -292,17 +292,11 @@ Compaction* CompactionPicker::CompactFiles(
VersionStorageInfo
*
vstorage
,
const
MutableCFOptions
&
mutable_cf_options
,
uint32_t
output_path_id
)
{
assert
(
input_files
.
size
());
// This compaction output should not overlap with a running compaction as
// `SanitizeCompactionInputFiles` should've checked earlier and db mutex
// shouldn't have been released since.
assert
(
!
FilesRangeOverlapWithCompaction
(
input_files
,
output_level
));
// TODO(rven ): we might be able to run concurrent level 0 compaction
// if the key ranges of the two compactions do not overlap, but for now
// we do not allow it.
if
((
input_files
[
0
].
level
==
0
)
&&
!
level0_compactions_in_progress_
.
empty
())
{
return
nullptr
;
}
// This compaction output could overlap with a running compaction
if
(
FilesRangeOverlapWithCompaction
(
input_files
,
output_level
))
{
return
nullptr
;
}
auto
c
=
new
Compaction
(
vstorage
,
ioptions_
,
mutable_cf_options
,
input_files
,
output_level
,
compact_options
.
output_file_size_limit
,
...
...
@@ -731,10 +725,6 @@ Status CompactionPicker::SanitizeCompactionInputFilesForAllLevels(
auto
&
levels
=
cf_meta
.
levels
;
auto
comparator
=
icmp_
->
user_comparator
();
// TODO(yhchiang): If there is any input files of L1 or up and there
// is at least one L0 files. All L0 files older than the L0 file needs
// to be included. Otherwise, it is a false conditoin
// TODO(yhchiang): add is_adjustable to CompactionOptions
// the smallest and largest key of the current compaction input
...
...
@@ -795,6 +785,8 @@ Status CompactionPicker::SanitizeCompactionInputFilesForAllLevels(
}
last_included
++
;
}
}
else
if
(
output_level
>
0
)
{
last_included
=
static_cast
<
int
>
(
current_files
.
size
()
-
1
);
}
// include all files between the first and the last compaction input files.
...
...
@@ -854,6 +846,11 @@ Status CompactionPicker::SanitizeCompactionInputFilesForAllLevels(
}
}
}
if
(
RangeOverlapWithCompaction
(
smallestkey
,
largestkey
,
output_level
))
{
return
Status
::
Aborted
(
"A running compaction is writing to the same output level in an "
"overlapping key range"
);
}
return
Status
::
OK
();
}
...
...
librocksdb_sys/rocksdb/db/compaction_picker.h
View file @
9a1c83c5
...
...
@@ -89,6 +89,10 @@ class CompactionPicker {
// Takes a list of CompactionInputFiles and returns a (manual) Compaction
// object.
//
// Caller must provide a set of input files that has been passed through
// `SanitizeCompactionInputFiles` earlier. The lock should not be released
// between that call and this one.
Compaction
*
CompactFiles
(
const
CompactionOptions
&
compact_options
,
const
std
::
vector
<
CompactionInputFiles
>&
input_files
,
int
output_level
,
VersionStorageInfo
*
vstorage
,
...
...
librocksdb_sys/rocksdb/db/db_compaction_test.cc
View file @
9a1c83c5
...
...
@@ -2894,6 +2894,139 @@ TEST_F(DBCompactionTest, OptimizedDeletionObsoleting) {
options
.
statistics
->
getTickerCount
(
COMPACTION_KEY_DROP_OBSOLETE
));
}
TEST_F
(
DBCompactionTest
,
CompactFilesPendingL0Bug
)
{
// https://www.facebook.com/groups/rocksdb.dev/permalink/1389452781153232/
// CompactFiles() had a bug where it failed to pick a compaction when an L0
// compaction existed, but marked it as scheduled anyways. It'd never be
// unmarked as scheduled, so future compactions or DB close could hang.
const
int
kNumL0Files
=
5
;
Options
options
=
CurrentOptions
();
options
.
level0_file_num_compaction_trigger
=
kNumL0Files
-
1
;
options
.
max_background_compactions
=
2
;
DestroyAndReopen
(
options
);
rocksdb
::
SyncPoint
::
GetInstance
()
->
LoadDependency
(
{{
"LevelCompactionPicker::PickCompaction:Return"
,
"DBCompactionTest::CompactFilesPendingL0Bug:Picked"
},
{
"DBCompactionTest::CompactFilesPendingL0Bug:ManualCompacted"
,
"DBImpl::BackgroundCompaction:NonTrivial:AfterRun"
}});
rocksdb
::
SyncPoint
::
GetInstance
()
->
EnableProcessing
();
auto
schedule_multi_compaction_token
=
dbfull
()
->
TEST_write_controler
().
GetCompactionPressureToken
();
// Files 0-3 will be included in an L0->L1 compaction.
//
// File 4 will be included in a call to CompactFiles() while the first
// compaction is running.
for
(
int
i
=
0
;
i
<
kNumL0Files
-
1
;
++
i
)
{
ASSERT_OK
(
Put
(
Key
(
0
),
"val"
));
// sentinel to prevent trivial move
ASSERT_OK
(
Put
(
Key
(
i
+
1
),
"val"
));
ASSERT_OK
(
Flush
());
}
TEST_SYNC_POINT
(
"DBCompactionTest::CompactFilesPendingL0Bug:Picked"
);
// file 4 flushed after 0-3 picked
ASSERT_OK
(
Put
(
Key
(
kNumL0Files
),
"val"
));
ASSERT_OK
(
Flush
());
// previously DB close would hang forever as this situation caused scheduled
// compactions count to never decrement to zero.
ColumnFamilyMetaData
cf_meta
;
dbfull
()
->
GetColumnFamilyMetaData
(
dbfull
()
->
DefaultColumnFamily
(),
&
cf_meta
);
ASSERT_EQ
(
kNumL0Files
,
cf_meta
.
levels
[
0
].
files
.
size
());
std
::
vector
<
std
::
string
>
input_filenames
;
input_filenames
.
push_back
(
cf_meta
.
levels
[
0
].
files
.
front
().
name
);
ASSERT_OK
(
dbfull
()
->
CompactFiles
(
CompactionOptions
(),
input_filenames
,
0
/* output_level */
));
TEST_SYNC_POINT
(
"DBCompactionTest::CompactFilesPendingL0Bug:ManualCompacted"
);
rocksdb
::
SyncPoint
::
GetInstance
()
->
DisableProcessing
();
}
TEST_F
(
DBCompactionTest
,
CompactFilesOverlapInL0Bug
)
{
// Regression test for bug of not pulling in L0 files that overlap the user-
// specified input files in time- and key-ranges.
Put
(
Key
(
0
),
"old_val"
);
Flush
();
Put
(
Key
(
0
),
"new_val"
);
Flush
();
ColumnFamilyMetaData
cf_meta
;
dbfull
()
->
GetColumnFamilyMetaData
(
dbfull
()
->
DefaultColumnFamily
(),
&
cf_meta
);
ASSERT_GE
(
cf_meta
.
levels
.
size
(),
2
);
ASSERT_EQ
(
2
,
cf_meta
.
levels
[
0
].
files
.
size
());
// Compacting {new L0 file, L1 file} should pull in the old L0 file since it
// overlaps in key-range and time-range.
std
::
vector
<
std
::
string
>
input_filenames
;
input_filenames
.
push_back
(
cf_meta
.
levels
[
0
].
files
.
front
().
name
);
ASSERT_OK
(
dbfull
()
->
CompactFiles
(
CompactionOptions
(),
input_filenames
,
1
/* output_level */
));
ASSERT_EQ
(
"new_val"
,
Get
(
Key
(
0
)));
}
TEST_F
(
DBCompactionTest
,
CompactFilesOutputRangeConflict
)
{
// LSM setup:
// L1: [ba bz]
// L2: [a b] [c d]
// L3: [a b] [c d]
//
// Thread 1: Thread 2:
// Begin compacting all L2->L3
// Compact [ba bz] L1->L3
// End compacting all L2->L3
//
// The compaction operation in thread 2 should be disallowed because the range
// overlaps with the compaction in thread 1, which also covers that range in
// L3.
Options
options
=
CurrentOptions
();
FlushedFileCollector
*
collector
=
new
FlushedFileCollector
();
options
.
listeners
.
emplace_back
(
collector
);
Reopen
(
options
);
for
(
int
level
=
3
;
level
>=
2
;
--
level
)
{
ASSERT_OK
(
Put
(
"a"
,
"val"
));
ASSERT_OK
(
Put
(
"b"
,
"val"
));
ASSERT_OK
(
Flush
());
ASSERT_OK
(
Put
(
"c"
,
"val"
));
ASSERT_OK
(
Put
(
"d"
,
"val"
));
ASSERT_OK
(
Flush
());
MoveFilesToLevel
(
level
);
}
ASSERT_OK
(
Put
(
"ba"
,
"val"
));
ASSERT_OK
(
Put
(
"bz"
,
"val"
));
ASSERT_OK
(
Flush
());
MoveFilesToLevel
(
1
);
SyncPoint
::
GetInstance
()
->
LoadDependency
({
{
"CompactFilesImpl:0"
,
"DBCompactionTest::CompactFilesOutputRangeConflict:Thread2Begin"
},
{
"DBCompactionTest::CompactFilesOutputRangeConflict:Thread2End"
,
"CompactFilesImpl:1"
},
});
SyncPoint
::
GetInstance
()
->
EnableProcessing
();
auto
bg_thread
=
port
::
Thread
([
&
]()
{
// Thread 1
std
::
vector
<
std
::
string
>
filenames
=
collector
->
GetFlushedFiles
();
filenames
.
pop_back
();
ASSERT_OK
(
db_
->
CompactFiles
(
CompactionOptions
(),
filenames
,
3
/* output_level */
));
});
// Thread 2
TEST_SYNC_POINT
(
"DBCompactionTest::CompactFilesOutputRangeConflict:Thread2Begin"
);
std
::
string
filename
=
collector
->
GetFlushedFiles
().
back
();
ASSERT_FALSE
(
db_
->
CompactFiles
(
CompactionOptions
(),
{
filename
},
3
/* output_level */
)
.
ok
());
TEST_SYNC_POINT
(
"DBCompactionTest::CompactFilesOutputRangeConflict:Thread2End"
);
bg_thread
.
join
();
}
INSTANTIATE_TEST_CASE_P
(
DBCompactionTestWithParam
,
DBCompactionTestWithParam
,
::
testing
::
Values
(
std
::
make_tuple
(
1
,
true
),
std
::
make_tuple
(
1
,
false
),
...
...
librocksdb_sys/rocksdb/db/db_impl_compaction_flush.cc
View file @
9a1c83c5
...
...
@@ -515,9 +515,10 @@ Status DBImpl::CompactFilesImpl(
c
.
reset
(
cfd
->
compaction_picker
()
->
CompactFiles
(
compact_options
,
input_files
,
output_level
,
version
->
storage_info
(),
*
cfd
->
GetLatestMutableCFOptions
(),
output_path_id
));
if
(
!
c
)
{
return
Status
::
Aborted
(
"Another Level 0 compaction is running"
);
}
// we already sanitized the set of input files and checked for conflicts
// without releasing the lock, so we're guaranteed a compaction can be formed.
assert
(
c
!=
nullptr
);
c
->
SetInputVersion
(
version
);
// deletion compaction currently not allowed in CompactFiles.
assert
(
!
c
->
deletion_compaction
());
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment