forked from tikv/tikv
-
Notifications
You must be signed in to change notification settings - Fork 9
Mock implementation part 2 #33
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Open
CalvinNeo
wants to merge
195
commits into
pingcap:raftstore-proxy-backup
Choose a base branch
from
CalvinNeo:raftstore-proxy-ci-ut
base: raftstore-proxy-backup
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Open
Changes from all commits
Commits
Show all changes
195 commits
Select commit
Hold shift + click to select a range
f604600
update ci build & check
solotzg 3a0106b
wip: add ci unit tests
solotzg e176295
wip: enable mock tests temporarily
solotzg f764e73
Add 2 ffi
CalvinNeo 8f8d495
Sept2
CalvinNeo 68b36fc
Add snapshot part1, Still need to create RaftStoreProxyFFIHelper
CalvinNeo 095c911
Sep 3
CalvinNeo 0eae5ad
enable RaftStoreProxyFFIHelper implementation in cluster.rs
CalvinNeo 10e4f2f
Remove imcomplete proxy_helper
CalvinNeo d647ae9
Add Cargo.lock
CalvinNeo aaecf05
set engine_store_server_helper for related modules
solotzg 3c863ba
fix
solotzg 095ca2f
12
solotzg 1788043
Merge remote-tracking branch 'upstream/raftstore-proxy' into raftstor…
CalvinNeo 8cd199d
pending...
CalvinNeo 91aa5d7
pending2
CalvinNeo 859a497
pending3
CalvinNeo ee0b023
pending4
CalvinNeo b67afe4
pending5
CalvinNeo 05ed01e
use raw pointer
CalvinNeo 9441d41
debug
CalvinNeo 0120b33
debug2
CalvinNeo 41cb402
Fix
CalvinNeo 0178fbc
Fix
CalvinNeo c619024
before refactor
CalvinNeo eaa7b0f
after refactor
CalvinNeo b55402e
why assert_eq!(apply_state, last_applied_state)
CalvinNeo 0272226
Seems OK when remove all put
CalvinNeo a3fa8da
remove asserts and test is ok now
CalvinNeo 28ca260
find I should use keys::data_key(key)
CalvinNeo 9257ea0
Now can read from only one Node
CalvinNeo f45aeb9
Need to firstly implement snapshot(prehandle and apply), than we can …
CalvinNeo cb26373
use box
CalvinNeo 42c28a0
Merge remote-tracking branch 'pingcap/raftstore-proxy' into raftstore…
solotzg 58cb972
Solve GC panic
CalvinNeo 4f52709
Write to rocksdb when apply snapshot
CalvinNeo a9dd186
Find snapshot is empty
CalvinNeo 4316457
no use gc
CalvinNeo e5cfff3
use global cluster object for easy debugging
CalvinNeo 850378a
Seems OK
CalvinNeo c2b2ee5
make it work
CalvinNeo d37eb47
Now insert into staging when prehandle
CalvinNeo d1f0476
Switch to Box::into_raw
CalvinNeo 582b654
Fix
CalvinNeo 0918f2e
get_cluster returns Option
CalvinNeo e8e08a1
Fix error
CalvinNeo 41903a7
Add need_sync into apply to elimimate assert_eq! error
CalvinNeo 845ced6
Fix
CalvinNeo b24a5da
Try run normal tests
CalvinNeo b8283be
fmt
CalvinNeo d457cfa
Remove print
CalvinNeo 229b028
Remove prints2
CalvinNeo 8af7078
Polish
CalvinNeo 5486d11
Polish
CalvinNeo 375a24b
Merge remote-tracking branch 'pingcap/raftstore-proxy' into raftstore…
solotzg 27637ee
Merge remote-tracking branch 'upstream/raftstore-proxy-ci-ut' into ra…
CalvinNeo b594453
Fix
CalvinNeo cc07e1f
Reduce exact pattern matching
CalvinNeo 511c9ee
Polish and add some ingest_sst code
CalvinNeo a2e5405
Enable accessing cluster inside EngineStoreServer
CalvinNeo 798fd18
Test ingest sst
CalvinNeo efe4f72
Add failpoints
CalvinNeo 1b044fc
Now can run
CalvinNeo fe4fbba
Enable test
CalvinNeo e1d7c3a
Write command will no longer access memory, fix ci
CalvinNeo b6493e5
Destructive iterate over region.data
CalvinNeo 2b34f97
Polish
CalvinNeo cf90399
fmt
CalvinNeo 23f666b
Try to find out why alloc_id incs
CalvinNeo 165d6c6
Fix test
CalvinNeo f4afa7f
Remove debug message
CalvinNeo 3392639
Polish
CalvinNeo c950388
Fix
CalvinNeo 716213c
Should write `impl Drop for`
CalvinNeo 4c0c062
Use Option to reduce redundant objects
CalvinNeo 64ab40a
Polish
CalvinNeo f3c8ac2
Invalid cache
CalvinNeo 2ba2762
fmt
CalvinNeo f86b15f
Remove instable tests on ci
CalvinNeo ce4e92e
Use prev cache
CalvinNeo 83b4fdc
Mock implementation part 1 (#25)
CalvinNeo 3ed78e4
Handle AdminCmd of BatchSplit
CalvinNeo 1a50b84
Merge branch 'pingcap:raftstore-proxy' into raftstore-proxy-ci-ut
CalvinNeo 26da727
Merge branch 'raftstore-proxy-ci-ut' of github.com:CalvinNeo/tidb-eng…
CalvinNeo 809e6db
Merge branch 'raftstore-proxy' into raftstore-proxy-ci-ut
solotzg d65cd77
Update @version
solotzg b16f137
Add PrepareMerge
CalvinNeo 1643ce6
Remove rebundant codes
CalvinNeo 88b05f4
First part of CommitMerge
CalvinNeo 40939a1
CommitMerge part2
CalvinNeo 33b51af
Enable test_bootstrap
CalvinNeo b32b1fd
Enable test_bootstrap
CalvinNeo 8462894
Remove log
CalvinNeo 956e025
Add Rollback
CalvinNeo 9819d5e
Add serveral integration test
CalvinNeo d158aee
Add change peer
CalvinNeo 5110145
Remove test_snap
CalvinNeo f51ce26
Add CompactLog, ComputeHash, VerifyHash
CalvinNeo 9235595
Fix test_snap in integration
CalvinNeo 3d4dcfe
Try fix test_compact_lock_cf: Add flush, Add metrics
CalvinNeo e7cec1e
Find that Compact is triggered, but CompactWriteBytes is still 0
CalvinNeo cc4269e
Fix ci
CalvinNeo 35a43e5
Disable merge/split tests
CalvinNeo 262c8ff
Fix
CalvinNeo cce701d
Fix serveral tests in test_single, Remove NotFound
CalvinNeo 5338ca2
Merge branch 'raftstore-proxy-ci-ut' of github.com:CalvinNeo/tidb-eng…
CalvinNeo a3725b4
Fix when there is no apply_state, Disable delete range test
CalvinNeo bc78caa
Remove flush and region new
CalvinNeo 0b8a3d8
Polish
CalvinNeo b3c8b9c
SOlve test_normal fails when persist apply by persist more
CalvinNeo d4a791e
Remove flush to try to solve test_pending_snapshot
CalvinNeo ba177e3
Rewrite set_apply_index to avoid flush problems
CalvinNeo 9fe9f30
Add grcov support
CalvinNeo 015e620
Fix
CalvinNeo 3c87dac
Fix .gitignore
CalvinNeo 838d05a
Fix
CalvinNeo 42467ef
Fix
CalvinNeo 5b894c5
Fix test_split_not_to_split_existing_region
CalvinNeo 5c3104d
Fix test_split_not_to_split_existing_region
CalvinNeo d32b1a0
Add region 1
CalvinNeo dac8f2d
Disable cov when ci
CalvinNeo 9a16450
Fix test_normal
CalvinNeo 0fbcc54
Fix no region 1
CalvinNeo e20d9b8
Fix cov
CalvinNeo 0e4220b
Try fix test_early_apply
CalvinNeo 5620e3a
Try fix test_early_apply 2
CalvinNeo dfe7d03
Fixed early apply issue, however, there are still split issue
CalvinNeo 192c956
Must transfer leader, or split region will not work
CalvinNeo e915943
Remove helpers
CalvinNeo 254c1cd
Polish and rename
CalvinNeo 115d07f
Clarify
CalvinNeo b4ee9f2
Find test_split_not_to_split_existing_tombstone_region do not have wr…
CalvinNeo 82e5222
Fix part of test_split_not_to_split_existing_tombstone_region
CalvinNeo 3095bf8
Fix tombstone
CalvinNeo 4b7ecbe
Use make_new_region everywhere
CalvinNeo c64d549
Support Region::peer
CalvinNeo cca25a5
Solve too much log in test_merge
CalvinNeo 0aebab1
Sometimes we can not get peer
CalvinNeo 23f533b
Try reduce compiling
CalvinNeo fb538c0
Add RaftCmdResponse at exec_write_cmd
CalvinNeo 3c28326
Add failpoints back, Increase test_evict_entry_cache wait time
CalvinNeo e6a3515
TiFlash Proxy uses peer_addr
CalvinNeo 24c8164
Remove debug utils for test_compact_lock_cf, since it is solved by re…
CalvinNeo f87877b
Make ci happier
CalvinNeo 0426bfb
Make ci happier
CalvinNeo 512a2cb
test_server ok, test_snap may fail
CalvinNeo 1d9ad58
try fix ENGINE_STORE_SERVER_HELPER_PTR
CalvinNeo 589d98d
Fix status
CalvinNeo 77a6bee
Fix
CalvinNeo 1e343f6
Move make_global_ffi_helper_set_no_bind to global, change test cases
CalvinNeo f67a479
Fix
CalvinNeo 396c498
Remove log
CalvinNeo 5d90e2c
Can't use lazy_statics, witch to call once
CalvinNeo 0418069
Remove useless persist_apply_state
CalvinNeo 2305282
Clean cache
CalvinNeo bcff334
Change tests
CalvinNeo 95a21cb
Remove redundant codes
CalvinNeo d3ebe95
Remove some warnings
CalvinNeo 1e639fd
Lengthen test_merge sleep time to avoid occasional error, ffi_handle_…
CalvinNeo 0cb5d32
Add test
CalvinNeo e238b11
Refine code for merge
CalvinNeo 47999b4
Merge branch 'raftstore-proxy' into raftstore-proxy-ci-ut
CalvinNeo 3883491
Fix
CalvinNeo cf111ca
Need another clean
CalvinNeo c7c20ec
Fix
CalvinNeo 969b231
Add feature predicate
CalvinNeo 853ca36
Fix
CalvinNeo f7bac8f
Lengthen wait time
CalvinNeo 689c202
Lengthen timeout
CalvinNeo 25c9388
Fix
CalvinNeo e9db4d2
Fix capital
CalvinNeo 613b2f9
Fix
CalvinNeo 32fba64
Not clean every time
CalvinNeo 7666b3e
longer time
CalvinNeo c02a9cb
Adopt review suggestions
CalvinNeo 74a2889
Fix
CalvinNeo 316c917
remove compare_vec
CalvinNeo daecaea
Add check for PrepareMerge
CalvinNeo 6461578
Add merge
CalvinNeo 54fd731
Remove redandunt codes
CalvinNeo 0fe5240
Remove unsafe
CalvinNeo eca20a8
Organize codes
CalvinNeo 034d01e
Polish
CalvinNeo 01efa62
Add test for batch read index
CalvinNeo 23de777
Fix coverage and some other tests
CalvinNeo b23bc3e
fix
CalvinNeo eb4871f
Add time
CalvinNeo debdd03
Wait longer for merge
CalvinNeo 6d34412
Enable NotFound
CalvinNeo 43097d9
fix
CalvinNeo 829f07e
fmt
CalvinNeo adc06bb
open NotFound for admin
CalvinNeo 12cc4f2
fix
CalvinNeo 25d1a36
fix
CalvinNeo c40ea51
fix
CalvinNeo File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,74 @@ | ||
if [ ${CLEAN:-0} -ne 0 ]; then | ||
cargo clean | ||
fi | ||
|
||
TEST_THREAD= | ||
|
||
if [ ${GENERATE_COV:-0} -ne 0 ]; then | ||
export RUST_BACKTRACE=1 | ||
export RUSTFLAGS="-Zinstrument-coverage" | ||
export LLVM_PROFILE_FILE="tidb-engine-ext-%p-%m.profraw" | ||
rustup component list | grep "llvm-tools-preview-x86_64-unknown-linux-gnu (installed)" | ||
if [ $? -ne 0 ]; then | ||
rustup component add llvm-tools-preview | ||
fi | ||
cargo install --list | grep grcov | ||
if [ $? -ne 0 ]; then | ||
cargo install grcov | ||
fi | ||
export TEST_THREAD="--test-threads 1" | ||
find . -name "*.profraw" -type f -delete | ||
fi | ||
|
||
cargo test --package tests --test failpoints -- cases::test_normal $TEST_THREAD && \ | ||
cargo test --package tests --test failpoints -- cases::test_bootstrap $TEST_THREAD && \ | ||
cargo test --package tests --test failpoints -- cases::test_compact_log $TEST_THREAD && \ | ||
cargo test --package tests --test failpoints -- cases::test_early_apply $TEST_THREAD && \ | ||
cargo test --package tests --test failpoints -- cases::test_encryption $TEST_THREAD && \ | ||
cargo test --package tests --test failpoints -- cases::test_pd_client $TEST_THREAD && \ | ||
cargo test --package tests --test failpoints -- cases::test_pending_peers $TEST_THREAD && \ | ||
cargo test --package tests --test failpoints -- cases::test_transaction $TEST_THREAD && \ | ||
cargo test --package tests --test failpoints -- cases::test_cmd_epoch_checker $TEST_THREAD && \ | ||
cargo test --package tests --test failpoints -- cases::test_disk_full $TEST_THREAD && \ | ||
cargo test --package tests --test failpoints -- cases::test_stale_peer $TEST_THREAD && \ | ||
cargo test --package tests --test failpoints -- cases::test_import_service $TEST_THREAD && \ | ||
cargo test --package tests --test failpoints -- cases::test_split_region --skip test_report_approximate_size_after_split_check $TEST_THREAD && \ | ||
cargo test --package tests --test failpoints -- cases::test_snap $TEST_THREAD && \ | ||
cargo test --package tests --test failpoints -- cases::test_merge $TEST_THREAD && \ | ||
cargo test --package tests --test failpoints -- cases::test_replica_read $TEST_THREAD && \ | ||
# TiFlash do not support stale read currently | ||
#cargo test --package tests --test failpoints -- cases::test_replica_stale_read $TEST_THREAD && \ | ||
cargo test --package tests --test failpoints -- cases::test_server $TEST_THREAD | ||
|
||
cargo test --package tests --test integrations -- raftstore::test_bootstrap $TEST_THREAD && \ | ||
cargo test --package tests --test integrations -- raftstore::test_clear_stale_data $TEST_THREAD && \ | ||
cargo test --package tests --test integrations -- raftstore::test_compact_after_delete $TEST_THREAD && \ | ||
cargo test --package tests --test integrations -- raftstore::test_compact_log $TEST_THREAD && \ | ||
## Sometimes fails | ||
#cargo test --package tests --test integrations -- raftstore::test_conf_change $TEST_THREAD && \ | ||
cargo test --package tests --test integrations -- raftstore::test_early_apply $TEST_THREAD && \ | ||
cargo test --package tests --test integrations -- raftstore::test_hibernate $TEST_THREAD && \ | ||
cargo test --package tests --test integrations -- raftstore::test_joint_consensus $TEST_THREAD && \ | ||
cargo test --package tests --test integrations -- raftstore::test_replica_read $TEST_THREAD && \ | ||
cargo test --package tests --test integrations -- raftstore::test_snap $TEST_THREAD && \ | ||
# Sometimes fails | ||
#cargo test --package tests --test integrations -- raftstore::test_split_region $TEST_THREAD && \ | ||
cargo test --package tests --test integrations -- raftstore::test_stale_peer $TEST_THREAD && \ | ||
cargo test --package tests --test integrations -- raftstore::test_status_command $TEST_THREAD && \ | ||
cargo test --package tests --test integrations -- raftstore::test_prevote $TEST_THREAD && \ | ||
cargo test --package tests --test integrations -- raftstore::test_region_change_observer $TEST_THREAD && \ | ||
cargo test --package tests --test integrations -- raftstore::test_region_heartbeat $TEST_THREAD && \ | ||
cargo test --package tests --test integrations -- raftstore::test_region_info_accessor $TEST_THREAD && \ | ||
cargo test --package tests --test integrations -- raftstore::test_transfer_leader $TEST_THREAD && \ | ||
cargo test --package tests --test integrations -- raftstore::test_single $TEST_THREAD && \ | ||
# Sometimes fails | ||
cargo test --package tests --test integrations -- raftstore::test_merge $TEST_THREAD && \ | ||
cargo test --package tests --test integrations -- raftstore::test_tombstone $TEST_THREAD && \ | ||
cargo test --package tests --test integrations -- server::kv_service::test_read_index_check_memory_locks $TEST_THREAD && \ | ||
cargo test --package tests --test integrations -- raftstore::test_batch_read_index $TEST_THREAD && \ | ||
cargo test --package tests --test integrations -- import::test_sst_service::test_upload_sst $TEST_THREAD && \ | ||
|
||
|
||
if [ ${GENERATE_COV:-0} -ne 0 ]; then | ||
grcov . --binary-path target/debug/ . -t html --branch --ignore-not-existing -o ./coverage/ | ||
fi |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -39,4 +39,4 @@ fuzz-incremental/ | |
/last_tikv.toml | ||
/raft/ | ||
core.* | ||
|
||
*.profraw |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -932,6 +932,14 @@ where | |
break; | ||
} | ||
|
||
if cfg!(feature = "test-raftstore-proxy") { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This may occasionally fail in test_conf_change/test_conf_change now, so I disable those test. If it should happened in other tests, context can be print out. |
||
// Since `expect_index != entry.get_index()` may occasionally fail, add this log to gather log if it fails. | ||
debug!( | ||
"currently apply_state is {:?} entry index {}", | ||
self.apply_state, | ||
entry.get_index() | ||
); | ||
} | ||
let expect_index = self.apply_state.get_applied_index() + 1; | ||
if expect_index != entry.get_index() { | ||
panic!( | ||
|
@@ -1494,10 +1502,35 @@ where | |
ApplyResult<EK::Snapshot>, | ||
EngineStoreApplyRes, | ||
)> { | ||
fail_point!( | ||
"on_apply_write_cmd", | ||
cfg!(release) || self.id() == 3, | ||
|_| { | ||
unimplemented!(); | ||
} | ||
); | ||
const NONE_STR: &str = ""; | ||
let requests = req.get_requests(); | ||
let mut ssts = vec![]; | ||
let mut cmds = WriteCmds::with_capacity(requests.len()); | ||
let resp = if cfg!(feature = "test-raftstore-proxy") { | ||
let mut responses = Vec::with_capacity(requests.len()); | ||
for req in requests { | ||
let mut r = Response::default(); | ||
r.set_cmd_type(req.get_cmd_type()); | ||
responses.push(r); | ||
} | ||
|
||
let mut resp = RaftCmdResponse::default(); | ||
if !req.get_header().get_uuid().is_empty() { | ||
let uuid = req.get_header().get_uuid().to_vec(); | ||
resp.mut_header().set_uuid(uuid); | ||
} | ||
resp.set_responses(responses.into()); | ||
resp | ||
} else { | ||
RaftCmdResponse::new() | ||
}; | ||
for req in requests { | ||
let cmd_type = req.get_cmd_type(); | ||
match cmd_type { | ||
|
@@ -1509,6 +1542,9 @@ where | |
self.metrics.size_diff_hint += key.len() as i64 + value.len() as i64; | ||
self.metrics.written_bytes += key.len() as u64 + value.len() as u64; | ||
self.metrics.written_keys += 1; | ||
} else { | ||
self.metrics.lock_cf_written_bytes += key.len() as u64; | ||
self.metrics.lock_cf_written_bytes += value.len() as u64; | ||
} | ||
cmds.push(key, value, WriteCmdType::Put, cf); | ||
} | ||
|
@@ -1521,6 +1557,8 @@ where | |
self.metrics.delete_keys_hint += 1; | ||
self.metrics.written_bytes += key.len() as u64; | ||
self.metrics.written_keys += 1; | ||
} else { | ||
self.metrics.lock_cf_written_bytes += key.len() as u64; | ||
} | ||
cmds.push(key, NONE_STR.as_ref(), WriteCmdType::Del, cf); | ||
} | ||
|
@@ -1564,11 +1602,7 @@ where | |
"pending_ssts" => ?self.pending_clean_ssts | ||
); | ||
|
||
Ok(( | ||
RaftCmdResponse::new(), | ||
ApplyResult::None, | ||
EngineStoreApplyRes::None, | ||
)) | ||
Ok((resp, ApplyResult::None, EngineStoreApplyRes::None)) | ||
} | ||
EngineStoreApplyRes::NotFound | EngineStoreApplyRes::Persist => { | ||
ssts.append(&mut self.pending_clean_ssts); | ||
|
@@ -1582,7 +1616,7 @@ where | |
); | ||
ctx.delete_ssts.append(&mut ssts.clone()); | ||
Ok(( | ||
RaftCmdResponse::new(), | ||
resp, | ||
ApplyResult::Res(ExecResult::IngestSst { ssts }), | ||
EngineStoreApplyRes::Persist, | ||
)) | ||
|
@@ -1599,7 +1633,7 @@ where | |
), | ||
) | ||
}; | ||
Ok((RaftCmdResponse::new(), ApplyResult::None, flash_res)) | ||
Ok((resp, ApplyResult::None, flash_res)) | ||
}; | ||
} | ||
} | ||
|
@@ -1883,14 +1917,14 @@ where | |
|
||
match change_type { | ||
ConfChangeType::AddNode => { | ||
let add_ndoe_fp = || { | ||
let add_node_fp = || { | ||
fail_point!( | ||
"apply_on_add_node_1_2", | ||
self.id == 2 && self.region_id() == 1, | ||
|_| {} | ||
) | ||
}; | ||
add_ndoe_fp(); | ||
add_node_fp(); | ||
|
||
PEER_ADMIN_CMD_COUNTER_VEC | ||
.with_label_values(&["add_peer", "all"]) | ||
|
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.