Storage Engine API
mmap_v1_extent_manager.h
Go to the documentation of this file.
1 // mmap_v1_extent_manager.h
2 
31 #pragma once
32 
33 #include <string>
34 
35 #include <boost/filesystem/path.hpp>
36 
37 #include "mongo/base/status.h"
38 #include "mongo/base/string_data.h"
43 #include "mongo/platform/atomic_word.h"
44 #include "mongo/stdx/mutex.h"
45 
46 namespace mongo {
47 
48 class DataFile;
49 class DataFileVersion;
50 class MmapV1RecordHeader;
51 class OperationContext;
52 
53 struct Extent;
54 
77 
78 public:
80  virtual std::unique_ptr<ExtentManager> create(StringData dbname,
81  StringData path,
82  bool directoryPerDB) final;
83  };
84 
90  MmapV1ExtentManager(StringData dbname, StringData path, bool directoryPerDB);
91 
95  void close(OperationContext* opCtx) {
96  _files.close(opCtx);
97  }
98 
102  Status init(OperationContext* opCtx);
103 
104  int numFiles() const;
105  long long fileSize() const;
106 
107  // must call Extent::reuse on the returned extent
108  DiskLoc allocateExtent(OperationContext* opCtx, bool capped, int size, bool enforceQuota);
109 
113  void freeExtents(OperationContext* opCtx, DiskLoc firstExt, DiskLoc lastExt);
114 
119  void freeExtent(OperationContext* opCtx, DiskLoc extent);
120 
121 
122  void freeListStats(OperationContext* opCtx, int* numExtents, int64_t* totalFreeSizeBytes) const;
123 
131  MmapV1RecordHeader* recordForV1(const DiskLoc& loc) const;
132 
133  std::unique_ptr<RecordFetcher> recordNeedsFetch(const DiskLoc& loc) const;
134 
139  Extent* extentForV1(const DiskLoc& loc) const;
140 
145  DiskLoc extentLocForV1(const DiskLoc& loc) const;
146 
150  Extent* getExtent(const DiskLoc& loc, bool doSanityCheck = true) const;
151 
155  DataFileVersion getFileFormat(OperationContext* opCtx) const final;
156  void setFileFormat(OperationContext* opCtx, DataFileVersion newVersion) final;
157 
158  const DataFile* getOpenFile(int n) const final {
159  return _getOpenFile(n);
160  }
161 
162  virtual int maxSize() const;
163 
164  virtual CacheHint* cacheHint(const DiskLoc& extentLoc, const HintType& hint);
165 
166 private:
170  DiskLoc _allocFromFreeList(OperationContext* opCtx, int approxSize, bool capped);
171 
172  /* allocate a new Extent, does not check free list
173  */
174  DiskLoc _createExtent(OperationContext* opCtx, int approxSize, bool enforceQuota);
175 
176  DataFile* _addAFile(OperationContext* opCtx, int sizeNeeded, bool preallocateNextFile);
177 
178 
183  MmapV1RecordHeader* _recordForV1(const DiskLoc& loc) const;
184 
185  DiskLoc _getFreeListStart() const;
186  DiskLoc _getFreeListEnd() const;
187  void _setFreeListStart(OperationContext* opCtx, DiskLoc loc);
188  void _setFreeListEnd(OperationContext* opCtx, DiskLoc loc);
189 
190  const DataFile* _getOpenFile(int fileId) const;
191  DataFile* _getOpenFile(int fileId);
192 
194  OperationContext* opCtx, int fileNo, DataFile* f, int size, bool enforceQuota);
195 
196  boost::filesystem::path _fileName(int n) const;
197 
198  // -----
199 
200  const std::string _dbname; // i.e. "test"
201  const std::string _path; // i.e. "/data/db"
202  const bool _directoryPerDB;
204 
205  // This reference points into the MMAPv1 engine and is only valid as long as the
206  // engine is valid. Not owned here.
208 
214  class FilesArray {
215  public:
216  FilesArray() : _size(0) {}
217  ~FilesArray();
218 
222  void close(OperationContext* opCtx);
223 
228  DataFile* operator[](int n) const {
229  invariant(n >= 0 && n < size());
230  return _files[n];
231  }
232 
236  bool empty() const {
237  return size() == 0;
238  }
239 
243  int size() const {
244  return _size.load();
245  }
246 
247  // Appends val to the array, taking ownership of its pointer
248  void push_back(DataFile* val);
249 
250  private:
251  stdx::mutex _writersMutex;
252  AtomicInt32 _size; // number of files in the array
254  };
255 
257 };
258 }
boost::filesystem::path _fileName(int n) const
Definition: mmap_v1_extent_manager.cpp:131
const std::string _dbname
Definition: mmap_v1_extent_manager.h:200
bool empty() const
Returns true iff no files were added.
Definition: mmap_v1_extent_manager.h:236
MmapV1RecordHeader * _recordForV1(const DiskLoc &loc) const
Shared record retrieval logic used by the public recordForV1() and likelyInPhysicalMem() above...
Definition: mmap_v1_extent_manager.cpp:291
DiskLoc _allocFromFreeList(OperationContext *opCtx, int approxSize, bool capped)
will return NULL if nothing suitable in free list
Definition: mmap_v1_extent_manager.cpp:418
Definition: extent_manager.h:70
Definition: extent.h:50
virtual std::unique_ptr< ExtentManager > create(StringData dbname, StringData path, bool directoryPerDB) final
Definition: mmap_v1_extent_manager.cpp:124
std::unique_ptr< RecordFetcher > recordNeedsFetch(const DiskLoc &loc) const
The extent manager tracks accesses to DiskLocs.
Definition: mmap_v1_extent_manager.cpp:309
RecordAccessTracker * _recordAccessTracker
Definition: mmap_v1_extent_manager.h:207
Copyright (C) 2014 MongoDB Inc.
Definition: bson_collection_catalog_entry.cpp:38
long long fileSize() const
Definition: mmap_v1_extent_manager.cpp:282
void _setFreeListEnd(OperationContext *opCtx, DiskLoc loc)
Definition: mmap_v1_extent_manager.cpp:594
OperationContext Database StringData BSONObj CollectionOptions::ParseKind bool const BSONObj &idIndex Status
Definition: database_impl.cpp:956
void freeExtents(OperationContext *opCtx, DiskLoc firstExt, DiskLoc lastExt)
firstExt has to be == lastExt or a chain
Definition: mmap_v1_extent_manager.cpp:546
Definition: extent_manager.h:181
Definition: data_file.h:43
int size() const
Returns number of files added to the array.
Definition: mmap_v1_extent_manager.h:243
const bool _directoryPerDB
Definition: mmap_v1_extent_manager.h:202
HintType
Definition: extent_manager.h:180
represents a disk location/offset on disk in a database.
Definition: diskloc.h:53
DiskLoc _createExtentInFile(OperationContext *opCtx, int fileNo, DataFile *f, int size, bool enforceQuota)
Definition: mmap_v1_extent_manager.cpp:365
int numFiles() const
Definition: mmap_v1_extent_manager.cpp:278
Uniquely identifies a lockable resource.
Definition: lock_manager_defs.h:176
Definition: record.h:58
stdx::mutex _writersMutex
Definition: mmap_v1_extent_manager.h:251
MmapV1RecordHeader * recordForV1(const DiskLoc &loc) const
Definition: mmap_v1_extent_manager.cpp:303
ExtentManager basics.
Definition: mmap_v1_extent_manager.h:75
Definition: mmap_v1_extent_manager.h:79
virtual CacheHint * cacheHint(const DiskLoc &extentLoc, const HintType &hint)
Tell the system that for this extent, it will have this kind of disk access.
Definition: mmap_v1_extent_manager.cpp:631
DataFile * _addAFile(OperationContext *opCtx, int sizeNeeded, bool preallocateNextFile)
Definition: mmap_v1_extent_manager.cpp:221
void close(OperationContext *opCtx)
Must be called before destruction.
Definition: mmap_v1_extent_manager.h:95
AtomicInt32 _size
Definition: mmap_v1_extent_manager.h:252
DiskLoc extentLocForV1(const DiskLoc &loc) const
Definition: mmap_v1_extent_manager.cpp:330
const DataFile * getOpenFile(int n) const final
Definition: mmap_v1_extent_manager.h:158
void freeListStats(OperationContext *opCtx, int *numExtents, int64_t *totalFreeSizeBytes) const
Retrieve statistics on the the free list managed by this ExtentManger.
Definition: mmap_v1_extent_manager.cpp:600
virtual int maxSize() const
Definition: mmap_v1_extent_manager.cpp:361
FilesArray()
Definition: mmap_v1_extent_manager.h:216
void _setFreeListStart(OperationContext *opCtx, DiskLoc loc)
Definition: mmap_v1_extent_manager.cpp:588
DiskLoc _getFreeListEnd() const
Definition: mmap_v1_extent_manager.cpp:581
Extent * extentForV1(const DiskLoc &loc) const
Definition: mmap_v1_extent_manager.cpp:335
void setFileFormat(OperationContext *opCtx, DataFileVersion newVersion) final
Definition: mmap_v1_extent_manager.cpp:667
Simple wrapper around an array object to allow append-only modification of the array, as well as concurrent read-accesses.
Definition: mmap_v1_extent_manager.h:214
DiskLoc allocateExtent(OperationContext *opCtx, bool capped, int size, bool enforceQuota)
Definition: mmap_v1_extent_manager.cpp:504
void freeExtent(OperationContext *opCtx, DiskLoc extent)
frees a single extent ignores all fields in the Extent except: magic, myLoc, length ...
Definition: mmap_v1_extent_manager.cpp:525
Used to implement likelyInPhysicalMemory() for the MMAP v1 storage engine.
Definition: record_access_tracker.h:49
Status init(OperationContext *opCtx)
opens all current files, not thread safe
Definition: mmap_v1_extent_manager.cpp:142
MmapV1ExtentManager(StringData dbname, StringData path, bool directoryPerDB)
Definition: mmap_v1_extent_manager.cpp:113
DataFile * operator[](int n) const
Returns file at location &#39;n&#39; in the array, with &#39;n&#39; less than number of files added.
Definition: mmap_v1_extent_manager.h:228
ExtentManager basics.
Definition: extent_manager.h:64
DiskLoc _createExtent(OperationContext *opCtx, int approxSize, bool enforceQuota)
Definition: mmap_v1_extent_manager.cpp:385
Definition: diskloc.h:68
const DataFile * _getOpenFile(int fileId) const
Definition: mmap_v1_extent_manager.cpp:207
FilesArray _files
Definition: mmap_v1_extent_manager.h:256
DataFileVersion getFileFormat(OperationContext *opCtx) const final
Not thread safe, requires a database exclusive lock.
Definition: mmap_v1_extent_manager.cpp:659
Collection *const OperationContext *const opCtx
Definition: collection_impl.cpp:80
const std::string _path
Definition: mmap_v1_extent_manager.h:201
Extent * getExtent(const DiskLoc &loc, bool doSanityCheck=true) const
Definition: mmap_v1_extent_manager.cpp:340
Definition: data_file.h:196
MONGO_DISALLOW_COPYING(MmapV1ExtentManager)
DiskLoc _getFreeListStart() const
Definition: mmap_v1_extent_manager.cpp:574
const ResourceId _rid
Definition: mmap_v1_extent_manager.h:203
void close(OperationContext *opCtx)
Must be called before destruction.
Definition: mmap_v1_extent_manager.cpp:644