Storage Engine API
data_file.h
Go to the documentation of this file.
1 // data_file.h
2 
31 #pragma once
32 
33 #include "mongo/bson/util/builder.h"
36 #include "mongo/platform/bits.h"
37 
38 namespace mongo {
39 
40 class OperationContext;
41 
42 #pragma pack(1)
44 public:
45  DataFileVersion(uint32_t major, uint32_t minor) : _major(major), _minor(minor) {}
46 
49  }
50 
52  if (_major != kCurrentMajor) {
53  StringBuilder sb;
54  sb << "The data files have major version " << _major
55  << ", but this version of mongod only supports version " << kCurrentMajor;
56  return {ErrorCodes::MustUpgrade, sb.str()};
57  }
58 
59  uint32_t unrecognizedMinorBits = _minor & ~kUsedMinorFlagsMask;
60  if (unrecognizedMinorBits) {
61  StringBuilder sb;
62  sb << "The data files use features not recognized by this version of mongod; the"
63  " feature bits in positions [ ";
64  bool firstIteration = true;
65  while (unrecognizedMinorBits) {
66  const int lowestSetBitPosition = countTrailingZeros64(unrecognizedMinorBits);
67  if (!firstIteration) {
68  sb << ", ";
69  }
70  sb << lowestSetBitPosition;
71  unrecognizedMinorBits ^= (1 << lowestSetBitPosition);
72  firstIteration = false;
73  }
74  sb << " ] aren't recognized by this version of mongod";
75 
76  return {ErrorCodes::MustUpgrade, sb.str()};
77  }
78 
79  const uint32_t indexCleanliness = _minor & kIndexPluginMask;
80  if (indexCleanliness != kIndexes24AndNewer && indexCleanliness != kIndexes22AndOlder) {
81  StringBuilder sb;
82  sb << "The data files have index plugin version " << indexCleanliness
83  << ", but this version of mongod only supports versions " << kIndexes22AndOlder
84  << " and " << kIndexes24AndNewer;
85  return {ErrorCodes::MustUpgrade, sb.str()};
86  }
87 
88  // We are compatible with either setting of kMayHave30Freelist.
89 
90  return Status::OK();
91  }
92 
93  bool is24IndexClean() const {
95  }
98  }
99 
100  bool mayHave30Freelist() const {
101  return _minor & kMayHave30Freelist;
102  }
105  }
106 
109  }
112  }
113 
114  uint32_t majorRaw() const {
115  return _major;
116  }
117  uint32_t minorRaw() const {
118  return _minor;
119  }
120 
121 private:
122  static const uint32_t kCurrentMajor = 4;
123 
124  // minor layout:
125  // first 4 bits - index plugin cleanliness.
126  // see IndexCatalog::_upgradeDatabaseMinorVersionIfNeeded for details
127  // 5th bit - 1 if started with 3.0-style freelist implementation (SERVER-14081)
128  // 6th bit - 1 if indexes or collections with a collation have been created.
129  // 7th through 31st bit - reserved and must be set to 0.
130  static const uint32_t kIndexPluginMask = 0xf;
131  static const uint32_t kIndexes22AndOlder = 5;
132  static const uint32_t kIndexes24AndNewer = 6;
133 
134  static const uint32_t kMayHave30Freelist = (1 << 4);
135 
136  static const uint32_t kMayHaveCollationMetadata = (1 << 5);
137 
138  // All set bits we know about are covered by this mask.
139  static const uint32_t kUsedMinorFlagsMask =
140  kIndexPluginMask | kMayHave30Freelist | kMayHaveCollationMetadata;
141 
142  uint32_t _major;
143  uint32_t _minor;
144 };
145 
146 // Note: Intentionally not defining relational operators for DataFileVersion as there is no
147 // total ordering of all versions now that '_minor' is used as a bit vector.
148 #pragma pack()
149 
150 /* a datafile - i.e. the "dbname.<#>" files :
151 
152  ----------------------
153  DataFileHeader
154  ----------------------
155  Extent (for a particular namespace)
156  MmapV1RecordHeader
157  ...
158  MmapV1RecordHeader (some chained for unused space)
159  ----------------------
160  more Extents...
161  ----------------------
162 */
163 #pragma pack(1)
165 public:
175  char reserved[8192 - 4 * 4 - 8 * 3];
176 
177  char data[4]; // first extent starts here
178 
179  enum { HeaderSize = 8192 };
180 
181  bool uninitialized() const {
182  return version.majorRaw() == 0;
183  }
184 
185  void init(OperationContext* opCtx, int fileno, int filelength, const char* filename);
186 
187  void checkUpgrade(OperationContext* opCtx);
188 
189  bool isEmpty() const {
190  return uninitialized() || (unusedLength == fileLength - HeaderSize - 16);
191  }
192 };
193 #pragma pack()
194 
195 
196 class DataFile {
197 public:
198  DataFile(OperationContext* opCtx, int fn) : _fileNo(fn), mmf(opCtx), _mb(NULL) {}
199 
201  Status openExisting(OperationContext* opCtx, const char* filename);
202 
204  void open(OperationContext* opCtx,
205  const char* filename,
206  int requestedDataSize = 0,
207  bool preallocateOnly = false);
208 
212  void close(OperationContext* opCtx) {
213  LockMongoFilesExclusive lock(opCtx);
214  mmf.close(opCtx);
215  }
216 
217  DiskLoc allocExtentArea(OperationContext* opCtx, int size);
218 
220  return header();
221  }
222  const DataFileHeader* getHeader() const {
223  return header();
224  }
225 
227  return mmf.getFd();
228  }
229  unsigned long long length() const {
230  return mmf.length();
231  }
232 
233  /* return max size an extent may be */
234  static int maxSize();
235 
237  void flush(bool sync);
238 
239 private:
240  friend class MmapV1ExtentManager;
241 
242 
243  void badOfs(int) const;
244  int _defaultSize() const;
245 
246  void grow(DiskLoc dl, int size);
247 
248  char* p() const {
249  return (char*)_mb;
250  }
252  return static_cast<DataFileHeader*>(_mb);
253  }
254  const DataFileHeader* header() const {
255  return static_cast<DataFileHeader*>(_mb);
256  }
257 
258 
259  const int _fileNo;
260 
262  void* _mb; // the memory mapped view
263 };
264 }
uint32_t minorRaw() const
Definition: data_file.h:117
void * _mb
Definition: data_file.h:262
const int _fileNo
Definition: data_file.h:259
DurableMappedFile mmf
Definition: data_file.h:261
static const uint32_t kCurrentMajor
Definition: data_file.h:122
DataFileHeader * getHeader()
Definition: data_file.h:219
bool uninitialized() const
Definition: data_file.h:181
HANDLE getFd()
Definition: data_file.h:226
static const uint32_t kMayHave30Freelist
Definition: data_file.h:134
Copyright (C) 2014 MongoDB Inc.
Definition: bson_collection_catalog_entry.cpp:38
uint32_t _major
Definition: data_file.h:142
static const uint32_t kIndexes24AndNewer
Definition: data_file.h:132
bool mayHave30Freelist() const
Definition: data_file.h:100
Definition: data_file.h:164
OperationContext Database StringData BSONObj CollectionOptions::ParseKind bool const BSONObj &idIndex Status
Definition: database_impl.cpp:956
unsigned long long length() const
Definition: data_file.h:229
Definition: data_file.h:43
static const uint32_t kUsedMinorFlagsMask
Definition: data_file.h:139
int fileLength
Definition: data_file.h:167
void setMayHave30Freelist()
Definition: data_file.h:103
DataFileHeader * header()
Definition: data_file.h:251
represents a disk location/offset on disk in a database.
Definition: diskloc.h:53
void close(OperationContext *opCtx)
Must be called before destruction.
Definition: data_file.h:212
static const uint32_t kIndexPluginMask
Definition: data_file.h:130
int HANDLE
Definition: mmap.h:42
std::shared_ptr< void > data
Definition: ephemeral_for_test_record_store_test.cpp:74
DiskLoc freeListStart
Definition: data_file.h:173
void setIs24IndexClean()
Definition: data_file.h:96
static const uint32_t kMayHaveCollationMetadata
Definition: data_file.h:136
ExtentManager basics.
Definition: mmap_v1_extent_manager.h:75
DurableMappedFile adds some layers atop memory mapped files - specifically our handling of private vi...
Definition: durable_mapped_file.h:47
Status isCompatibleWithCurrentCode() const
Definition: data_file.h:51
void setMayHaveCollationMetadata()
Definition: data_file.h:110
DiskLoc freeListEnd
Definition: data_file.h:174
DataFileVersion(uint32_t major, uint32_t minor)
Definition: data_file.h:45
uint32_t majorRaw() const
Definition: data_file.h:114
static const uint32_t kIndexes22AndOlder
Definition: data_file.h:131
bool is24IndexClean() const
Definition: data_file.h:93
Definition: mmap.h:96
static DataFileVersion defaultForNewFiles()
Definition: data_file.h:47
DataFile(OperationContext *opCtx, int fn)
Definition: data_file.h:198
int unusedLength
Definition: data_file.h:172
bool isEmpty() const
Definition: data_file.h:189
uint32_t _minor
Definition: data_file.h:143
Collection *const OperationContext *const opCtx
Definition: collection_impl.cpp:80
bool getMayHaveCollationMetadata() const
Definition: data_file.h:107
Definition: data_file.h:196
DiskLoc unused
unused is the portion of the file that doesn&#39;t belong to any allocated extents.
Definition: data_file.h:171
char * p() const
Definition: data_file.h:248
const DataFileHeader * getHeader() const
Definition: data_file.h:222
const DataFileHeader * header() const
Definition: data_file.h:254
DataFileVersion version
Definition: data_file.h:166