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 
103 class WiredTigerEventHandler : private WT_EVENT_HANDLER {
104 public:
106 
107  WT_EVENT_HANDLER* getWtEventHandler();
108 
110  return _startupSuccessful;
111  }
112 
114  _startupSuccessful = true;
115  }
116 
117 private:
118  int suppressibleStartupErrorLog(WT_EVENT_HANDLER* handler,
119  WT_SESSION* sesion,
120  int errorCode,
121  const char* message);
122 
123  bool _startupSuccessful = false;
124 };
125 
128 
129 private:
130  WiredTigerUtil();
131 
132 public:
137  static void fetchTypeAndSourceURI(OperationContext* opCtx,
138  const std::string& tableUri,
139  std::string* type,
140  std::string* source);
141 
146  static Status exportTableToBSON(WT_SESSION* s,
147  const std::string& uri,
148  const std::string& config,
149  BSONObjBuilder* bob);
150 
166  WiredTigerSession* session,
167  BSONObjBuilder* bob);
168 
172  static StatusWith<std::string> getMetadata(OperationContext* opCtx, StringData uri);
173 
177  static Status getApplicationMetadata(OperationContext* opCtx,
178  StringData uri,
179  BSONObjBuilder* bob);
180 
181  static StatusWith<BSONObj> getApplicationMetadata(OperationContext* opCtx, StringData uri);
182 
189  StringData uri,
190  int64_t minimumVersion,
191  int64_t maximumVersion);
192 
196  static Status checkTableCreationOptions(const BSONElement& configElem);
197 
202  static StatusWith<uint64_t> getStatisticsValue(WT_SESSION* session,
203  const std::string& uri,
204  const std::string& config,
205  int statisticsKey);
206 
211  template <typename ResultType>
212  static StatusWith<ResultType> getStatisticsValueAs(WT_SESSION* session,
213  const std::string& uri,
214  const std::string& config,
215  int statisticsKey);
216 
221  template <typename ResultType>
222  static StatusWith<ResultType> getStatisticsValueAs(WT_SESSION* session,
223  const std::string& uri,
224  const std::string& config,
225  int statisticsKey,
226  ResultType maximumResultType);
227 
228  static int64_t getIdentSize(WT_SESSION* s, const std::string& uri);
229 
230 
235  static size_t getCacheSizeMB(double requestedCacheSizeGB);
236 
237  class ErrorAccumulator : public WT_EVENT_HANDLER {
238  public:
239  ErrorAccumulator(std::vector<std::string>* errors);
240 
241  private:
242  static int onError(WT_EVENT_HANDLER* handler,
243  WT_SESSION* session,
244  int error,
245  const char* message);
246 
247  using ErrorHandler = int (*)(WT_EVENT_HANDLER*, WT_SESSION*, int, const char*);
248 
249  std::vector<std::string>* const _errors;
251  };
252 
259  static int verifyTable(OperationContext* opCtx,
260  const std::string& uri,
261  std::vector<std::string>* errors = NULL);
262 
263  static bool useTableLogging(NamespaceString ns, bool replEnabled);
264 
265 private:
270  template <typename T>
271  static T _castStatisticsValue(uint64_t statisticsValue);
272 
277  template <typename T>
278  static T _castStatisticsValue(uint64_t statisticsValue, T maximumResultType);
279 };
280 
283 
284 public:
285  WiredTigerConfigParser(StringData config) {
287  wiredtiger_config_parser_open(NULL, config.rawData(), config.size(), &_parser));
288  }
289 
290  WiredTigerConfigParser(const WT_CONFIG_ITEM& nested) {
291  invariant(nested.type == WT_CONFIG_ITEM::WT_CONFIG_ITEM_STRUCT);
292  invariantWTOK(wiredtiger_config_parser_open(NULL, nested.str, nested.len, &_parser));
293  }
294 
296  invariantWTOK(_parser->close(_parser));
297  }
298 
299  int next(WT_CONFIG_ITEM* key, WT_CONFIG_ITEM* value) {
300  return _parser->next(_parser, key, value);
301  }
302 
303  int get(const char* key, WT_CONFIG_ITEM* value) {
304  return _parser->get(_parser, key, value);
305  }
306 
307 private:
308  WT_CONFIG_PARSER* _parser;
309 };
310 
311 // static
312 template <typename ResultType>
314  const std::string& uri,
315  const std::string& config,
316  int statisticsKey) {
317  return getStatisticsValueAs<ResultType>(
318  session, uri, config, statisticsKey, std::numeric_limits<ResultType>::max());
319 }
320 
321 // static
322 template <typename ResultType>
324  const std::string& uri,
325  const std::string& config,
326  int statisticsKey,
327  ResultType maximumResultType) {
328  StatusWith<uint64_t> result = getStatisticsValue(session, uri, config, statisticsKey);
329  if (!result.isOK()) {
330  return StatusWith<ResultType>(result.getStatus());
331  }
332  return StatusWith<ResultType>(
333  _castStatisticsValue<ResultType>(result.getValue(), maximumResultType));
334 }
335 
336 // static
337 template <typename ResultType>
338 ResultType WiredTigerUtil::_castStatisticsValue(uint64_t statisticsValue) {
339  return _castStatisticsValue<ResultType>(statisticsValue,
340  std::numeric_limits<ResultType>::max());
341 }
342 
343 // static
344 template <typename ResultType>
345 ResultType WiredTigerUtil::_castStatisticsValue(uint64_t statisticsValue,
346  ResultType maximumResultType) {
347  return statisticsValue > static_cast<uint64_t>(maximumResultType)
348  ? maximumResultType
349  : static_cast<ResultType>(statisticsValue);
350 }
351 
352 } // namespace mongo
MONGO_DISALLOW_COPYING(WiredTigerConfigParser)
static int onError(WT_EVENT_HANDLER *handler, WT_SESSION *session, int error, const char *message)
Definition: wiredtiger_util.cpp:486
static int64_t getIdentSize(WT_SESSION *s, const std::string &uri)
Definition: wiredtiger_util.cpp:354
Definition: wiredtiger_util.h:76
KVEngine * engine
Definition: kv_engine_test_timestamps.cpp:205
static int verifyTable(OperationContext *opCtx, const std::string &uri, std::vector< std::string > *errors=NULL)
Calls WT_SESSION::validate() on a side-session to ensure that your current transaction isn't left in ...
Definition: wiredtiger_util.cpp:499
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
static Status getApplicationMetadata(OperationContext *opCtx, StringData uri, BSONObjBuilder *bob)
Reads app_metadata for collection/index at URI as a BSON document.
Definition: wiredtiger_util.cpp:161
WT_ITEM * Get()
Definition: wiredtiger_util.h:87
Definition: wiredtiger_util.h:237
WiredTigerConfigParser(const WT_CONFIG_ITEM &nested)
Definition: wiredtiger_util.h:290
BSONObj key
Definition: btree_interface.cpp:334
static StatusWith< std::string > getMetadata(OperationContext *opCtx, StringData uri)
Gets entire metadata string for collection/index at URI.
Definition: wiredtiger_util.cpp:133
~WiredTigerConfigParser()
Definition: wiredtiger_util.h:295
static void fetchTypeAndSourceURI(OperationContext *opCtx, const std::string &tableUri, std::string *type, std::string *source)
Fetch the type and source fields out of the colgroup metadata.
Definition: wiredtiger_util.cpp:110
This is a structure that caches 1 cursor for each uri.
Definition: wiredtiger_session_cache.h:65
static size_t getCacheSizeMB(double requestedCacheSizeGB)
Return amount of memory to use for the WiredTiger cache based on either the startup option chosen or ...
Definition: wiredtiger_util.cpp:368
const ErrorHandler _defaultErrorHandler
Definition: wiredtiger_util.h:250
WT_EVENT_HANDLER * getWtEventHandler()
Definition: wiredtiger_util.cpp:469
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:66
bool wt_keeptxnopen()
Definition: wiredtiger_util.h:51
ErrorAccumulator(std::vector< std::string > *errors)
Definition: wiredtiger_util.cpp:476
OperationContext Database StringData CollectionOptions bool const BSONObj &idIndex Status
Definition: database_impl.cpp:955
const WT_ITEM * Get() const
Definition: wiredtiger_util.h:90
static Status checkTableCreationOptions(const BSONElement &configElem)
Validates the 'configString' specified as a collection or index creation option.
Definition: wiredtiger_util.cpp:283
WiredTigerEventHandler()
Definition: wiredtiger_util.cpp:459
WiredTigerConfigParser(StringData config)
Definition: wiredtiger_util.h:285
int(*)(WT_EVENT_HANDLER *, WT_SESSION *, int, const char *) ErrorHandler
Definition: wiredtiger_util.h:247
Definition: index_key_validate.h:40
bool wasStartupSuccessful()
Definition: wiredtiger_util.h:109
static StatusWith< int64_t > checkApplicationMetadataFormatVersion(OperationContext *opCtx, StringData uri, int64_t minimumVersion, int64_t maximumVersion)
Validates formatVersion in application metadata for 'uri'.
Definition: wiredtiger_util.cpp:227
int next(WT_CONFIG_ITEM *key, WT_CONFIG_ITEM *value)
Definition: wiredtiger_util.h:299
static Status exportTableToBSON(WT_SESSION *s, const std::string &uri, const std::string &config, BSONObjBuilder *bob)
Reads contents of table using URI and exports all keys to BSON as string elements.
Definition: wiredtiger_util.cpp:541
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:313
static bool useTableLogging(NamespaceString ns, bool replEnabled)
Definition: wiredtiger_util.cpp:519
Returns a WT_EVENT_HANDLER with MongoDB's default handlers.
Definition: wiredtiger_util.h:103
void setStartupSuccessful()
Definition: wiredtiger_util.h:113
static StatusWith< uint64_t > getStatisticsValue(WT_SESSION *session, const std::string &uri, const std::string &config, int statisticsKey)
Reads individual statistics using URI.
Definition: wiredtiger_util.cpp:314
static void appendSnapshotWindowSettings(WiredTigerKVEngine *engine, WiredTigerSession *session, BSONObjBuilder *bob)
Appends information about the storage engine's currently available snapshots and the settings that af...
Definition: wiredtiger_util.cpp:605
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:249
int suppressibleStartupErrorLog(WT_EVENT_HANDLER *handler, WT_SESSION *sesion, int errorCode, const char *message)
Collection *const OperationContext *const opCtx
Definition: collection_impl.cpp:80
bool _startupSuccessful
Definition: wiredtiger_util.h:123
int get(const char *key, WT_CONFIG_ITEM *value)
Definition: wiredtiger_util.h:303
#define invariantWTOK(expression)
Definition: wiredtiger_util.h:67
MONGO_DISALLOW_COPYING(WiredTigerUtil)
std::string uri
Definition: wiredtiger_standard_record_store_test.cpp:367
Definition: wiredtiger_util.h:126
Definition: wiredtiger_util.h:281
WT_CONFIG_PARSER * _parser
Definition: wiredtiger_util.h:308