mirror of
https://github.com/scylladb/scylladb.git
synced 2026-05-28 10:41:12 +00:00
db: better handling of failure in column_family::populate
Improve handling of failure by saving first exception and ignoring the remaining futures. At the moment, code only throws first exception and doesn't care about any possible remaining future. Signed-off-by: Raphael Carvalho <raphaelsc@scylladb.com> Message-Id: <383dc4445db09dd2fbce093d4609a0a0bc38a405.1458240398.git.raphaelsc@scylladb.com>
This commit is contained in:
committed by
Avi Kivity
parent
7869a48c31
commit
de4b4e593d
21
database.cc
21
database.cc
@@ -989,13 +989,24 @@ future<> column_family::populate(sstring sstdir) {
|
||||
return make_ready_future<>();
|
||||
}, &manifest_json_filter).then([&futures] {
|
||||
return when_all(futures.begin(), futures.end()).then([] (std::vector<future<>> ret) {
|
||||
try {
|
||||
for (auto& f : ret) {
|
||||
f.get();
|
||||
std::exception_ptr eptr;
|
||||
|
||||
for (auto& f : ret) {
|
||||
try {
|
||||
if (eptr) {
|
||||
f.ignore_ready_future();
|
||||
} else {
|
||||
f.get();
|
||||
}
|
||||
} catch(...) {
|
||||
eptr = std::current_exception();
|
||||
}
|
||||
} catch(...) {
|
||||
throw;
|
||||
}
|
||||
|
||||
if (eptr) {
|
||||
return make_exception_future<>(eptr);
|
||||
}
|
||||
return make_ready_future<>();
|
||||
});
|
||||
}).then([verifier, sstdir, descriptor, this] {
|
||||
return parallel_for_each(*verifier, [sstdir = std::move(sstdir), descriptor, this] (auto v) {
|
||||
|
||||
Reference in New Issue
Block a user