1 // Copyright (c) 2011-present, Facebook, Inc. All rights reserved.
2 // This source code is licensed under both the GPLv2 (found in the
3 // COPYING file in the root directory) and Apache 2.0 License
4 // (found in the LICENSE.Apache file in the root directory).
6 #include "db/event_helpers.h"
8 namespace ROCKSDB_NAMESPACE
{
12 inline T
SafeDivide(T a
, T b
) {
13 return b
== 0 ? 0 : a
/ b
;
17 void EventHelpers::AppendCurrentTime(JSONWriter
* jwriter
) {
18 *jwriter
<< "time_micros"
19 << std::chrono::duration_cast
<std::chrono::microseconds
>(
20 std::chrono::system_clock::now().time_since_epoch())
25 void EventHelpers::NotifyTableFileCreationStarted(
26 const std::vector
<std::shared_ptr
<EventListener
>>& listeners
,
27 const std::string
& db_name
, const std::string
& cf_name
,
28 const std::string
& file_path
, int job_id
, TableFileCreationReason reason
) {
29 TableFileCreationBriefInfo info
;
30 info
.db_name
= db_name
;
31 info
.cf_name
= cf_name
;
32 info
.file_path
= file_path
;
35 for (auto& listener
: listeners
) {
36 listener
->OnTableFileCreationStarted(info
);
39 #endif // !ROCKSDB_LITE
41 void EventHelpers::NotifyOnBackgroundError(
42 const std::vector
<std::shared_ptr
<EventListener
>>& listeners
,
43 BackgroundErrorReason reason
, Status
* bg_error
, InstrumentedMutex
* db_mutex
,
44 bool* auto_recovery
) {
46 if (listeners
.size() == 0U) {
49 db_mutex
->AssertHeld();
50 // release lock while notifying events
52 for (auto& listener
: listeners
) {
53 listener
->OnBackgroundError(reason
, bg_error
);
54 bg_error
->PermitUncheckedError();
56 listener
->OnErrorRecoveryBegin(reason
, *bg_error
, auto_recovery
);
66 #endif // ROCKSDB_LITE
69 void EventHelpers::LogAndNotifyTableFileCreationFinished(
70 EventLogger
* event_logger
,
71 const std::vector
<std::shared_ptr
<EventListener
>>& listeners
,
72 const std::string
& db_name
, const std::string
& cf_name
,
73 const std::string
& file_path
, int job_id
, const FileDescriptor
& fd
,
74 uint64_t oldest_blob_file_number
, const TableProperties
& table_properties
,
75 TableFileCreationReason reason
, const Status
& s
,
76 const std::string
& file_checksum
,
77 const std::string
& file_checksum_func_name
) {
78 if (s
.ok() && event_logger
) {
80 AppendCurrentTime(&jwriter
);
81 jwriter
<< "cf_name" << cf_name
<< "job" << job_id
<< "event"
82 << "table_file_creation"
83 << "file_number" << fd
.GetNumber() << "file_size"
84 << fd
.GetFileSize() << "file_checksum" << file_checksum
85 << "file_checksum_func_name" << file_checksum_func_name
;
89 jwriter
<< "table_properties";
90 jwriter
.StartObject();
93 jwriter
<< "data_size" << table_properties
.data_size
<< "index_size"
94 << table_properties
.index_size
<< "index_partitions"
95 << table_properties
.index_partitions
<< "top_level_index_size"
96 << table_properties
.top_level_index_size
97 << "index_key_is_user_key"
98 << table_properties
.index_key_is_user_key
99 << "index_value_is_delta_encoded"
100 << table_properties
.index_value_is_delta_encoded
<< "filter_size"
101 << table_properties
.filter_size
<< "raw_key_size"
102 << table_properties
.raw_key_size
<< "raw_average_key_size"
103 << SafeDivide(table_properties
.raw_key_size
,
104 table_properties
.num_entries
)
105 << "raw_value_size" << table_properties
.raw_value_size
106 << "raw_average_value_size"
107 << SafeDivide(table_properties
.raw_value_size
,
108 table_properties
.num_entries
)
109 << "num_data_blocks" << table_properties
.num_data_blocks
110 << "num_entries" << table_properties
.num_entries
111 << "num_deletions" << table_properties
.num_deletions
112 << "num_merge_operands" << table_properties
.num_merge_operands
113 << "num_range_deletions" << table_properties
.num_range_deletions
114 << "format_version" << table_properties
.format_version
115 << "fixed_key_len" << table_properties
.fixed_key_len
116 << "filter_policy" << table_properties
.filter_policy_name
117 << "column_family_name" << table_properties
.column_family_name
118 << "column_family_id" << table_properties
.column_family_id
119 << "comparator" << table_properties
.comparator_name
120 << "merge_operator" << table_properties
.merge_operator_name
121 << "prefix_extractor_name"
122 << table_properties
.prefix_extractor_name
<< "property_collectors"
123 << table_properties
.property_collectors_names
<< "compression"
124 << table_properties
.compression_name
<< "compression_options"
125 << table_properties
.compression_options
<< "creation_time"
126 << table_properties
.creation_time
<< "oldest_key_time"
127 << table_properties
.oldest_key_time
<< "file_creation_time"
128 << table_properties
.file_creation_time
<< "db_id"
129 << table_properties
.db_id
<< "db_session_id"
130 << table_properties
.db_session_id
;
132 // user collected properties
133 for (const auto& prop
: table_properties
.readable_properties
) {
134 jwriter
<< prop
.first
<< prop
.second
;
139 if (oldest_blob_file_number
!= kInvalidBlobFileNumber
) {
140 jwriter
<< "oldest_blob_file_number" << oldest_blob_file_number
;
145 event_logger
->Log(jwriter
);
149 if (listeners
.size() == 0) {
152 TableFileCreationInfo info
;
153 info
.db_name
= db_name
;
154 info
.cf_name
= cf_name
;
155 info
.file_path
= file_path
;
156 info
.file_size
= fd
.file_size
;
157 info
.job_id
= job_id
;
158 info
.table_properties
= table_properties
;
159 info
.reason
= reason
;
161 info
.file_checksum
= file_checksum
;
162 info
.file_checksum_func_name
= file_checksum_func_name
;
163 for (auto& listener
: listeners
) {
164 listener
->OnTableFileCreated(info
);
166 info
.status
.PermitUncheckedError();
173 #endif // !ROCKSDB_LITE
176 void EventHelpers::LogAndNotifyTableFileDeletion(
177 EventLogger
* event_logger
, int job_id
, uint64_t file_number
,
178 const std::string
& file_path
, const Status
& status
,
179 const std::string
& dbname
,
180 const std::vector
<std::shared_ptr
<EventListener
>>& listeners
) {
182 AppendCurrentTime(&jwriter
);
184 jwriter
<< "job" << job_id
<< "event"
185 << "table_file_deletion"
186 << "file_number" << file_number
;
188 jwriter
<< "status" << status
.ToString();
193 event_logger
->Log(jwriter
);
196 TableFileDeletionInfo info
;
197 info
.db_name
= dbname
;
198 info
.job_id
= job_id
;
199 info
.file_path
= file_path
;
200 info
.status
= status
;
201 for (auto& listener
: listeners
) {
202 listener
->OnTableFileDeleted(info
);
204 info
.status
.PermitUncheckedError();
209 #endif // !ROCKSDB_LITE
212 void EventHelpers::NotifyOnErrorRecoveryCompleted(
213 const std::vector
<std::shared_ptr
<EventListener
>>& listeners
,
214 Status old_bg_error
, InstrumentedMutex
* db_mutex
) {
216 if (listeners
.size() == 0U) {
219 db_mutex
->AssertHeld();
220 // release lock while notifying events
222 for (auto& listener
: listeners
) {
223 listener
->OnErrorRecoveryCompleted(old_bg_error
);
225 old_bg_error
.PermitUncheckedError();
231 #endif // ROCKSDB_LITE
234 } // namespace ROCKSDB_NAMESPACE