1
0
mirror of https://github.com/mariadb-corporation/mariadb-columnstore-engine.git synced 2025-04-24 18:27:02 +03:00
Roman Nozdrin 4fe9cd64a3
Revert "No boost condition (#2822)" (#2828)
This reverts commit f916e64927cd81569327014f20c4cc0b8aca40ff.
2023-04-22 15:49:50 +03:00

237 lines
6.9 KiB
C++

/* Copyright (C) 2014 InfiniDB, Inc.
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; version 2 of
the License.
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 General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
MA 02110-1301, USA. */
#pragma once
#include <string>
#include <vector>
#include <stdint.h>
#include <boost/thread/mutex.hpp>
#include "IDBDataFile.h"
#include "IDBFileSystem.h"
#include "IDBFactory.h"
namespace idbdatafile
{
/**
* IDBPolicy is a static class that is used to manage the interaction
* between the rest of infinidb and the idbdatafile subsystem. It supports
* mapping from a file/directory path and context (currently PrimProc or
* WriteEngineServer) to a file and filesystem type
*/
class IDBPolicy
{
public:
/**
* Define the contexts recognized by IDBPolicy. The same file may be
* opened as a different type depending on the context (for ex. data
* files are buffered in WriteEngine and Unbuffered in PrimProc).
*/
enum Contexts
{
PRIMPROC,
WRITEENG
};
/**
* Config the IDBPolicy based on the Columnstore.xml
*/
static void configIDBPolicy();
/**
* Initialize the IDBDataFile subsystem. This should be called once
* by the main thread of the application prior to any other use of the
* library.
* bEnableLogging -- for debug only.
* bUseRdwrMemBuffer -- If true, use Memory Buffered files (class HdfsRdwrMemBuffer) until
* hdfsRdwrBufferMaxSize memory is used, then switch to file buffering until mem used is below
* hdfsRdwrBufferMaxSize. hdfsRdwrScratch -- where to store file-buffered HDFS files (class
* HdfsRdwrFileBuffer) - it should name a writable directory with sufficient space to store all needed
* buffers (size-TBD?). hdfsRdwrBufferMaxSize -- When RdwrMemBuffers get this big, switch to file buffers .
*/
static void init(bool bEnableLogging, bool bUseRdwrMemBuffer, const std::string& hdfsRdwrScratch,
int64_t hdfsRdwrBufferMaxSize);
/**
* Load a new filetype plugin. Return value indicates success(true)
* or failure (false)
*/
static bool installPlugin(const std::string& plugin);
/**
* Accessor method that returns whether or not HDFS is enabled
*/
static bool useHdfs();
/**
* Accessor method that returns whether or not cloud IO is enabled
*/
static bool useCloud();
/**
* Checks for disk space preallocation feature status for a dbroot
*/
static bool PreallocSpaceDisabled(uint16_t dbRoot);
/**
* Accessor method that returns whether to use HDFS memory buffers
*/
static bool useRdwrMemBuffer();
/**
* Accessor method that returns the max amount of mem buff to use before switching to file buffering
*/
static size_t hdfsRdwrBufferMaxSize();
/**
* Accessor method that returns the directory to place our temp hdfs buffer files
*/
static const std::string& hdfsRdwrScratch();
/**
* getType() returns the proper IDBDataFile::Types for a file given a
* path for the path and a context in which it will be interacted with.
*/
static IDBDataFile::Types getType(const std::string& path, Contexts ctxt);
/**
* getFs() returns a reference to the proper IDBFileSystem instance that
* is able to interact with the file/directory specified by path
*/
static IDBFileSystem& getFs(const std::string& path);
/**
* These are convenience functions that simplify the syntax required to
* make a filesystem call. Each of the calls determines the proper
* FileSystem to reference for the specified path and then performs the
* actual call. Documentation for these will not be duplicated here -
* please see IDBFileSystem.h.
*/
static int mkdir(const char* pathname);
static off64_t size(const char* path);
static off64_t compressedSize(const char* path);
static int remove(const char* pathname);
static int rename(const char* oldpath, const char* newpath);
static bool exists(const char* pathname);
static int listDirectory(const char* pathname, std::list<std::string>& contents);
static bool isDir(const char* pathname);
static int copyFile(const char* srcPath, const char* destPath);
/**
* This is used in WE shared components Unit Tests
*/
static void enablePreallocSpace(uint16_t dbRoot);
private:
/**
* don't allow this class to be constructed. It exposes a purely
* static interface
*/
IDBPolicy();
static bool isLocalFile(const std::string& path);
static bool s_usehdfs;
static bool s_usecloud;
static std::vector<uint16_t> s_PreallocSpace;
static bool s_bUseRdwrMemBuffer;
static std::string s_hdfsRdwrScratch;
static int64_t s_hdfsRdwrBufferMaxSize;
static bool s_configed;
static boost::mutex s_mutex;
};
inline const std::string& IDBPolicy::hdfsRdwrScratch()
{
return s_hdfsRdwrScratch;
}
inline bool IDBPolicy::useHdfs()
{
return s_usehdfs;
}
inline bool IDBPolicy::useCloud()
{
return s_usecloud;
}
// MCOL-498 Looking for dbRoot in the List set in configIDBPolicy.
inline bool IDBPolicy::PreallocSpaceDisabled(uint16_t dbRoot)
{
std::vector<uint16_t>::iterator dbRootIter = find(s_PreallocSpace.begin(), s_PreallocSpace.end(), dbRoot);
return dbRootIter == s_PreallocSpace.end();
}
inline bool IDBPolicy::useRdwrMemBuffer()
{
return s_bUseRdwrMemBuffer;
}
inline size_t IDBPolicy::hdfsRdwrBufferMaxSize()
{
return s_hdfsRdwrBufferMaxSize;
}
inline int IDBPolicy::mkdir(const char* pathname)
{
return IDBPolicy::getFs(pathname).mkdir(pathname);
}
inline off64_t IDBPolicy::size(const char* path)
{
return IDBPolicy::getFs(path).size(path);
}
inline off64_t IDBPolicy::compressedSize(const char* path)
{
return IDBPolicy::getFs(path).compressedSize(path);
}
inline int IDBPolicy::remove(const char* pathname)
{
return IDBPolicy::getFs(pathname).remove(pathname);
}
inline int IDBPolicy::rename(const char* oldpath, const char* newpath)
{
return IDBPolicy::getFs(oldpath).rename(oldpath, newpath);
}
inline bool IDBPolicy::exists(const char* pathname)
{
return IDBPolicy::getFs(pathname).exists(pathname);
}
inline int IDBPolicy::listDirectory(const char* pathname, std::list<std::string>& contents)
{
return IDBPolicy::getFs(pathname).listDirectory(pathname, contents);
}
inline bool IDBPolicy::isDir(const char* pathname)
{
return IDBPolicy::getFs(pathname).isDir(pathname);
}
inline int IDBPolicy::copyFile(const char* srcPath, const char* destPath)
{
return IDBPolicy::getFs(srcPath).copyFile(srcPath, destPath);
}
} // namespace idbdatafile