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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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
+ }