|
24 | 24 |
|
25 | 25 | #include <glog/logging.h> |
26 | 26 | #include <limestone/logging.h> |
| 27 | +#ifdef ENABLE_ALTIMETER |
| 28 | +#include <altimeter/event/constants.h> |
| 29 | +#include <altimeter/log_item.h> |
| 30 | +#include <altimeter/logger.h> |
| 31 | +#endif |
27 | 32 | #include "logging_helper.h" |
28 | 33 | #include "limestone_exception_helper.h" |
29 | 34 |
|
@@ -200,26 +205,99 @@ void datastore::recover() const noexcept { |
200 | 205 |
|
201 | 206 | void datastore::persist_epoch_id(epoch_id_type epoch_id) { |
202 | 207 | TRACE_START << "epoch_id=" << epoch_id; |
203 | | - if (++epoch_write_counter >= max_entries_in_epoch_file) { |
204 | | - write_epoch_to_file_internal(tmp_epoch_file_path_.string(), epoch_id, file_write_mode::overwrite); |
| 208 | + try { |
| 209 | + if (++epoch_write_counter >= max_entries_in_epoch_file) { |
| 210 | + write_epoch_to_file_internal(tmp_epoch_file_path_.string(), epoch_id, file_write_mode::overwrite); |
205 | 211 |
|
206 | | - boost::system::error_code ec; |
207 | | - if (::rename(tmp_epoch_file_path_.c_str(), epoch_file_path_.c_str()) != 0) { |
208 | | - TRACE_ABORT; |
209 | | - LOG_AND_THROW_IO_EXCEPTION("Failed to rename temp file: " + tmp_epoch_file_path_.string() + " to " + epoch_file_path_.string(), errno); |
| 212 | + boost::system::error_code ec; |
| 213 | + if (::rename(tmp_epoch_file_path_.c_str(), epoch_file_path_.c_str()) != 0) { |
| 214 | + TRACE_ABORT; |
| 215 | + LOG_AND_THROW_IO_EXCEPTION("Failed to rename temp file: " + tmp_epoch_file_path_.string() + " to " + epoch_file_path_.string(), errno); |
| 216 | + } |
| 217 | + boost::filesystem::remove(tmp_epoch_file_path_, ec); |
| 218 | + if (ec) { |
| 219 | + TRACE_ABORT; |
| 220 | + LOG_AND_THROW_IO_EXCEPTION("Failed to remove temp file: " + tmp_epoch_file_path_.string(), ec); |
| 221 | + } |
| 222 | + epoch_write_counter = 0; |
| 223 | + } else { |
| 224 | + write_epoch_to_file_internal(epoch_file_path_.string(), epoch_id, file_write_mode::append); |
210 | 225 | } |
211 | | - boost::filesystem::remove(tmp_epoch_file_path_, ec); |
212 | | - if (ec) { |
213 | | - TRACE_ABORT; |
214 | | - LOG_AND_THROW_IO_EXCEPTION("Failed to remove temp file: " + tmp_epoch_file_path_.string(), ec); |
| 226 | +#ifdef ENABLE_ALTIMETER |
| 227 | + if (::altimeter::logger::is_log_on(::altimeter::event::category, |
| 228 | + ::altimeter::event::level::log_data_store)) { |
| 229 | + ::altimeter::log_item log_item; |
| 230 | + log_item.category(::altimeter::event::category); |
| 231 | + log_item.type(::altimeter::event::type::wal_stored); |
| 232 | + log_item.level(::altimeter::event::level::log_data_store); |
| 233 | + log_item.add(::altimeter::event::item::instance_id, impl_->instance_id()); |
| 234 | + log_item.add(::altimeter::event::item::dbname, impl_->db_name()); |
| 235 | + log_item.add(::altimeter::event::item::pid, static_cast<std::int64_t>(impl_->pid())); |
| 236 | + std::string wal_version = std::to_string(epoch_id); |
| 237 | + log_item.add(::altimeter::event::item::wal_version, wal_version); |
| 238 | + log_item.add(::altimeter::event::item::result, ::altimeter::event::result::success); |
| 239 | + ::altimeter::logger::log(log_item); |
215 | 240 | } |
216 | | - epoch_write_counter = 0; |
217 | | - } else { |
218 | | - write_epoch_to_file_internal(epoch_file_path_.string(), epoch_id, file_write_mode::append); |
| 241 | +#endif |
| 242 | + } catch (...) { |
| 243 | +#ifdef ENABLE_ALTIMETER |
| 244 | + if (::altimeter::logger::is_log_on(::altimeter::event::category, |
| 245 | + ::altimeter::event::level::log_data_store)) { |
| 246 | + ::altimeter::log_item log_item; |
| 247 | + log_item.category(::altimeter::event::category); |
| 248 | + log_item.type(::altimeter::event::type::wal_stored); |
| 249 | + log_item.level(::altimeter::event::level::log_data_store); |
| 250 | + log_item.add(::altimeter::event::item::instance_id, impl_->instance_id()); |
| 251 | + log_item.add(::altimeter::event::item::dbname, impl_->db_name()); |
| 252 | + log_item.add(::altimeter::event::item::pid, static_cast<std::int64_t>(impl_->pid())); |
| 253 | + std::string wal_version = std::to_string(epoch_id); |
| 254 | + log_item.add(::altimeter::event::item::wal_version, wal_version); |
| 255 | + log_item.add(::altimeter::event::item::result, ::altimeter::event::result::failure); |
| 256 | + ::altimeter::logger::log(log_item); |
| 257 | + } |
| 258 | +#endif |
| 259 | + throw; |
219 | 260 | } |
220 | 261 | TRACE_END; |
221 | 262 | } |
222 | 263 |
|
| 264 | +void datastore::log_wal_started(epoch_id_type wal_version, bool success) const { |
| 265 | +#ifdef ENABLE_ALTIMETER |
| 266 | + if (!::altimeter::logger::is_log_on(::altimeter::event::category, |
| 267 | + ::altimeter::event::level::log_data_store)) { |
| 268 | + return; |
| 269 | + } |
| 270 | + ::altimeter::log_item log_item; |
| 271 | + log_item.category(::altimeter::event::category); |
| 272 | + log_item.type(::altimeter::event::type::wal_started); |
| 273 | + log_item.level(::altimeter::event::level::log_data_store); |
| 274 | + log_item.add(::altimeter::event::item::instance_id, impl_->instance_id()); |
| 275 | + log_item.add(::altimeter::event::item::dbname, impl_->db_name()); |
| 276 | + log_item.add(::altimeter::event::item::pid, static_cast<std::int64_t>(impl_->pid())); |
| 277 | + std::string wal_version_str = std::to_string(wal_version); |
| 278 | + log_item.add(::altimeter::event::item::wal_version, wal_version_str); |
| 279 | + log_item.add(::altimeter::event::item::result, |
| 280 | + success ? ::altimeter::event::result::success : ::altimeter::event::result::failure); |
| 281 | + ::altimeter::logger::log(log_item); |
| 282 | +#else |
| 283 | + (void)wal_version; |
| 284 | + (void)success; |
| 285 | +#endif |
| 286 | +} |
| 287 | + |
| 288 | +blob_id_type datastore::create_snapshot_and_get_max_blob_id_with_wal_started_log() { |
| 289 | + try { |
| 290 | + auto max_blob_id = create_snapshot_and_get_max_blob_id(); |
| 291 | + log_wal_started(static_cast<epoch_id_type>(epoch_id_informed_.load()), true); |
| 292 | + return max_blob_id; |
| 293 | + } catch (...) { |
| 294 | + // NOTE: This path may not appear in coverage because death tests run in a separate process, |
| 295 | + // and their coverage data is not merged into the parent process report. |
| 296 | + log_wal_started(static_cast<epoch_id_type>(epoch_id_informed_.load()), false); |
| 297 | + throw; |
| 298 | + } |
| 299 | +} |
| 300 | + |
223 | 301 | void datastore::persist_and_propagate_epoch_id(epoch_id_type epoch_id) { |
224 | 302 | TRACE_START << "epoch_id=" << epoch_id; |
225 | 303 | if (impl_->is_async_group_commit_enabled()) { |
@@ -247,7 +325,8 @@ blob_reference_tag_type datastore::generate_reference_tag( |
247 | 325 | void datastore::ready() { |
248 | 326 | TRACE_START; |
249 | 327 | try { |
250 | | - blob_id_type max_blob_id = std::max(create_snapshot_and_get_max_blob_id(), compaction_catalog_->get_max_blob_id()); |
| 328 | + blob_id_type max_blob_id = |
| 329 | + std::max(create_snapshot_and_get_max_blob_id_with_wal_started_log(), compaction_catalog_->get_max_blob_id()); |
251 | 330 | blob_file_garbage_collector_ = std::make_unique<blob_file_garbage_collector>(*blob_file_resolver_); |
252 | 331 | blob_file_garbage_collector_->scan_blob_files(max_blob_id); |
253 | 332 |
|
|
0 commit comments