Storage Engine API
extent_manager.h
Go to the documentation of this file.
1 // extent_manager.h
2 
31 #pragma once
32 
33 #include <memory>
34 #include <string>
35 #include <vector>
36 
37 #include "mongo/base/status.h"
38 #include "mongo/base/string_data.h"
40 
41 namespace mongo {
42 
43 class DataFile;
44 class DataFileVersion;
45 class MmapV1RecordHeader;
46 class RecordFetcher;
47 class OperationContext;
48 
49 struct Extent;
50 
66 
67 public:
69 
70  class Factory {
71  public:
72  virtual ~Factory() = default;
73  virtual std::unique_ptr<ExtentManager> create(StringData dbname,
74  StringData path,
75  bool directoryPerDB) = 0;
76  };
77 
78  virtual ~ExtentManager() {}
79 
80  virtual void close(OperationContext* opCtx) = 0;
81 
85  virtual Status init(OperationContext* opCtx) = 0;
86 
87  virtual int numFiles() const = 0;
88  virtual long long fileSize() const = 0;
89 
90  // must call Extent::reuse on the returned extent
91  virtual DiskLoc allocateExtent(OperationContext* opCtx,
92  bool capped,
93  int size,
94  bool enforceQuota) = 0;
95 
99  virtual void freeExtents(OperationContext* opCtx, DiskLoc firstExt, DiskLoc lastExt) = 0;
100 
105  virtual void freeExtent(OperationContext* opCtx, DiskLoc extent) = 0;
106 
113  virtual void freeListStats(OperationContext* opCtx,
114  int* numExtents,
115  int64_t* totalFreeSizeBytes) const = 0;
116 
124  virtual MmapV1RecordHeader* recordForV1(const DiskLoc& loc) const = 0;
125 
132  virtual std::unique_ptr<RecordFetcher> recordNeedsFetch(const DiskLoc& loc) const = 0;
133 
138  virtual Extent* extentForV1(const DiskLoc& loc) const = 0;
139 
144  virtual DiskLoc extentLocForV1(const DiskLoc& loc) const = 0;
145 
149  virtual Extent* getExtent(const DiskLoc& loc, bool doSanityCheck = true) const = 0;
150 
154  virtual int maxSize() const = 0;
155 
159  virtual int minSize() const {
160  return 0x1000;
161  }
162 
167  virtual int followupSize(int recordLen, int lastExtentLen) const;
168 
172  virtual int initialSize(int recordLen) const;
173 
177  virtual int quantizeExtentSize(int size) const;
178 
179  // see cacheHint methods
181  class CacheHint {
182  public:
183  virtual ~CacheHint() {}
184  };
189  virtual CacheHint* cacheHint(const DiskLoc& extentLoc, const HintType& hint) = 0;
190 
191  virtual DataFileVersion getFileFormat(OperationContext* opCtx) const = 0;
192  virtual void setFileFormat(OperationContext* opCtx, DataFileVersion newVersion) = 0;
193 
194  virtual const DataFile* getOpenFile(int n) const = 0;
195 };
196 
197 } // namespace mongo
virtual void freeExtent(OperationContext *opCtx, DiskLoc extent)=0
frees a single extent ignores all fields in the Extent except: magic, myLoc, length ...
virtual long long fileSize() const =0
virtual DiskLoc extentLocForV1(const DiskLoc &loc) const =0
virtual Status init(OperationContext *opCtx)=0
opens all current files
Definition: extent_manager.h:70
Definition: extent.h:50
MONGO_DISALLOW_COPYING(ExtentManager)
Definition: extent_manager.h:180
virtual int numFiles() const =0
virtual void setFileFormat(OperationContext *opCtx, DataFileVersion newVersion)=0
Copyright (C) 2014 MongoDB Inc.
Definition: bson_collection_catalog_entry.cpp:38
Definition: extent_manager.h:180
OperationContext Database StringData BSONObj CollectionOptions::ParseKind bool const BSONObj &idIndex Status
Definition: database_impl.cpp:956
Definition: extent_manager.h:181
Definition: data_file.h:43
virtual ~ExtentManager()
Definition: extent_manager.h:78
virtual std::unique_ptr< RecordFetcher > recordNeedsFetch(const DiskLoc &loc) const =0
The extent manager tracks accesses to DiskLocs.
HintType
Definition: extent_manager.h:180
represents a disk location/offset on disk in a database.
Definition: diskloc.h:53
Definition: record.h:58
virtual void freeExtents(OperationContext *opCtx, DiskLoc firstExt, DiskLoc lastExt)=0
firstExt has to be == lastExt or a chain
virtual std::unique_ptr< ExtentManager > create(StringData dbname, StringData path, bool directoryPerDB)=0
virtual int minSize() const
Definition: extent_manager.h:159
virtual CacheHint * cacheHint(const DiskLoc &extentLoc, const HintType &hint)=0
Tell the system that for this extent, it will have this kind of disk access.
virtual int followupSize(int recordLen, int lastExtentLen) const
Definition: extent_manager.cpp:59
virtual MmapV1RecordHeader * recordForV1(const DiskLoc &loc) const =0
virtual int maxSize() const =0
virtual Extent * getExtent(const DiskLoc &loc, bool doSanityCheck=true) const =0
virtual DiskLoc allocateExtent(OperationContext *opCtx, bool capped, int size, bool enforceQuota)=0
virtual int quantizeExtentSize(int size) const
quantizes extent size to >= min + page boundary
Definition: extent_manager.cpp:37
virtual DataFileVersion getFileFormat(OperationContext *opCtx) const =0
ExtentManager basics.
Definition: extent_manager.h:64
virtual int initialSize(int recordLen) const
get a suggested size for the first extent in a namespace
Definition: extent_manager.cpp:80
virtual Extent * extentForV1(const DiskLoc &loc) const =0
virtual void freeListStats(OperationContext *opCtx, int *numExtents, int64_t *totalFreeSizeBytes) const =0
Retrieve statistics on the the free list managed by this ExtentManger.
Collection *const OperationContext *const opCtx
Definition: collection_impl.cpp:80
virtual ~CacheHint()
Definition: extent_manager.h:183
Definition: data_file.h:196
virtual void close(OperationContext *opCtx)=0
ExtentManager()
Definition: extent_manager.h:68
virtual ~Factory()=default
virtual const DataFile * getOpenFile(int n) const =0