1919#include < cstddef>
2020#include < future>
2121#include < list>
22+ #include < numeric>
2223#include < unordered_map>
2324#include < unordered_set>
2425
3536#include " paimon/core/manifest/manifest_file.h"
3637#include " paimon/core/manifest/manifest_file_meta.h"
3738#include " paimon/core/manifest/manifest_list.h"
39+ #include " paimon/core/operation/metrics/scan_metrics.h"
3840#include " paimon/core/partition/partition_info.h"
3941#include " paimon/core/stats/simple_stats.h"
4042#include " paimon/core/utils/field_mapping.h"
@@ -72,10 +74,12 @@ FileStoreScan::RawPlan::GroupFiles FileStoreScan::RawPlan::GroupByPartFiles(
7274
7375Result<std::vector<PartitionEntry>> FileStoreScan::ReadPartitionEntries () const {
7476 std::optional<Snapshot> snapshot;
75- std::vector<ManifestFileMeta> manifest_file_metas;
76- PAIMON_RETURN_NOT_OK (ReadManifests (&snapshot, &manifest_file_metas));
77+ std::vector<ManifestFileMeta> all_manifest_file_metas;
78+ std::vector<ManifestFileMeta> filtered_manifest_file_metas;
79+ PAIMON_RETURN_NOT_OK (
80+ ReadManifests (&snapshot, &all_manifest_file_metas, &filtered_manifest_file_metas));
7781 std::vector<ManifestEntry> manifest_entries;
78- PAIMON_RETURN_NOT_OK (ReadFileEntries (manifest_file_metas , &manifest_entries));
82+ PAIMON_RETURN_NOT_OK (ReadFileEntries (filtered_manifest_file_metas , &manifest_entries));
7983 std::unordered_map<BinaryRow, PartitionEntry> partitions;
8084 PAIMON_RETURN_NOT_OK (PartitionEntry::Merge (manifest_entries, &partitions));
8185
@@ -90,13 +94,16 @@ Result<std::vector<PartitionEntry>> FileStoreScan::ReadPartitionEntries() const
9094}
9195
9296Result<std::shared_ptr<FileStoreScan::RawPlan>> FileStoreScan::CreatePlan () const {
97+ const auto started = std::chrono::high_resolution_clock::now ();
9398 std::optional<Snapshot> snapshot;
94- std::vector<ManifestFileMeta> manifest_file_metas;
95- PAIMON_RETURN_NOT_OK (ReadManifests (&snapshot, &manifest_file_metas));
96- manifest_file_metas = PostFilterManifests (std::move (manifest_file_metas));
99+ std::vector<ManifestFileMeta> all_manifest_file_metas;
100+ std::vector<ManifestFileMeta> filtered_manifest_file_metas;
101+ PAIMON_RETURN_NOT_OK (
102+ ReadManifests (&snapshot, &all_manifest_file_metas, &filtered_manifest_file_metas));
103+ filtered_manifest_file_metas = PostFilterManifests (std::move (filtered_manifest_file_metas));
97104
98105 std::vector<ManifestEntry> manifest_entries;
99- PAIMON_RETURN_NOT_OK (ReadManifestEntries (manifest_file_metas , &manifest_entries));
106+ PAIMON_RETURN_NOT_OK (ReadManifestEntries (filtered_manifest_file_metas , &manifest_entries));
100107 PAIMON_ASSIGN_OR_RAISE (manifest_entries,
101108 PostFilterManifestEntries (std::move (manifest_entries)));
102109
@@ -121,29 +128,46 @@ Result<std::shared_ptr<FileStoreScan::RawPlan>> FileStoreScan::CreatePlan() cons
121128 }
122129 }
123130 }
131+ const int64_t all_data_files = std::accumulate (
132+ all_manifest_file_metas.begin (), all_manifest_file_metas.end (), int64_t {0 },
133+ [](const int64_t sum, const ManifestFileMeta& manifest_file_meta) {
134+ return sum + manifest_file_meta.NumAddedFiles () - manifest_file_meta.NumDeletedFiles ();
135+ });
136+ metrics_->SetCounter (ScanMetrics::LAST_SCAN_DURATION ,
137+ std::chrono::duration_cast<std::chrono::milliseconds>(
138+ std::chrono::high_resolution_clock::now () - started)
139+ .count ());
140+ metrics_->SetCounter (ScanMetrics::LAST_SCANNED_SNAPSHOT_ID ,
141+ snapshot.has_value () ? snapshot.value ().Id () : int64_t {0 });
142+ metrics_->SetCounter (ScanMetrics::LAST_SCANNED_MANIFESTS , filtered_manifest_file_metas.size ());
143+ metrics_->SetCounter (ScanMetrics::LAST_SCAN_SKIPPED_TABLE_FILES ,
144+ all_data_files - manifest_entries.size ());
145+ metrics_->SetCounter (ScanMetrics::LAST_SCAN_RESULTED_TABLE_FILES , manifest_entries.size ());
124146 return std::make_shared<FileStoreScan::RawPlan>(scan_mode_, snapshot,
125147 std::move (manifest_entries));
126148}
127149
128150Status FileStoreScan::ReadManifests (std::optional<Snapshot>* snapshot_ptr,
129- std::vector<ManifestFileMeta>* manifests_ptr) const {
151+ std::vector<ManifestFileMeta>* all_manifests_ptr,
152+ std::vector<ManifestFileMeta>* filter_manifests_ptr) const {
130153 auto & snapshot = *snapshot_ptr;
131- auto & manifests = *manifests_ptr;
154+ auto & all_manifests = *all_manifests_ptr;
155+ auto & filtered_manifests = *filter_manifests_ptr;
132156 if (specified_snapshot_ != std::nullopt ) {
133157 snapshot = specified_snapshot_;
134158 } else {
135159 PAIMON_ASSIGN_OR_RAISE (snapshot, snapshot_manager_->LatestSnapshot ());
136160 }
137161 if (snapshot == std::nullopt ) {
138- manifests = std::vector<ManifestFileMeta>();
162+ all_manifests = std::vector<ManifestFileMeta>();
163+ filtered_manifests = std::vector<ManifestFileMeta>();
139164 return Status::OK ();
140165 }
141- std::vector<ManifestFileMeta> unfiltered_manifest_metas;
142- PAIMON_RETURN_NOT_OK (ReadManifestsWithSnapshot (snapshot.value (), &unfiltered_manifest_metas));
143- for (const auto & meta : unfiltered_manifest_metas) {
166+ PAIMON_RETURN_NOT_OK (ReadManifestsWithSnapshot (snapshot.value (), &all_manifests));
167+ for (const auto & meta : all_manifests) {
144168 PAIMON_ASSIGN_OR_RAISE (bool filter_meta_result, FilterManifestFileMeta (meta));
145169 if (filter_meta_result) {
146- manifests .push_back (meta);
170+ filtered_manifests .push_back (meta);
147171 }
148172 }
149173 return Status::OK ();
0 commit comments