Storage Engine API
wiredtiger_util.h
Go to the documentation of this file.
1 // wiredtiger_util.h
2 
31 #pragma once
32 
33 #include <limits>
34 #include <wiredtiger.h>
35 
36 #include "mongo/base/disallow_copying.h"
37 #include "mongo/base/status.h"
38 #include "mongo/base/status_with.h"
39 #include "mongo/bson/bsonobj.h"
40 #include "mongo/db/namespace_string.h"
41 #include "mongo/util/assert_util.h"
42 
43 namespace mongo {
44 
45 class BSONObjBuilder;
46 class OperationContext;
47 class WiredTigerConfigParser;
48 class WiredTigerKVEngine;
49 class WiredTigerSession;
50 
51 inline bool wt_keeptxnopen() {
52  return false;
53 }
54 
55 Status wtRCToStatus_slow(int retCode, const char* prefix);
56 
60 inline Status wtRCToStatus(int retCode, const char* prefix = NULL) {
61  if (MONGO_likely(retCode == 0))
62  return Status::OK();
63 
64  return wtRCToStatus_slow(retCode, prefix);
65 }
66 
67 #define invariantWTOK(expression) \
68  do { \
69  int _invariantWTOK_retCode = expression; \
70  if (MONGO_unlikely(_invariantWTOK_retCode != 0)) { \
71  invariantOKFailed( \
72  #expression, wtRCToStatus(_invariantWTOK_retCode), __FILE__, __LINE__); \
73  } \
74  } while (false)
75 
76 struct WiredTigerItem : public WT_ITEM {
77  WiredTigerItem(const void* d, size_t s) {
78  data = d;
79  size = s;
80  }
81  WiredTigerItem(const std::string& str) {
82  data = str.c_str();
83  size = str.size();
84  }
85  // NOTE: do not call Get() on a temporary.
86  // The pointer returned by Get() must not be allowed to live longer than *this.
87  WT_ITEM* Get() {
88  return this;
89  }
90  const WT_ITEM* Get() const {
91  return this;
92  }
93 };
94 
96  MONGO_DISALLOW_COPYING(WiredTigerUtil);
97 
98 private:
100 
101 public:
106  static void fetchTypeAndSourceURI(OperationContext* opCtx,
107  const std::string& tableUri,
108  std::string* type,
109  std::string* source);
110 
115  static Status exportTableToBSON(WT_SESSION* s,
116  const std::string& uri,
117  const std::string& config,
118  BSONObjBuilder* bob);
119 
134  static void appendSnapshotWindowSettings(WiredTigerKVEngine* engine,
135  WiredTigerSession* session,
136  BSONObjBuilder* bob);
137 
141  static StatusWith<std::string> getMetadata(OperationContext* opCtx, StringData uri);
142 
146  static Status getApplicationMetadata(OperationContext* opCtx,
147  StringData uri,
148  BSONObjBuilder* bob);
149 
150  static StatusWith<BSONObj> getApplicationMetadata(OperationContext* opCtx, StringData uri);
151 
157  static StatusWith<int64_t> checkApplicationMetadataFormatVersion(OperationContext* opCtx,
158  StringData uri,
159  int64_t minimumVersion,
160  int64_t maximumVersion);
161 
165  static Status checkTableCreationOptions(const BSONElement& configElem);
166 
171  static StatusWith<uint64_t> getStatisticsValue(WT_SESSION* session,
172  const std::string& uri,
173  const std::string& config,
174  int statisticsKey);
175 
180  template <typename ResultType>
181  static StatusWith<ResultType> getStatisticsValueAs(WT_SESSION* session,
182  const std::string& uri,
183  const std::string& config,
184  int statisticsKey);
185 
190  template <typename ResultType>
191  static StatusWith<ResultType> getStatisticsValueAs(WT_SESSION* session,
192  const std::string& uri,
193  const std::string& config,
194  int statisticsKey,
195  ResultType maximumResultType);
196 
197  static int64_t getIdentSize(WT_SESSION* s, const std::string& uri);
198 
199 
204  static size_t getCacheSizeMB(double requestedCacheSizeGB);
205 
214  static WT_EVENT_HANDLER defaultEventHandlers();
215 
216  class ErrorAccumulator : public WT_EVENT_HANDLER {
217  public:
218  ErrorAccumulator(std::vector<std::string>* errors);
219 
220  private:
221  static int onError(WT_EVENT_HANDLER* handler,
222  WT_SESSION* session,
223  int error,
224  const char* message);
225 
226  using ErrorHandler = int (*)(WT_EVENT_HANDLER*, WT_SESSION*, int, const char*);
227 
228  std::vector<std::string>* const _errors;
230  };
231 
238  static int verifyTable(OperationContext* opCtx,
239  const std::string& uri,
240  std::vector<std::string>* errors = NULL);
241 
242  static bool useTableLogging(NamespaceString ns, bool replEnabled);
243 
244  static Status setTableLogging(OperationContext* opCtx, const std::string& uri, bool on);
245 
246  static Status setTableLogging(WT_SESSION* session, const std::string& uri, bool on);
247 
248 private:
253  template <typename T>
254  static T _castStatisticsValue(uint64_t statisticsValue);
255 
260  template <typename T>
261  static T _castStatisticsValue(uint64_t statisticsValue, T maximumResultType);
262 };
263 
265  MONGO_DISALLOW_COPYING(WiredTigerConfigParser);
266 
267 public:
268  WiredTigerConfigParser(StringData config) {
270  wiredtiger_config_parser_open(NULL, config.rawData(), config.size(), &_parser));
271  }
272 
273  WiredTigerConfigParser(const WT_CONFIG_ITEM& nested) {
274  invariant(nested.type == WT_CONFIG_ITEM::WT_CONFIG_ITEM_STRUCT);
275  invariantWTOK(wiredtiger_config_parser_open(NULL, nested.str, nested.len, &_parser));
276  }
277 
279  invariantWTOK(_parser->close(_parser));
280  }
281 
282  int next(WT_CONFIG_ITEM* key, WT_CONFIG_ITEM* value) {
283  return _parser->next(_parser, key, value);
284  }
285 
286  int get(const char* key, WT_CONFIG_ITEM* value) {
287  return _parser->get(_parser, key, value);
288  }
289 
290 private:
291  WT_CONFIG_PARSER* _parser;
292 };
293 
294 // static
295 template <typename ResultType>
297  const std::string& uri,
298  const std::string& config,
299  int statisticsKey) {
300  return getStatisticsValueAs<ResultType>(
301  session, uri, config, statisticsKey, std::numeric_limits<ResultType>::max());
302 }
303 
304 // static
305 template <typename ResultType>
307  const std::string& uri,
308  const std::string& config,
309  int statisticsKey,
310  ResultType maximumResultType) {
311  StatusWith<uint64_t> result = getStatisticsValue(session, uri, config, statisticsKey);
312  if (!result.isOK()) {
313  return StatusWith<ResultType>(result.getStatus());
314  }
315  return StatusWith<ResultType>(
316  _castStatisticsValue<ResultType>(result.getValue(), maximumResultType));
317 }
318 
319 // static
320 template <typename ResultType>
321 ResultType WiredTigerUtil::_castStatisticsValue(uint64_t statisticsValue) {
322  return _castStatisticsValue<ResultType>(statisticsValue,
323  std::numeric_limits<ResultType>::max());
324 }
325 
326 // static
327 template <typename ResultType>
328 ResultType WiredTigerUtil::_castStatisticsValue(uint64_t statisticsValue,
329  ResultType maximumResultType) {
330  return statisticsValue > static_cast<uint64_t>(maximumResultType)
331  ? maximumResultType
332  : static_cast<ResultType>(statisticsValue);
333 }
334 
335 } // namespace mongo
Definition: wiredtiger_util.h:76
KVEngine * engine
Definition: kv_engine_test_timestamps.cpp:205
Collection *const const NamespaceString & ns
Definition: collection_info_cache_impl.cpp:53
WiredTigerItem(const void *d, size_t s)
Definition: wiredtiger_util.h:77
Copyright (C) 2014 MongoDB Inc.
Definition: bson_collection_catalog_entry.cpp:38
WT_ITEM * Get()
Definition: wiredtiger_util.h:87
OperationContext Database StringData BSONObj CollectionOptions::ParseKind bool const BSONObj &idIndex Status
Definition: database_impl.cpp:956
Definition: wiredtiger_util.h:216
WiredTigerConfigParser(const WT_CONFIG_ITEM &nested)
Definition: wiredtiger_util.h:273
BSONObj key
Definition: btree_interface.cpp:334
~WiredTigerConfigParser()
Definition: wiredtiger_util.h:278
This is a structure that caches 1 cursor for each uri.
Definition: wiredtiger_session_cache.h:65
const ErrorHandler _defaultErrorHandler
Definition: wiredtiger_util.h:229
WiredTigerItem(const std::string &str)
Definition: wiredtiger_util.h:81
std::shared_ptr< void > data
Definition: ephemeral_for_test_record_store_test.cpp:74
Definition: wiredtiger_kv_engine.h:65
bool wt_keeptxnopen()
Definition: wiredtiger_util.h:51
const WT_ITEM * Get() const
Definition: wiredtiger_util.h:90
WiredTigerConfigParser(StringData config)
Definition: wiredtiger_util.h:268
int(*)(WT_EVENT_HANDLER *, WT_SESSION *, int, const char *) ErrorHandler
Definition: wiredtiger_util.h:226
Definition: index_key_validate.h:40
int next(WT_CONFIG_ITEM *key, WT_CONFIG_ITEM *value)
Definition: wiredtiger_util.h:282
static StatusWith< ResultType > getStatisticsValueAs(WT_SESSION *session, const std::string &uri, const std::string &config, int statisticsKey)
Reads individual statistics using URI and casts to type ResultType.
Definition: wiredtiger_util.h:296
static T _castStatisticsValue(uint64_t statisticsValue)
Casts unsigned 64-bit statistics value to T.
Status wtRCToStatus(int retCode, const char *prefix=NULL)
converts wiredtiger return codes to mongodb statuses.
Definition: wiredtiger_util.h:60
Status wtRCToStatus_slow(int retCode, const char *prefix)
Definition: wiredtiger_util.cpp:82
std::vector< std::string > *const _errors
Definition: wiredtiger_util.h:228
Collection *const OperationContext *const opCtx
Definition: collection_impl.cpp:80
#define invariantWTOK(expression)
Definition: wiredtiger_util.h:67
std::string uri
Definition: wiredtiger_standard_record_store_test.cpp:367
Definition: wiredtiger_util.h:95
Definition: wiredtiger_util.h:264
WT_CONFIG_PARSER * _parser
Definition: wiredtiger_util.h:291