diff --git a/hadoop-hdfs-project/hadoop-hdfs-native-client/src/main/native/libhdfspp/include/hdfspp/hdfspp.h b/hadoop-hdfs-project/hadoop-hdfs-native-client/src/main/native/libhdfspp/include/hdfspp/hdfspp.h index 4b88fe5ef6..78ad594b42 100644 --- a/hadoop-hdfs-project/hadoop-hdfs-native-client/src/main/native/libhdfspp/include/hdfspp/hdfspp.h +++ b/hadoop-hdfs-project/hadoop-hdfs-native-client/src/main/native/libhdfspp/include/hdfspp/hdfspp.h @@ -155,18 +155,25 @@ class FileSystem { * initializes the RPC connections to the NameNode and returns an * FileSystem object. * + * Note: The FileSystem takes ownership of the IoService passed in the + * constructor. The FileSystem destructor will call delete on it. + * * If user_name is blank, the current user will be used for a default. **/ - static FileSystem * New( + static FileSystem *New( IoService *&io_service, const std::string &user_name, const Options &options); - virtual void Connect(const std::string &server, - const std::string &service, + /** + * Returns a new instance with default user and option, with the default IOService. + **/ + static FileSystem *New(); + + + virtual void Connect(const std::string &server, const std::string &service, const std::function &handler) = 0; /* Synchronous call of Connect */ - virtual Status Connect(const std::string &server, - const std::string &service) = 0; + virtual Status Connect(const std::string &server, const std::string &service) = 0; /** diff --git a/hadoop-hdfs-project/hadoop-hdfs-native-client/src/main/native/libhdfspp/lib/fs/filesystem.cc b/hadoop-hdfs-project/hadoop-hdfs-native-client/src/main/native/libhdfspp/lib/fs/filesystem.cc index d75939fd93..aa6f4ba4a4 100644 --- a/hadoop-hdfs-project/hadoop-hdfs-native-client/src/main/native/libhdfspp/lib/fs/filesystem.cc +++ b/hadoop-hdfs-project/hadoop-hdfs-native-client/src/main/native/libhdfspp/lib/fs/filesystem.cc @@ -40,6 +40,9 @@ using ::asio::ip::tcp; static constexpr uint16_t kDefaultPort = 8020; +// forward declarations +const std::string get_effective_user_name(const std::string &); + uint32_t FileSystem::GetDefaultFindMaxDepth() { return std::numeric_limits::max(); } @@ -72,11 +75,21 @@ Status FileSystem::CheckValidReplication(uint16_t replication) { * FILESYSTEM BASE CLASS ****************************************************************************/ -FileSystem * FileSystem::New( +FileSystem *FileSystem::New( IoService *&io_service, const std::string &user_name, const Options &options) { return new FileSystemImpl(io_service, user_name, options); } +FileSystem *FileSystem::New() { + // No, this pointer won't be leaked. The FileSystem takes ownership. + IoService *io_service = IoService::New(); + if(!io_service) + return nullptr; + std::string user_name = get_effective_user_name(""); + Options options; + return new FileSystemImpl(io_service, user_name, options); +} + /***************************************************************************** * FILESYSTEM IMPLEMENTATION ****************************************************************************/