You've already forked mariadb-columnstore-engine
							
							
				mirror of
				https://github.com/mariadb-corporation/mariadb-columnstore-engine.git
				synced 2025-10-31 18:30:33 +03:00 
			
		
		
		
	
		
			
				
	
	
		
			237 lines
		
	
	
		
			6.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			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
 |