diff --git a/helio b/helio index 6e77555e7..438c86139 160000 --- a/helio +++ b/helio @@ -1 +1 @@ -Subproject commit 6e77555e7deb619fbd3398d085f8c604aa71869b +Subproject commit 438c86139eac2e6400f2aae1d46cff03b31c166f diff --git a/src/server/detail/snapshot_storage.cc b/src/server/detail/snapshot_storage.cc index c58291125..e85695e13 100644 --- a/src/server/detail/snapshot_storage.cc +++ b/src/server/detail/snapshot_storage.cc @@ -236,9 +236,7 @@ GcsSnapshotStorage::~GcsSnapshotStorage() { } error_code GcsSnapshotStorage::Init(unsigned connect_ms) { - fb2::ProactorBase* proactor = fb2::ProactorBase::me(); - CHECK(proactor); - error_code ec = creds_provider_.Init(connect_ms, proactor); + error_code ec = creds_provider_.Init(connect_ms); if (ec) return ec; @@ -282,10 +280,39 @@ io::ReadonlyFileOrError GcsSnapshotStorage::OpenReadFile(const std::string& path return cloud::OpenReadGcsFile(bucket, key, opts); } -io::Result GcsSnapshotStorage::LoadPath(std::string_view dir, - std::string_view dbfilename) { - LOG(ERROR) << "Load snapshot: Searching for snapshot in GCS path: " << dir << "/" << dbfilename; - return nonstd::make_unexpected(GenericError("Not supported")); +io::Result GcsSnapshotStorage::LoadPath(string_view dir, + string_view dbfilename) { + if (dbfilename.empty()) + return ""; + + auto [bucket_name, prefix] = GetBucketPath(dir); + + fb2::ProactorBase* proactor = shard_set->pool()->GetNextProactor(); + + io::Result, GenericError> keys = + proactor->Await([this, proactor, bucket_name = bucket_name, + prefix = prefix]() -> io::Result, GenericError> { + cloud::GCS gcs(&creds_provider_, ctx_, proactor); + vector res; + error_code ec = + gcs.List(bucket_name, prefix, false, [&res](const cloud::StorageListItem& item) { + res.emplace_back(SnapStat{string(item.key), item.mtime_ns}); + }); + if (ec) + return nonstd::make_unexpected(GenericError(ec, "Failed to list objects")); + return res; + }); + + if (!keys) { + return nonstd::make_unexpected(keys.error()); + } + + auto match_key = FindMatchingFile(prefix, dbfilename, *keys); + if (!match_key.empty()) { + return absl::StrCat(kGCSPrefix, bucket_name, "/", match_key); + } + return nonstd::make_unexpected(GenericError( + std::make_error_code(std::errc::no_such_file_or_directory), "Snapshot not found")); } io::Result, GenericError> GcsSnapshotStorage::ExpandFromPath(