// storage_engine.h
/**
* Copyright (C) 2014 MongoDB Inc.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License, version 3,
* as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see .
*
* As a special exception, the copyright holders give permission to link the
* code of portions of this program with the OpenSSL library under certain
* conditions as described in each individual source file and distribute
* linked combinations including the program with the OpenSSL library. You
* must comply with the GNU Affero General Public License in all respects for
* all of the code used other than as permitted herein. If you modify file(s)
* with this exception, you may extend this exception to your version of the
* file(s), but you are not obligated to do so. If you do not wish to do so,
* delete this exception statement from your version. If you delete this
* exception statement from all source files in the program, then also delete
* it in the license file.
*/
#pragma once
#include
#include
#include "mongo/base/status.h"
namespace mongo {
class DatabaseCatalogEntry;
class OperationContext;
class RecoveryUnit;
struct StorageGlobalParams;
/**
* The StorageEngine class is the top level interface for creating a new storage
* engine. All StorageEngine(s) must be registered by calling registerFactory in order
* to possibly be activated.
*/
class StorageEngine {
public:
/**
* The interface for creating new instances of storage engines.
*
* A storage engine provides an instance of this class (along with an associated
* name) to the global environment, which then sets the global storage engine
* according to the provided configuration parameter.
*/
class Factory {
public:
virtual ~Factory() { }
/**
* Return a new instance of the StorageEngine. Caller owns the returned pointer.
*/
virtual StorageEngine* create(const StorageGlobalParams& params) const = 0;
};
/**
* Called after the globalStorageEngine pointer has been set up, before any other methods
* are called. Any initialization work that requires the ability to create OperationContexts
* should be done here rather than in the constructor.
*/
virtual void finishInit() {}
/**
* Returns a new interface to the storage engine's recovery unit. The recovery
* unit is the durability interface. For details, see recovery_unit.h
*
* Caller owns the returned pointer.
*/
virtual RecoveryUnit* newRecoveryUnit( OperationContext* opCtx ) = 0;
/**
* List the databases stored in this storage engine.
*
* XXX: why doesn't this take OpCtx?
*/
virtual void listDatabases( std::vector* out ) const = 0;
/**
* Return the DatabaseCatalogEntry that describes the database indicated by 'db'.
*
* StorageEngine owns returned pointer.
* It should not be deleted by any caller.
*/
virtual DatabaseCatalogEntry* getDatabaseCatalogEntry( OperationContext* opCtx,
const StringData& db ) = 0;
/**
* Returns whether the storage engine supports its own locking locking below the collection
* level. If the engine returns true, MongoDB will acquire intent locks down to the
* collection level and will assume that the engine will ensure consistency at the level of
* documents. If false, MongoDB will lock the entire collection in Shared/Exclusive mode
* for read/write operations respectively.
*/
virtual bool supportsDocLocking() const = 0;
/**
* Closes all file handles associated with a database.
*/
virtual Status closeDatabase( OperationContext* txn, const StringData& db ) = 0;
/**
* Deletes all data and metadata for a database.
*/
virtual Status dropDatabase( OperationContext* txn, const StringData& db ) = 0;
/**
* @return number of files flushed
*/
virtual int flushAllFiles( bool sync ) = 0;
virtual Status repairDatabase( OperationContext* txn,
const std::string& dbName,
bool preserveClonedFilesOnFailure = false,
bool backupOriginalFiles = false ) = 0;
/**
* This method will be called before there is a clean shutdown. Storage engines should
* override this method if they have clean-up to do that is different from unclean shutdown.
* MongoDB will not call into the storage subsystem after calling this function.
*
* There is intentionally no uncleanShutdown().
*/
virtual void cleanShutdown(OperationContext* txn) {}
protected:
/**
* The destructor will never be called. See cleanShutdown instead.
*/
virtual ~StorageEngine() {}
};
} // namespace mongo