couchbase 3.1.1-universal-darwin-20 → 3.2.0-universal-darwin-20

Sign up to get free protection for your applications and to get access to all the features.
Files changed (221) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +2 -2
  3. data/ext/CMakeLists.txt +3 -1
  4. data/ext/build_version.hxx.in +1 -1
  5. data/ext/cmake/Testing.cmake +1 -0
  6. data/ext/cmake/ThirdPartyDependencies.cmake +6 -0
  7. data/ext/cmake/VersionInfo.cmake +3 -0
  8. data/ext/couchbase/bucket.hxx +47 -28
  9. data/ext/couchbase/cbsasl/client.h +1 -1
  10. data/ext/couchbase/cbsasl/context.cc +1 -1
  11. data/ext/couchbase/cbsasl/context.h +3 -3
  12. data/ext/couchbase/cbsasl/mechanism.cc +5 -8
  13. data/ext/couchbase/cbsasl/mechanism.h +1 -4
  14. data/ext/couchbase/cbsasl/plain/plain.cc +1 -1
  15. data/ext/couchbase/cbsasl/scram-sha/scram-sha.cc +30 -36
  16. data/ext/couchbase/cluster.hxx +40 -22
  17. data/ext/couchbase/cluster_options.hxx +7 -1
  18. data/ext/couchbase/configuration.hxx +37 -16
  19. data/ext/couchbase/couchbase.cxx +1145 -291
  20. data/ext/couchbase/error_map.hxx +1 -1
  21. data/ext/couchbase/errors.hxx +25 -17
  22. data/ext/couchbase/io/dns_client.hxx +3 -3
  23. data/ext/couchbase/io/dns_codec.hxx +4 -5
  24. data/ext/couchbase/io/dns_config.hxx +5 -6
  25. data/ext/couchbase/io/dns_message.hxx +3 -3
  26. data/ext/couchbase/io/http_command.hxx +70 -35
  27. data/ext/couchbase/io/http_session.hxx +4 -3
  28. data/ext/couchbase/io/http_session_manager.hxx +28 -19
  29. data/ext/couchbase/io/mcbp_command.hxx +51 -19
  30. data/ext/couchbase/io/mcbp_context.hxx +1 -1
  31. data/ext/couchbase/io/mcbp_parser.hxx +4 -4
  32. data/ext/couchbase/io/mcbp_session.hxx +91 -101
  33. data/ext/couchbase/io/query_cache.hxx +2 -2
  34. data/ext/couchbase/io/retry_orchestrator.hxx +2 -4
  35. data/ext/couchbase/io/retry_reason.hxx +2 -2
  36. data/ext/couchbase/io/retry_strategy.hxx +1 -6
  37. data/ext/couchbase/io/streams.hxx +7 -7
  38. data/ext/couchbase/metrics/logging_meter.hxx +228 -0
  39. data/ext/couchbase/metrics/logging_meter_options.hxx +28 -0
  40. data/ext/couchbase/metrics/meter.hxx +49 -0
  41. data/ext/couchbase/metrics/noop_meter.hxx +43 -0
  42. data/ext/couchbase/operations.hxx +4 -0
  43. data/ext/couchbase/operations/analytics_dataset_create.hxx +16 -12
  44. data/ext/couchbase/operations/analytics_dataset_drop.hxx +11 -11
  45. data/ext/couchbase/operations/analytics_dataset_get_all.hxx +6 -6
  46. data/ext/couchbase/operations/analytics_dataverse_create.hxx +10 -11
  47. data/ext/couchbase/operations/analytics_dataverse_drop.hxx +10 -11
  48. data/ext/couchbase/operations/analytics_get_pending_mutations.hxx +9 -11
  49. data/ext/couchbase/operations/analytics_index_create.hxx +14 -13
  50. data/ext/couchbase/operations/analytics_index_drop.hxx +18 -12
  51. data/ext/couchbase/operations/analytics_index_get_all.hxx +8 -6
  52. data/ext/couchbase/operations/analytics_link.hxx +39 -0
  53. data/ext/couchbase/operations/analytics_link_azure_blob_external.hxx +145 -0
  54. data/ext/couchbase/operations/analytics_link_connect.hxx +14 -12
  55. data/ext/couchbase/operations/analytics_link_couchbase_remote.hxx +220 -0
  56. data/ext/couchbase/operations/analytics_link_create.hxx +128 -0
  57. data/ext/couchbase/operations/analytics_link_disconnect.hxx +11 -12
  58. data/ext/couchbase/operations/analytics_link_drop.hxx +130 -0
  59. data/ext/couchbase/operations/analytics_link_get_all.hxx +160 -0
  60. data/ext/couchbase/operations/analytics_link_replace.hxx +128 -0
  61. data/ext/couchbase/operations/analytics_link_s3_external.hxx +122 -0
  62. data/ext/couchbase/operations/bucket_create.hxx +8 -8
  63. data/ext/couchbase/operations/bucket_drop.hxx +5 -5
  64. data/ext/couchbase/operations/bucket_flush.hxx +5 -5
  65. data/ext/couchbase/operations/bucket_get.hxx +7 -7
  66. data/ext/couchbase/operations/bucket_get_all.hxx +7 -5
  67. data/ext/couchbase/operations/bucket_settings.hxx +40 -49
  68. data/ext/couchbase/operations/bucket_update.hxx +8 -8
  69. data/ext/couchbase/operations/cluster_developer_preview_enable.hxx +7 -7
  70. data/ext/couchbase/operations/collection_create.hxx +11 -11
  71. data/ext/couchbase/operations/collection_drop.hxx +12 -10
  72. data/ext/couchbase/operations/collections_manifest_get.hxx +3 -3
  73. data/ext/couchbase/operations/design_document.hxx +2 -2
  74. data/ext/couchbase/operations/document_analytics.hxx +29 -36
  75. data/ext/couchbase/operations/document_append.hxx +3 -3
  76. data/ext/couchbase/operations/document_decrement.hxx +3 -3
  77. data/ext/couchbase/operations/document_exists.hxx +2 -2
  78. data/ext/couchbase/operations/document_get.hxx +3 -3
  79. data/ext/couchbase/operations/document_get_and_lock.hxx +5 -3
  80. data/ext/couchbase/operations/document_get_and_touch.hxx +5 -3
  81. data/ext/couchbase/operations/document_get_projected.hxx +10 -11
  82. data/ext/couchbase/operations/document_increment.hxx +3 -3
  83. data/ext/couchbase/operations/document_insert.hxx +3 -3
  84. data/ext/couchbase/operations/document_lookup_in.hxx +12 -18
  85. data/ext/couchbase/operations/document_mutate_in.hxx +13 -18
  86. data/ext/couchbase/operations/document_prepend.hxx +3 -3
  87. data/ext/couchbase/operations/document_query.hxx +39 -41
  88. data/ext/couchbase/operations/document_remove.hxx +3 -3
  89. data/ext/couchbase/operations/document_replace.hxx +3 -3
  90. data/ext/couchbase/operations/document_search.hxx +56 -61
  91. data/ext/couchbase/operations/document_touch.hxx +3 -3
  92. data/ext/couchbase/operations/document_unlock.hxx +3 -3
  93. data/ext/couchbase/operations/document_upsert.hxx +3 -3
  94. data/ext/couchbase/operations/document_view.hxx +23 -23
  95. data/ext/couchbase/operations/group_drop.hxx +5 -5
  96. data/ext/couchbase/operations/group_get.hxx +7 -7
  97. data/ext/couchbase/operations/group_get_all.hxx +6 -6
  98. data/ext/couchbase/operations/group_upsert.hxx +11 -11
  99. data/ext/couchbase/operations/http_noop.hxx +6 -6
  100. data/ext/couchbase/operations/mcbp_noop.hxx +3 -3
  101. data/ext/couchbase/operations/query_index_build_deferred.hxx +6 -6
  102. data/ext/couchbase/operations/query_index_create.hxx +10 -8
  103. data/ext/couchbase/operations/query_index_drop.hxx +8 -8
  104. data/ext/couchbase/operations/query_index_get_all.hxx +43 -39
  105. data/ext/couchbase/operations/rbac.hxx +40 -63
  106. data/ext/couchbase/operations/role_get_all.hxx +6 -6
  107. data/ext/couchbase/operations/scope_create.hxx +10 -10
  108. data/ext/couchbase/operations/scope_drop.hxx +9 -9
  109. data/ext/couchbase/operations/scope_get_all.hxx +8 -8
  110. data/ext/couchbase/operations/search_get_stats.hxx +5 -3
  111. data/ext/couchbase/operations/search_index.hxx +6 -15
  112. data/ext/couchbase/operations/search_index_analyze_document.hxx +11 -11
  113. data/ext/couchbase/operations/search_index_control_ingest.hxx +9 -9
  114. data/ext/couchbase/operations/search_index_control_plan_freeze.hxx +9 -9
  115. data/ext/couchbase/operations/search_index_control_query.hxx +9 -9
  116. data/ext/couchbase/operations/search_index_drop.hxx +11 -9
  117. data/ext/couchbase/operations/search_index_get.hxx +11 -9
  118. data/ext/couchbase/operations/search_index_get_all.hxx +11 -11
  119. data/ext/couchbase/operations/search_index_get_documents_count.hxx +10 -10
  120. data/ext/couchbase/operations/search_index_get_stats.hxx +10 -8
  121. data/ext/couchbase/operations/search_index_upsert.hxx +12 -10
  122. data/ext/couchbase/operations/user_drop.hxx +5 -5
  123. data/ext/couchbase/operations/user_get.hxx +7 -7
  124. data/ext/couchbase/operations/user_get_all.hxx +6 -6
  125. data/ext/couchbase/operations/user_upsert.hxx +9 -9
  126. data/ext/couchbase/operations/view_index_drop.hxx +10 -10
  127. data/ext/couchbase/operations/view_index_get.hxx +13 -15
  128. data/ext/couchbase/operations/view_index_get_all.hxx +17 -20
  129. data/ext/couchbase/operations/view_index_upsert.hxx +9 -7
  130. data/ext/couchbase/origin.hxx +14 -10
  131. data/ext/couchbase/platform/backtrace.c +1 -1
  132. data/ext/couchbase/platform/base64.cc +5 -5
  133. data/ext/couchbase/platform/base64.h +2 -5
  134. data/ext/couchbase/protocol/client_opcode.hxx +7 -4
  135. data/ext/couchbase/protocol/client_request.hxx +2 -2
  136. data/ext/couchbase/protocol/client_response.hxx +41 -16
  137. data/ext/couchbase/protocol/cmd_append.hxx +17 -16
  138. data/ext/couchbase/protocol/cmd_cluster_map_change_notification.hxx +4 -4
  139. data/ext/couchbase/protocol/cmd_decrement.hxx +10 -11
  140. data/ext/couchbase/protocol/cmd_exists.hxx +12 -15
  141. data/ext/couchbase/protocol/cmd_get.hxx +11 -14
  142. data/ext/couchbase/protocol/cmd_get_and_lock.hxx +10 -12
  143. data/ext/couchbase/protocol/cmd_get_and_touch.hxx +10 -12
  144. data/ext/couchbase/protocol/cmd_get_cluster_config.hxx +13 -18
  145. data/ext/couchbase/protocol/cmd_get_collection_id.hxx +12 -15
  146. data/ext/couchbase/protocol/cmd_get_collections_manifest.hxx +12 -16
  147. data/ext/couchbase/protocol/cmd_get_error_map.hxx +14 -17
  148. data/ext/couchbase/protocol/cmd_hello.hxx +8 -10
  149. data/ext/couchbase/protocol/cmd_increment.hxx +9 -10
  150. data/ext/couchbase/protocol/cmd_insert.hxx +9 -9
  151. data/ext/couchbase/protocol/cmd_lookup_in.hxx +12 -13
  152. data/ext/couchbase/protocol/cmd_mutate_in.hxx +11 -11
  153. data/ext/couchbase/protocol/cmd_noop.hxx +16 -20
  154. data/ext/couchbase/protocol/cmd_prepend.hxx +9 -10
  155. data/ext/couchbase/protocol/cmd_remove.hxx +10 -13
  156. data/ext/couchbase/protocol/cmd_replace.hxx +7 -7
  157. data/ext/couchbase/protocol/cmd_sasl_auth.hxx +8 -10
  158. data/ext/couchbase/protocol/cmd_sasl_list_mechs.hxx +10 -15
  159. data/ext/couchbase/protocol/cmd_sasl_step.hxx +10 -12
  160. data/ext/couchbase/protocol/cmd_select_bucket.hxx +14 -18
  161. data/ext/couchbase/protocol/cmd_touch.hxx +8 -11
  162. data/ext/couchbase/protocol/cmd_unlock.hxx +10 -14
  163. data/ext/couchbase/protocol/cmd_upsert.hxx +8 -8
  164. data/ext/couchbase/protocol/datatype.hxx +3 -3
  165. data/ext/couchbase/protocol/durability_level.hxx +2 -2
  166. data/ext/couchbase/protocol/frame_info_id.hxx +4 -4
  167. data/ext/couchbase/protocol/hello_feature.hxx +2 -2
  168. data/ext/couchbase/protocol/magic.hxx +2 -2
  169. data/ext/couchbase/protocol/server_opcode.hxx +2 -2
  170. data/ext/couchbase/protocol/server_request.hxx +1 -1
  171. data/ext/couchbase/protocol/status.hxx +4 -7
  172. data/ext/couchbase/protocol/unsigned_leb128.h +5 -20
  173. data/ext/couchbase/service_type.hxx +4 -4
  174. data/ext/couchbase/tracing/constants.hxx +261 -0
  175. data/ext/couchbase/tracing/noop_tracer.hxx +50 -0
  176. data/ext/couchbase/tracing/request_tracer.hxx +77 -0
  177. data/ext/couchbase/tracing/threshold_logging_options.hxx +64 -0
  178. data/ext/couchbase/tracing/threshold_logging_tracer.hxx +366 -0
  179. data/ext/couchbase/utils/byteswap.hxx +1 -1
  180. data/ext/couchbase/utils/connection_string.hxx +21 -1
  181. data/ext/couchbase/utils/name_codec.hxx +41 -0
  182. data/ext/couchbase/utils/url_codec.hxx +236 -0
  183. data/ext/couchbase/version.hxx +1 -1
  184. data/ext/test/CMakeLists.txt +1 -0
  185. data/ext/test/test_native_trivial_query.cxx +60 -0
  186. data/ext/third_party/hdr_histogram_c/CMakeLists.txt +84 -0
  187. data/ext/third_party/hdr_histogram_c/COPYING.txt +121 -0
  188. data/ext/third_party/hdr_histogram_c/LICENSE.txt +41 -0
  189. data/ext/third_party/hdr_histogram_c/config.cmake.in +6 -0
  190. data/ext/third_party/hdr_histogram_c/src/CMakeLists.txt +83 -0
  191. data/ext/third_party/hdr_histogram_c/src/hdr_atomic.h +146 -0
  192. data/ext/third_party/hdr_histogram_c/src/hdr_encoding.c +322 -0
  193. data/ext/third_party/hdr_histogram_c/src/hdr_encoding.h +79 -0
  194. data/ext/third_party/hdr_histogram_c/src/hdr_endian.h +116 -0
  195. data/ext/third_party/hdr_histogram_c/src/hdr_histogram.c +1196 -0
  196. data/ext/third_party/hdr_histogram_c/src/hdr_histogram.h +516 -0
  197. data/ext/third_party/hdr_histogram_c/src/hdr_histogram_log.c +1290 -0
  198. data/ext/third_party/hdr_histogram_c/src/hdr_histogram_log.h +236 -0
  199. data/ext/third_party/hdr_histogram_c/src/hdr_histogram_log_no_op.c +171 -0
  200. data/ext/third_party/hdr_histogram_c/src/hdr_interval_recorder.c +227 -0
  201. data/ext/third_party/hdr_histogram_c/src/hdr_interval_recorder.h +109 -0
  202. data/ext/third_party/hdr_histogram_c/src/hdr_malloc.h +19 -0
  203. data/ext/third_party/hdr_histogram_c/src/hdr_tests.h +22 -0
  204. data/ext/third_party/hdr_histogram_c/src/hdr_thread.c +108 -0
  205. data/ext/third_party/hdr_histogram_c/src/hdr_thread.h +55 -0
  206. data/ext/third_party/hdr_histogram_c/src/hdr_time.c +98 -0
  207. data/ext/third_party/hdr_histogram_c/src/hdr_time.h +49 -0
  208. data/ext/third_party/hdr_histogram_c/src/hdr_writer_reader_phaser.c +143 -0
  209. data/ext/third_party/hdr_histogram_c/src/hdr_writer_reader_phaser.h +51 -0
  210. data/lib/couchbase/cluster.rb +1 -0
  211. data/lib/couchbase/errors.rb +3 -0
  212. data/lib/couchbase/libcouchbase.bundle +0 -0
  213. data/lib/couchbase/management/analytics_index_manager.rb +920 -226
  214. data/lib/couchbase/management/bucket_manager.rb +207 -69
  215. data/lib/couchbase/management/collection_manager.rb +173 -61
  216. data/lib/couchbase/management/query_index_manager.rb +357 -169
  217. data/lib/couchbase/options.rb +75 -3
  218. data/lib/couchbase/scope.rb +102 -0
  219. data/lib/couchbase/utils/time.rb +4 -0
  220. data/lib/couchbase/version.rb +6 -6
  221. metadata +48 -5
@@ -0,0 +1,236 @@
1
+ /**
2
+ * hdr_histogram_log.h
3
+ * Written by Michael Barker and released to the public domain,
4
+ * as explained at http://creativecommons.org/publicdomain/zero/1.0/
5
+ *
6
+ * The implementation makes use of zlib to provide compression. You will need
7
+ * to link against -lz in order to link applications that include this header.
8
+ */
9
+
10
+ #ifndef HDR_HISTOGRAM_H_LOG
11
+ #define HDR_HISTOGRAM_H_LOG 1
12
+
13
+ #define HDR_COMPRESSION_COOKIE_MISMATCH -29999
14
+ #define HDR_ENCODING_COOKIE_MISMATCH -29998
15
+ #define HDR_DEFLATE_INIT_FAIL -29997
16
+ #define HDR_DEFLATE_FAIL -29996
17
+ #define HDR_INFLATE_INIT_FAIL -29995
18
+ #define HDR_INFLATE_FAIL -29994
19
+ #define HDR_LOG_INVALID_VERSION -29993
20
+ #define HDR_TRAILING_ZEROS_INVALID -29992
21
+ #define HDR_VALUE_TRUNCATED -29991
22
+ #define HDR_ENCODED_INPUT_TOO_LONG -29990
23
+
24
+ #define HDR_LOG_TAG_MAX_BUFFER_LEN (1024)
25
+
26
+ #include <stdint.h>
27
+ #include <stdbool.h>
28
+ #include <stdio.h>
29
+
30
+ #include "hdr_time.h"
31
+ #include "hdr_histogram.h"
32
+
33
+ #ifdef __cplusplus
34
+ extern "C" {
35
+ #endif
36
+
37
+ /**
38
+ * Encode and compress the histogram with gzip.
39
+ */
40
+ int hdr_log_encode(struct hdr_histogram* histogram, char** encoded_histogram);
41
+
42
+ /**
43
+ * Decode and decompress the histogram with gzip.
44
+ */
45
+ int hdr_log_decode(struct hdr_histogram** histogram, char* base64_histogram, size_t base64_len);
46
+
47
+ struct hdr_log_entry
48
+ {
49
+ hdr_timespec start_timestamp;
50
+ hdr_timespec interval;
51
+ hdr_timespec max;
52
+ char *tag;
53
+ size_t tag_len;
54
+ };
55
+
56
+ struct hdr_log_writer
57
+ {
58
+ uint32_t nonce;
59
+ };
60
+
61
+ /**
62
+ * Initialise the log writer.
63
+ *
64
+ * @param writer 'This' pointer
65
+ * @return 0 on success.
66
+ */
67
+ int hdr_log_writer_init(struct hdr_log_writer* writer);
68
+
69
+ /**
70
+ * Write the header to the log, this will constist of a user defined string,
71
+ * the current timestamp, version information and the CSV header.
72
+ *
73
+ * @param writer 'This' pointer
74
+ * @param file The stream to output the log header to.
75
+ * @param user_prefix User defined string to include in the header.
76
+ * @param timestamp The start time that the histogram started recording from.
77
+ * @return Will return 0 if it successfully completed or an error number if there
78
+ * was a failure. EIO if the write failed.
79
+ */
80
+ int hdr_log_write_header(
81
+ struct hdr_log_writer* writer,
82
+ FILE* file,
83
+ const char* user_prefix,
84
+ hdr_timespec* timestamp);
85
+
86
+ /**
87
+ * Write an hdr_histogram entry to the log. It will be encoded in a similar
88
+ * fashion to the approach used by the Java version of the HdrHistogram. It will
89
+ * be a CSV line consisting of <start timestamp>,<end timestamp>,<max>,<histogram>
90
+ * where <histogram> is the binary histogram gzip compressed and base64 encoded.
91
+ *
92
+ * Timestamp is a bit of misnomer for the start_timestamp and end_timestamp values
93
+ * these could be offsets, e.g. start_timestamp could be offset from process start
94
+ * time and end_timestamp could actually be the length of the recorded interval.
95
+ *
96
+ * @param writer 'This' pointer
97
+ * @param file The stream to write the entry to.
98
+ * @param start_timestamp The start timestamp to include in the logged entry.
99
+ * @param end_timestamp The end timestamp to include in the logged entry.
100
+ * @param histogram The histogram to encode and log.
101
+ * @return Will return 0 if it successfully completed or an error number if there
102
+ * was a failure. Errors include HDR_DEFLATE_INIT_FAIL, HDR_DEFLATE_FAIL if
103
+ * something when wrong during gzip compression. ENOMEM if we failed to allocate
104
+ * or reallocate the buffer used for encoding (out of memory problem). EIO if
105
+ * write failed.
106
+ */
107
+ int hdr_log_write(
108
+ struct hdr_log_writer* writer,
109
+ FILE* file,
110
+ const hdr_timespec* start_timestamp,
111
+ const hdr_timespec* end_timestamp,
112
+ struct hdr_histogram* histogram);
113
+
114
+ /**
115
+ * Write an hdr_histogram entry to the log. It will be encoded in a similar
116
+ * fashion to the approach used by the Java version of the HdrHistogram. It will
117
+ * be a CSV line consisting of [Tag=XXX,]<start timestamp>,<end timestamp>,<max>,<histogram>
118
+ * where <histogram> is the binary histogram gzip compressed and base64 encoded.
119
+ *
120
+ * The tag is option and will only be written if the tag is non-NULL and the tag_len is
121
+ * greater than 0.
122
+ *
123
+ * Timestamp is a bit of misnomer for the start_timestamp and end_timestamp values
124
+ * these could be offsets, e.g. start_timestamp could be offset from process start
125
+ * time and end_timestamp could actually be the length of the recorded interval.
126
+ *
127
+ * @param writer 'This' pointer
128
+ * @param file The stream to write the entry to.
129
+ * @param entry Prefix information for the log line, including timestamps and tag.
130
+ * @param histogram The histogram to encode and log.
131
+ * @return Will return 0 if it successfully completed or an error number if there
132
+ * was a failure. Errors include HDR_DEFLATE_INIT_FAIL, HDR_DEFLATE_FAIL if
133
+ * something when wrong during gzip compression. ENOMEM if we failed to allocate
134
+ * or reallocate the buffer used for encoding (out of memory problem). EIO if
135
+ * write failed.
136
+ */
137
+ int hdr_log_write_entry(
138
+ struct hdr_log_writer* writer,
139
+ FILE* file,
140
+ struct hdr_log_entry* entry,
141
+ struct hdr_histogram* histogram);
142
+
143
+ struct hdr_log_reader
144
+ {
145
+ int major_version;
146
+ int minor_version;
147
+ hdr_timespec start_timestamp;
148
+ };
149
+
150
+ /**
151
+ * Initialise the log reader.
152
+ *
153
+ * @param reader 'This' pointer
154
+ * @return 0 on success
155
+ */
156
+ int hdr_log_reader_init(struct hdr_log_reader* reader);
157
+
158
+ /**
159
+ * Reads the the header information from the log. Will capure information
160
+ * such as version number and start timestamp from the header.
161
+ *
162
+ * @param hdr_log_reader 'This' pointer
163
+ * @param file The data stream to read from.
164
+ * @return 0 on success. An error number on failure.
165
+ */
166
+ int hdr_log_read_header(struct hdr_log_reader* reader, FILE* file);
167
+
168
+ /**
169
+ * Reads an entry from the log filling in the specified histogram, timestamp and
170
+ * interval values. If the supplied pointer to the histogram for this method is
171
+ * NULL then a new histogram will be allocated for the caller, however it will
172
+ * become the callers responsibility to free it later. If the pointer is non-null
173
+ * the histogram read from the log will be merged with the supplied histogram.
174
+ *
175
+ * @param reader 'This' pointer
176
+ * @param file The stream to read the histogram from.
177
+ * @param histogram Pointer to allocate a histogram to or merge into.
178
+ * @param timestamp The first timestamp from the CSV entry.
179
+ * @param interval The second timestamp from the CSV entry
180
+ * @return Will return 0 on success or an error number if there was some wrong
181
+ * when reading in the histogram. EOF (-1) will indicate that there are no more
182
+ * histograms left to be read from 'file'.
183
+ * HDR_INFLATE_INIT_FAIL or HDR_INFLATE_FAIL if
184
+ * there was a problem with Gzip. HDR_COMPRESSION_COOKIE_MISMATCH or
185
+ * HDR_ENCODING_COOKIE_MISMATCH if the cookie values are incorrect.
186
+ * HDR_LOG_INVALID_VERSION if the log can not be parsed. ENOMEM if buffer space
187
+ * or the histogram can not be allocated. EIO if there was an error during
188
+ * the read. EINVAL in any input values are incorrect.
189
+ */
190
+ int hdr_log_read(
191
+ struct hdr_log_reader* reader, FILE* file, struct hdr_histogram** histogram,
192
+ hdr_timespec* timestamp, hdr_timespec* interval);
193
+
194
+ /**
195
+ * Reads an entry from the log filling in the specified histogram and log entry struct.
196
+ * If the supplied pointer to the histogram for this method is
197
+ * NULL then a new histogram will be allocated for the caller, however it will
198
+ * become the callers responsibility to free it later. If the pointer is non-null
199
+ * the histogram read from the log will be merged with the supplied histogram.
200
+ * The entry struct contains a pointer to a buffer to load the tag into. If this
201
+ * is NULL or the tag_len is 0 then it won't store the tag there. The tag value will be
202
+ * NULL-terminated if there available space in the supplied buffer. If the tag is larger
203
+ * than the supplied buffer then it will be truncated. If the caller sets the last element
204
+ * in the buffer to '\0' before calling this function and it is not '\0' after the function
205
+ * returns then the value has been truncated.
206
+ *
207
+ * @param reader 'This' pointer
208
+ * @param file The stream to read the histogram from.
209
+ * @param entry Contains all of the information from the log line that is not the histogram.
210
+ * @param histogram Pointer to allocate a histogram to or merge into.
211
+ * @return Will return 0 on success or an error number if there was some wrong
212
+ * when reading in the histogram. EOF (-1) will indicate that there are no more
213
+ * histograms left to be read from 'file'.
214
+ * HDR_INFLATE_INIT_FAIL or HDR_INFLATE_FAIL if
215
+ * there was a problem with Gzip. HDR_COMPRESSION_COOKIE_MISMATCH or
216
+ * HDR_ENCODING_COOKIE_MISMATCH if the cookie values are incorrect.
217
+ * HDR_LOG_INVALID_VERSION if the log can not be parsed. ENOMEM if buffer space
218
+ * or the histogram can not be allocated. EIO if there was an error during
219
+ * the read. EINVAL in any input values are incorrect.
220
+ */
221
+ int hdr_log_read_entry(
222
+ struct hdr_log_reader* reader, FILE* file, struct hdr_log_entry *entry, struct hdr_histogram** histogram);
223
+
224
+ /**
225
+ * Returns a string representation of the error number.
226
+ *
227
+ * @param errnum The error response from a previous call.
228
+ * @return The user readable representation of the error.
229
+ */
230
+ const char* hdr_strerror(int errnum);
231
+
232
+ #ifdef __cplusplus
233
+ }
234
+ #endif
235
+
236
+ #endif
@@ -0,0 +1,171 @@
1
+ /**
2
+ * hdr_histogram_log.c
3
+ * Written by Michael Barker and released to the public domain,
4
+ * as explained at http://creativecommons.org/publicdomain/zero/1.0/
5
+ */
6
+
7
+ #include <stdint.h>
8
+ #include <stdio.h>
9
+ #include <string.h>
10
+
11
+ #include "hdr_histogram.h"
12
+ #include "hdr_histogram_log.h"
13
+ #include "hdr_tests.h"
14
+
15
+ #define UNUSED(x) (void)(x)
16
+
17
+ const char* hdr_strerror(int errnum)
18
+ {
19
+ switch (errnum)
20
+ {
21
+ case HDR_COMPRESSION_COOKIE_MISMATCH:
22
+ return "Compression cookie mismatch";
23
+ case HDR_ENCODING_COOKIE_MISMATCH:
24
+ return "Encoding cookie mismatch";
25
+ case HDR_DEFLATE_INIT_FAIL:
26
+ return "Deflate initialisation failed";
27
+ case HDR_DEFLATE_FAIL:
28
+ return "Deflate failed";
29
+ case HDR_INFLATE_INIT_FAIL:
30
+ return "Inflate initialisation failed";
31
+ case HDR_INFLATE_FAIL:
32
+ return "Inflate failed";
33
+ case HDR_LOG_INVALID_VERSION:
34
+ return "Log - invalid version in log header";
35
+ case HDR_TRAILING_ZEROS_INVALID:
36
+ return "Invalid number of trailing zeros";
37
+ case HDR_VALUE_TRUNCATED:
38
+ return "Truncated value found when decoding";
39
+ case HDR_ENCODED_INPUT_TOO_LONG:
40
+ return "The encoded input exceeds the size of the histogram";
41
+ default:
42
+ return strerror(errnum);
43
+ }
44
+ }
45
+
46
+ int hdr_encode_compressed(
47
+ struct hdr_histogram* h,
48
+ uint8_t** compressed_histogram,
49
+ size_t* compressed_len)
50
+ {
51
+ UNUSED(h);
52
+ UNUSED(compressed_histogram);
53
+ UNUSED(compressed_len);
54
+
55
+ return -1;
56
+ }
57
+
58
+ int hdr_decode_compressed(
59
+ uint8_t* buffer, size_t length, struct hdr_histogram** histogram)
60
+ {
61
+ UNUSED(buffer);
62
+ UNUSED(length);
63
+ UNUSED(histogram);
64
+
65
+ return -1;
66
+ }
67
+
68
+ int hdr_log_writer_init(struct hdr_log_writer* writer)
69
+ {
70
+ UNUSED(writer);
71
+
72
+ return -1;
73
+ }
74
+
75
+ int hdr_log_write_header(
76
+ struct hdr_log_writer* writer, FILE* file,
77
+ const char* user_prefix, hdr_timespec* timestamp)
78
+ {
79
+ UNUSED(writer);
80
+ UNUSED(file);
81
+ UNUSED(user_prefix);
82
+ UNUSED(timestamp);
83
+
84
+ return -1;
85
+ }
86
+
87
+ int hdr_log_write(
88
+ struct hdr_log_writer* writer,
89
+ FILE* file,
90
+ const hdr_timespec* start_timestamp,
91
+ const hdr_timespec* end_timestamp,
92
+ struct hdr_histogram* histogram)
93
+ {
94
+ UNUSED(writer);
95
+ UNUSED(file);
96
+ UNUSED(start_timestamp);
97
+ UNUSED(end_timestamp);
98
+ UNUSED(histogram);
99
+
100
+ return -1;
101
+ }
102
+
103
+ int hdr_log_write_entry(
104
+ struct hdr_log_writer* writer,
105
+ FILE* file,
106
+ struct hdr_log_entry* entry,
107
+ struct hdr_histogram* histogram)
108
+ {
109
+ UNUSED(writer);
110
+ UNUSED(file);
111
+ UNUSED(entry);
112
+ UNUSED(histogram);
113
+
114
+ return -1;
115
+ }
116
+
117
+ int hdr_log_reader_init(struct hdr_log_reader* reader)
118
+ {
119
+ UNUSED(reader);
120
+
121
+ return -1;
122
+ }
123
+
124
+ int hdr_log_read_header(struct hdr_log_reader* reader, FILE* file)
125
+ {
126
+ UNUSED(reader);
127
+ UNUSED(file);
128
+
129
+ return -1;
130
+ }
131
+
132
+ int hdr_log_read(
133
+ struct hdr_log_reader* reader, FILE* file, struct hdr_histogram** histogram,
134
+ hdr_timespec* timestamp, hdr_timespec* interval)
135
+ {
136
+ UNUSED(reader);
137
+ UNUSED(file);
138
+ UNUSED(histogram);
139
+ UNUSED(timestamp);
140
+ UNUSED(interval);
141
+
142
+ return -1;
143
+ }
144
+
145
+ int hdr_log_read_entry(
146
+ struct hdr_log_reader* reader, FILE* file, struct hdr_log_entry *entry, struct hdr_histogram** histogram)
147
+ {
148
+ UNUSED(reader);
149
+ UNUSED(file);
150
+ UNUSED(entry);
151
+ UNUSED(histogram);
152
+
153
+ return -1;
154
+ }
155
+
156
+ int hdr_log_encode(struct hdr_histogram* histogram, char** encoded_histogram)
157
+ {
158
+ UNUSED(histogram);
159
+ UNUSED(encoded_histogram);
160
+
161
+ return -1;
162
+ }
163
+
164
+ int hdr_log_decode(struct hdr_histogram** histogram, char* base64_histogram, size_t base64_len)
165
+ {
166
+ UNUSED(histogram);
167
+ UNUSED(base64_histogram);
168
+ UNUSED(base64_len);
169
+
170
+ return -1;
171
+ }
@@ -0,0 +1,227 @@
1
+ /**
2
+ * hdr_interval_recorder.h
3
+ * Written by Michael Barker and released to the public domain,
4
+ * as explained at http://creativecommons.org/publicdomain/zero/1.0/
5
+ */
6
+
7
+ #include "hdr_atomic.h"
8
+ #include "hdr_interval_recorder.h"
9
+
10
+ #ifndef HDR_MALLOC_INCLUDE
11
+ #define HDR_MALLOC_INCLUDE "hdr_malloc.h"
12
+ #endif
13
+
14
+ #include HDR_MALLOC_INCLUDE
15
+
16
+ int hdr_interval_recorder_init(struct hdr_interval_recorder* r)
17
+ {
18
+ r->active = r->inactive = NULL;
19
+ return hdr_writer_reader_phaser_init(&r->phaser);
20
+ }
21
+
22
+ int hdr_interval_recorder_init_all(
23
+ struct hdr_interval_recorder* r,
24
+ int64_t lowest_discernible_value,
25
+ int64_t highest_trackable_value,
26
+ int significant_figures)
27
+ {
28
+ int result;
29
+
30
+ r->active = r->inactive = NULL;
31
+ result = hdr_writer_reader_phaser_init(&r->phaser);
32
+ result = result == 0
33
+ ? hdr_init(lowest_discernible_value, highest_trackable_value, significant_figures, &r->active)
34
+ : result;
35
+
36
+ return result;
37
+ }
38
+
39
+ void hdr_interval_recorder_destroy(struct hdr_interval_recorder* r)
40
+ {
41
+ hdr_writer_reader_phaser_destroy(&r->phaser);
42
+ if (r->active) {
43
+ hdr_close(r->active);
44
+ }
45
+ if (r->inactive) {
46
+ hdr_close(r->inactive);
47
+ }
48
+ }
49
+
50
+ struct hdr_histogram* hdr_interval_recorder_sample_and_recycle(
51
+ struct hdr_interval_recorder* r,
52
+ struct hdr_histogram* histogram_to_recycle)
53
+ {
54
+ struct hdr_histogram* old_active;
55
+
56
+ if (NULL == histogram_to_recycle)
57
+ {
58
+ int64_t lo = r->active->lowest_discernible_value;
59
+ int64_t hi = r->active->highest_trackable_value;
60
+ int significant_figures = r->active->significant_figures;
61
+ hdr_init(lo, hi, significant_figures, &histogram_to_recycle);
62
+ }
63
+ else
64
+ {
65
+ hdr_reset(histogram_to_recycle);
66
+ }
67
+
68
+ hdr_phaser_reader_lock(&r->phaser);
69
+
70
+ /* volatile read */
71
+ old_active = hdr_atomic_load_pointer(&r->active);
72
+
73
+ /* volatile write */
74
+ hdr_atomic_store_pointer(&r->active, histogram_to_recycle);
75
+
76
+ hdr_phaser_flip_phase(&r->phaser, 0);
77
+
78
+ hdr_phaser_reader_unlock(&r->phaser);
79
+
80
+ return old_active;
81
+ }
82
+
83
+ struct hdr_histogram* hdr_interval_recorder_sample(struct hdr_interval_recorder* r)
84
+ {
85
+ r->inactive = hdr_interval_recorder_sample_and_recycle(r, r->inactive);
86
+ return r->inactive;
87
+ }
88
+
89
+ static void hdr_interval_recorder_update(
90
+ struct hdr_interval_recorder* r,
91
+ void(*update_action)(struct hdr_histogram*, void*),
92
+ void* arg)
93
+ {
94
+ int64_t val = hdr_phaser_writer_enter(&r->phaser);
95
+
96
+ void* active = hdr_atomic_load_pointer(&r->active);
97
+
98
+ update_action(active, arg);
99
+
100
+ hdr_phaser_writer_exit(&r->phaser, val);
101
+ }
102
+
103
+ static void update_values(struct hdr_histogram* data, void* arg)
104
+ {
105
+ struct hdr_histogram* h = data;
106
+ int64_t* params = arg;
107
+ params[2] = hdr_record_values(h, params[0], params[1]);
108
+ }
109
+
110
+ static void update_values_atomic(struct hdr_histogram* data, void* arg)
111
+ {
112
+ struct hdr_histogram* h = data;
113
+ int64_t* params = arg;
114
+ params[2] = hdr_record_values_atomic(h, params[0], params[1]);
115
+ }
116
+
117
+ int64_t hdr_interval_recorder_record_values(
118
+ struct hdr_interval_recorder* r,
119
+ int64_t value,
120
+ int64_t count
121
+ )
122
+ {
123
+ int64_t params[3];
124
+ params[0] = value;
125
+ params[1] = count;
126
+ params[2] = 0;
127
+
128
+ hdr_interval_recorder_update(r, update_values, &params[0]);
129
+ return params[2];
130
+ }
131
+
132
+ int64_t hdr_interval_recorder_record_value(
133
+ struct hdr_interval_recorder* r,
134
+ int64_t value
135
+ )
136
+ {
137
+ return hdr_interval_recorder_record_values(r, value, 1);
138
+ }
139
+
140
+ static void update_corrected_values(struct hdr_histogram* data, void* arg)
141
+ {
142
+ struct hdr_histogram* h = data;
143
+ int64_t* params = arg;
144
+ params[3] = hdr_record_corrected_values(h, params[0], params[1], params[2]);
145
+ }
146
+
147
+ static void update_corrected_values_atomic(struct hdr_histogram* data, void* arg)
148
+ {
149
+ struct hdr_histogram* h = data;
150
+ int64_t* params = arg;
151
+ params[3] = hdr_record_corrected_values_atomic(h, params[0], params[1], params[2]);
152
+ }
153
+
154
+ int64_t hdr_interval_recorder_record_corrected_values(
155
+ struct hdr_interval_recorder* r,
156
+ int64_t value,
157
+ int64_t count,
158
+ int64_t expected_interval
159
+ )
160
+ {
161
+ int64_t params[4];
162
+ params[0] = value;
163
+ params[1] = count;
164
+ params[2] = expected_interval;
165
+ params[3] = 0;
166
+
167
+ hdr_interval_recorder_update(r, update_corrected_values, &params[0]);
168
+ return params[3];
169
+ }
170
+
171
+ int64_t hdr_interval_recorder_record_corrected_value(
172
+ struct hdr_interval_recorder* r,
173
+ int64_t value,
174
+ int64_t expected_interval
175
+ )
176
+ {
177
+ return hdr_interval_recorder_record_corrected_values(r, value, 1, expected_interval);
178
+ }
179
+
180
+ int64_t hdr_interval_recorder_record_value_atomic(
181
+ struct hdr_interval_recorder* r,
182
+ int64_t value
183
+ )
184
+ {
185
+ return hdr_interval_recorder_record_values_atomic(r, value, 1);
186
+ }
187
+
188
+ int64_t hdr_interval_recorder_record_values_atomic(
189
+ struct hdr_interval_recorder* r,
190
+ int64_t value,
191
+ int64_t count
192
+ )
193
+ {
194
+ int64_t params[3];
195
+ params[0] = value;
196
+ params[1] = count;
197
+ params[2] = 0;
198
+
199
+ hdr_interval_recorder_update(r, update_values_atomic, &params[0]);
200
+ return params[2];
201
+ }
202
+
203
+ int64_t hdr_interval_recorder_record_corrected_value_atomic(
204
+ struct hdr_interval_recorder* r,
205
+ int64_t value,
206
+ int64_t expected_interval
207
+ )
208
+ {
209
+ return hdr_interval_recorder_record_corrected_values_atomic(r, value, 1, expected_interval);
210
+ }
211
+
212
+ int64_t hdr_interval_recorder_record_corrected_values_atomic(
213
+ struct hdr_interval_recorder* r,
214
+ int64_t value,
215
+ int64_t count,
216
+ int64_t expected_interval
217
+ )
218
+ {
219
+ int64_t params[4];
220
+ params[0] = value;
221
+ params[1] = count;
222
+ params[2] = expected_interval;
223
+ params[3] = 0;
224
+
225
+ hdr_interval_recorder_update(r, update_corrected_values_atomic, &params[0]);
226
+ return params[3];
227
+ }