Storage Engine API
namespace_details.h
Go to the documentation of this file.
1 
29 #pragma once
30 
31 #include "mongo/base/static_assert.h"
32 #include "mongo/db/namespace_string.h"
36 
37 namespace mongo {
38 
39 class Collection;
40 class NamespaceIndex;
41 class OperationContext;
42 
43 #pragma pack(1)
44 /* NamespaceDetails : this is the "header" for a collection that has all its details.
45  It's in the .ns file and this is a memory mapped region (thus the pack pragma above).
46 */
48 public:
49  enum { NIndexesMax = 64, NIndexesExtra = 30, NIndexesBase = 10 };
50 
51  // deleted lists -- linked lists of deleted records -- are placed in 'buckets' of various
52  // sizes so you can look for a deleted record of about the right size. These buckets are
53  // split into small and large groups for compatibility with old versions.
54  static const int SmallBuckets = 18;
55  static const int LargeBuckets = 8;
56 
57 
58  /*-------- data fields, as present on disk : */
59 
62 
63  /* NOTE: capped collections v1 override the meaning of deletedList.
64  deletedList[0] points to a list of free records (DeletedRecord's) for all extents in
65  the capped namespace.
66  deletedList[1] points to the last record in the prev extent. When the "current extent"
67  changes, this value is updated. !deletedList[1].isValid() when this value is not
68  yet computed.
69  */
71  DiskLoc deletedListLegacyGrabBag; // old implementations put records of multiple sizes here.
72 
73  // ofs 168 (8 byte aligned)
74  struct Stats {
75  // datasize and nrecords MUST Be adjacent code assumes!
76  long long datasize; // this includes padding, but not record headers
77  long long nrecords;
78  } stats;
79 
80 
82 
83  int nIndexes;
84 
85  // ofs 192
87 
88 public:
89  // ofs 352 (16 byte aligned)
90  int isCapped; // there is wasted space here if I'm right (ERH)
91 
92  int maxDocsInCapped; // max # of objects for a capped table, -1 for inf.
93 
95  // ofs 368 (16)
96  int systemFlagsOldDoNotUse; // things that the system sets/cares about
97 
98  DiskLoc capExtent; // the "current" extent we're writing too for a capped collection
100 
101  // NamespaceDetails version. So we can do backward compatibility in the future. See filever.h
102  unsigned short _dataFileVersion;
103  unsigned short _indexFileVersion;
104 
105  unsigned long long multiKeyIndexBits;
106 
107  // ofs 400 (16)
108  unsigned long long _reservedA;
109  long long _extraOffset; // where the $extra info is located (bytes relative to this)
110 
111 public:
112  int indexBuildsInProgress; // Number of indexes currently being built
113 
115 
117 
118  // Think carefully before using this. We need at least 8 bytes reserved to leave room for a
119  // DiskLoc pointing to more data (eg in a dummy MmapV1RecordHeader or Extent). There is still
120  // _reservedA above, but these are the final two reserved 8-byte regions.
121  char _reserved[8];
122  /*-------- end data 496 bytes */
123 public:
124  explicit NamespaceDetails(const DiskLoc& loc, bool _capped);
125 
126  class Extra {
127  long long _next;
128 
129  public:
131 
132  private:
133  unsigned reserved2;
134  unsigned reserved3;
135  Extra(const Extra&) {
136  verify(false);
137  }
138  Extra& operator=(const Extra& r) {
139  verify(false);
140  return *this;
141  }
142 
143  public:
144  Extra() {}
146  return ((char*)this) - ((char*)d);
147  }
148  void init() {
149  memset(this, 0, sizeof(Extra));
150  }
151  Extra* next(const NamespaceDetails* d) const {
152  if (_next == 0)
153  return 0;
154  return (Extra*)(((char*)d) + _next);
155  }
156  void setNext(OperationContext* opCtx, long ofs);
157  void copy(NamespaceDetails* d, const Extra& e) {
158  memcpy(this, &e, sizeof(Extra));
159  _next = 0;
160  }
161  };
162  Extra* extra() const {
163  if (_extraOffset == 0)
164  return 0;
165  return (Extra*)(((char*)this) + _extraOffset);
166  }
167  /* add extra space for indexes when more than 10 */
168  Extra* allocExtra(OperationContext* opCtx,
169  StringData ns,
170  NamespaceIndex& ni,
171  int nindexessofar);
172 
173  void copyingFrom(OperationContext* opCtx,
174  StringData thisns,
175  NamespaceIndex& ni,
176  NamespaceDetails* src); // must be called when renaming a NS to fix up extra
177 
178 public:
179  void setMaxCappedDocs(OperationContext* opCtx, long long max);
180 
181  enum UserFlags {
183  Flag_NoPadding = 1 << 1,
184  };
185 
186  IndexDetails& idx(int idxNo, bool missingExpected = false);
187  const IndexDetails& idx(int idxNo, bool missingExpected = false) const;
188 
190  public:
191  int pos() {
192  return i;
193  } // note this is the next one to come
194  bool more() {
195  return i < n;
196  }
197  const IndexDetails& next() {
198  return d->idx(i++);
199  }
200 
201  private:
202  friend class NamespaceDetails;
203  int i, n;
205  IndexIterator(const NamespaceDetails* _d, bool includeBackgroundInProgress);
206  };
207 
208  IndexIterator ii(bool includeBackgroundInProgress = false) const {
209  return IndexIterator(this, includeBackgroundInProgress);
210  }
211 
216  IndexDetails& getNextIndexDetails(OperationContext* opCtx, Collection* collection);
217 
218  NamespaceDetails* writingWithoutExtra(OperationContext* opCtx);
219 
221  NamespaceDetails* writingWithExtra(OperationContext* opCtx);
222 
229  int _catalogFindIndexByName(OperationContext* opCtx,
230  const Collection* coll,
231  StringData name,
232  bool includeBackgroundInProgress) const;
233 
234 private:
240  void swapIndex(OperationContext* opCtx, int a, int b);
241 
242  friend class IndexCatalog;
243  friend class IndexCatalogEntry;
244 
248  MONGO_STATIC_ASSERT(NIndexesMax <= 64); // multiKey bits
250 }; // NamespaceDetails
251 MONGO_STATIC_ASSERT(sizeof(NamespaceDetails) == 496);
252 #pragma pack()
253 
254 } // namespace mongo
int indexBuildsInProgress
Definition: namespace_details.h:112
int ofs
Definition: btree_interface.cpp:337
int n
Definition: namespace_details.h:203
static const int SmallBuckets
Definition: namespace_details.h:54
struct mongo::NamespaceDetails::Stats stats
Collection *const OperationContext *const const StringData OptionalCollectionUUID CollectionCatalogEntry *const details
Definition: collection_impl.cpp:80
bool more()
Definition: namespace_details.h:194
Collection *const const NamespaceString & ns
Definition: collection_info_cache_impl.cpp:53
const NamespaceDetails * d
Definition: namespace_details.h:204
DiskLoc capFirstNewRecord
Definition: namespace_details.h:99
void copy(NamespaceDetails *d, const Extra &e)
Definition: namespace_details.h:157
Definition: namespace_details.h:126
Copyright (C) 2014 MongoDB Inc.
Definition: bson_collection_catalog_entry.cpp:38
const IndexDetails & next()
Definition: namespace_details.h:197
Collection *const collection
Definition: collection_info_cache_impl.cpp:53
DiskLoc deletedListLarge[LargeBuckets]
Definition: namespace_details.h:116
char _reserved[8]
Definition: namespace_details.h:121
int userFlags
Definition: namespace_details.h:114
int pos()
Definition: namespace_details.h:191
Definition: namespace_index.h:50
IndexDetails & idx(int idxNo, bool missingExpected=false)
Definition: namespace_details.cpp:120
unsigned long long _reservedA
Definition: namespace_details.h:108
Definition: namespace_details.h:49
Extra()
Definition: namespace_details.h:144
static const int LargeBuckets
Definition: namespace_details.h:55
Extra * extra() const
Definition: namespace_details.h:162
NamespaceDetails * writingWithExtra(OperationContext *opCtx)
Make all linked Extra objects writeable as well.
Definition: namespace_details.cpp:208
unsigned long long multiKeyIndexBits
Definition: namespace_details.h:105
represents a disk location/offset on disk in a database.
Definition: diskloc.h:53
int lastExtentSize
Definition: namespace_details.h:81
IndexDetails _indexes[NIndexesBase]
Definition: namespace_details.h:86
unsigned reserved2
Definition: namespace_details.h:133
DiskLoc deletedListLegacyGrabBag
Definition: namespace_details.h:71
this is NOT safe through a yield right now.
Definition: collection.h:160
Extra * allocExtra(OperationContext *opCtx, StringData ns, NamespaceIndex &ni, int nindexessofar)
Definition: namespace_details.cpp:85
Definition: namespace_details.h:47
how many: 1 per Collection.
Definition: index_catalog.h:62
DiskLoc lastExtent
Definition: namespace_details.h:61
IndexIterator ii(bool includeBackgroundInProgress=false) const
Definition: namespace_details.h:208
DiskLoc capExtent
Definition: namespace_details.h:98
void cappedTruncateLastDelUpdate()
Update cappedLastDelRecLastExtent() after capExtent changed in cappedTruncateAfter() ...
int nIndexes
Definition: namespace_details.h:83
double paddingFactorOldDoNotUse
Definition: namespace_details.h:94
DiskLoc firstExtent
Definition: namespace_details.h:60
Definition: namespace_details.h:49
Definition: index_catalog_entry.h:56
Definition: namespace_details.h:189
void init()
Definition: namespace_details.h:148
IndexDetails & getNextIndexDetails(OperationContext *opCtx, Collection *collection)
This fetches the IndexDetails for the next empty index slot.
unsigned short _dataFileVersion
Definition: namespace_details.h:102
long long nrecords
Definition: namespace_details.h:77
long ofsFrom(NamespaceDetails *d)
Definition: namespace_details.h:145
int maxDocsInCapped
Definition: namespace_details.h:92
long long _next
Definition: namespace_details.h:127
int isCapped
Definition: namespace_details.h:90
int _catalogFindIndexByName(OperationContext *opCtx, const Collection *coll, StringData name, bool includeBackgroundInProgress) const
Returns the offset of the specified index name within the array of indexes.
Definition: namespace_details.cpp:225
NamespaceDetails(const DiskLoc &loc, bool _capped)
Definition: namespace_details.cpp:54
int systemFlagsOldDoNotUse
Definition: namespace_details.h:96
UserFlags
Definition: namespace_details.h:181
Extra * next(const NamespaceDetails *d) const
Definition: namespace_details.h:151
Definition: namespace_details.h:182
NamespaceDetails * writingWithoutExtra(OperationContext *opCtx)
Definition: namespace_details.cpp:202
void setMaxCappedDocs(OperationContext *opCtx, long long max)
Definition: namespace_details.cpp:215
Definition: namespace_details.h:74
Definition: index_details.h:46
DiskLoc deletedListSmall[SmallBuckets]
Definition: namespace_details.h:70
Definition: namespace_details.h:183
long long _extraOffset
Definition: namespace_details.h:109
Extra(const Extra &)
Definition: namespace_details.h:135
Extra & operator=(const Extra &r)
Definition: namespace_details.h:138
Definition: namespace_details.h:49
long long datasize
Definition: namespace_details.h:76
Database *const OperationContext *const const StringData name
Definition: database_impl.cpp:82
Collection *const OperationContext *const opCtx
Definition: collection_impl.cpp:80
void copyingFrom(OperationContext *opCtx, StringData thisns, NamespaceIndex &ni, NamespaceDetails *src)
Definition: namespace_details.cpp:179
unsigned reserved3
Definition: namespace_details.h:134
void swapIndex(OperationContext *opCtx, int a, int b)
swaps all meta data for 2 indexes a and b are 2 index ids, whose contents will be swapped must have a...
unsigned short _indexFileVersion
Definition: namespace_details.h:103
MONGO_STATIC_ASSERT(NIndexesMax<=NIndexesBase+NIndexesExtra *2)