mirror of
https://github.com/Zygo/bees.git
synced 2025-05-18 05:45:45 +02:00
roots: move common code for creating crawl Tasks into a method
Duplicated code between the different scan modes has slowly been becoming less and less trivial. Move the code to a method and make both scan-modes call it. Signed-off-by: Zygo Blaxell <bees@furryterror.org>
This commit is contained in:
parent
72cc9c2b60
commit
ef44947145
@ -220,6 +220,32 @@ BeesRoots::transid_max()
|
|||||||
return m_transid_re.count();
|
return m_transid_re.count();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
size_t
|
||||||
|
BeesRoots::crawl_batch(shared_ptr<BeesCrawl> this_crawl)
|
||||||
|
{
|
||||||
|
auto ctx_copy = m_ctx;
|
||||||
|
size_t batch_count = 0;
|
||||||
|
auto subvol = this_crawl->get_state().m_root;
|
||||||
|
ostringstream oss;
|
||||||
|
oss << "crawl_" << subvol;
|
||||||
|
auto task_title = oss.str();
|
||||||
|
while (batch_count < BEES_MAX_CRAWL_BATCH) {
|
||||||
|
auto this_state = this_crawl->get_state();
|
||||||
|
auto this_range = this_crawl->pop_front();
|
||||||
|
if (!this_range) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
Task(task_title, [ctx_copy, this_range]() {
|
||||||
|
BEESNOTE("scan_forward " << this_range);
|
||||||
|
ctx_copy->scan_forward(this_range);
|
||||||
|
}).run();
|
||||||
|
BEESCOUNT(crawl_scan);
|
||||||
|
m_crawl_current = this_state;
|
||||||
|
++batch_count;
|
||||||
|
}
|
||||||
|
return batch_count;
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
BeesRoots::crawl_roots()
|
BeesRoots::crawl_roots()
|
||||||
{
|
{
|
||||||
@ -235,8 +261,6 @@ BeesRoots::crawl_roots()
|
|||||||
BEESLOGINFO("idle: crawl map is empty!");
|
BEESLOGINFO("idle: crawl map is empty!");
|
||||||
}
|
}
|
||||||
|
|
||||||
auto ctx_copy = m_ctx;
|
|
||||||
|
|
||||||
switch (s_scan_mode) {
|
switch (s_scan_mode) {
|
||||||
case SCAN_MODE_ZERO: {
|
case SCAN_MODE_ZERO: {
|
||||||
// Scan the same inode/offset tuple in each subvol (good for snapshots)
|
// Scan the same inode/offset tuple in each subvol (good for snapshots)
|
||||||
@ -253,25 +277,13 @@ BeesRoots::crawl_roots()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t batch_count = 0;
|
if (!first_crawl) {
|
||||||
while (first_range && batch_count < BEES_MAX_CRAWL_BATCH) {
|
return;
|
||||||
auto subvol = first_crawl->get_state().m_root;
|
|
||||||
ostringstream oss;
|
|
||||||
oss << "crawl_" << subvol;
|
|
||||||
auto task_title = oss.str();
|
|
||||||
Task(task_title, [ctx_copy, first_range]() {
|
|
||||||
BEESNOTE("scan_forward " << first_range);
|
|
||||||
ctx_copy->scan_forward(first_range);
|
|
||||||
}).run();
|
|
||||||
BEESCOUNT(crawl_scan);
|
|
||||||
m_crawl_current = first_crawl->get_state();
|
|
||||||
auto first_range_popped = first_crawl->pop_front();
|
|
||||||
THROW_CHECK2(runtime_error, first_range, first_range_popped, first_range == first_range_popped);
|
|
||||||
first_range = first_crawl->peek_front();
|
|
||||||
++batch_count;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (first_range || batch_count) {
|
auto batch_count = crawl_batch(first_crawl);
|
||||||
|
|
||||||
|
if (batch_count) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -279,33 +291,18 @@ BeesRoots::crawl_roots()
|
|||||||
}
|
}
|
||||||
case SCAN_MODE_ONE: {
|
case SCAN_MODE_ONE: {
|
||||||
// Scan each subvol one extent at a time (good for continuous forward progress)
|
// Scan each subvol one extent at a time (good for continuous forward progress)
|
||||||
bool crawled = false;
|
size_t batch_count = 0;
|
||||||
for (auto i : crawl_map_copy) {
|
for (auto i : crawl_map_copy) {
|
||||||
auto this_crawl = i.second;
|
batch_count += crawl_batch(i.second);
|
||||||
auto this_range = this_crawl->peek_front();
|
}
|
||||||
size_t batch_count = 0;
|
|
||||||
while (this_range && batch_count < BEES_MAX_CRAWL_BATCH) {
|
if (batch_count) {
|
||||||
auto subvol = this_crawl->get_state().m_root;
|
return;
|
||||||
ostringstream oss;
|
|
||||||
oss << "crawl_" << subvol;
|
|
||||||
auto task_title = oss.str();
|
|
||||||
Task(task_title, [ctx_copy, this_range]() {
|
|
||||||
BEESNOTE("scan_forward " << this_range);
|
|
||||||
ctx_copy->scan_forward(this_range);
|
|
||||||
}).run();
|
|
||||||
crawled = true;
|
|
||||||
BEESCOUNT(crawl_scan);
|
|
||||||
m_crawl_current = this_crawl->get_state();
|
|
||||||
auto this_range_popped = this_crawl->pop_front();
|
|
||||||
THROW_CHECK2(runtime_error, this_range, this_range_popped, this_range == this_range_popped);
|
|
||||||
this_range = this_crawl->peek_front();
|
|
||||||
++batch_count;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (crawled) return;
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case SCAN_MODE_COUNT: assert(false); break;
|
case SCAN_MODE_COUNT: assert(false); break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -548,6 +548,7 @@ class BeesRoots : public enable_shared_from_this<BeesRoots> {
|
|||||||
uint64_t next_root(uint64_t root = 0);
|
uint64_t next_root(uint64_t root = 0);
|
||||||
void current_state_set(const BeesCrawlState &bcs);
|
void current_state_set(const BeesCrawlState &bcs);
|
||||||
RateEstimator& transid_re();
|
RateEstimator& transid_re();
|
||||||
|
size_t crawl_batch(shared_ptr<BeesCrawl> crawl);
|
||||||
|
|
||||||
friend class BeesFdCache;
|
friend class BeesFdCache;
|
||||||
friend class BeesCrawl;
|
friend class BeesCrawl;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user