HDFS-7879. hdfs.dll does not export functions of the public libhdfs API. Contributed by Chris Nauroth.
Project: http://git-wip-us.apache.org/repos/asf/hadoop/repo Commit: http://git-wip-us.apache.org/repos/asf/hadoop/commit/aca0abef Tree: http://git-wip-us.apache.org/repos/asf/hadoop/tree/aca0abef Diff: http://git-wip-us.apache.org/repos/asf/hadoop/diff/aca0abef Branch: refs/heads/HDFS-7285 Commit: aca0abefea5b6bd5249d0ee35875a598c1ed1e7c Parents: 871bd4e Author: Haohui Mai <whe...@apache.org> Authored: Wed Mar 4 09:17:21 2015 -0800 Committer: Jing Zhao <ji...@apache.org> Committed: Mon Mar 9 13:11:23 2015 -0700 ---------------------------------------------------------------------- hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt | 3 + .../hadoop-hdfs/src/CMakeLists.txt | 23 +++-- .../hadoop-hdfs/src/main/native/libhdfs/hdfs.h | 92 +++++++++++++++++++- 3 files changed, 111 insertions(+), 7 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hadoop/blob/aca0abef/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt ---------------------------------------------------------------------- diff --git a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt index 2037973..62006d3 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt +++ b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt @@ -1086,6 +1086,9 @@ Release 2.7.0 - UNRELEASED HDFS-7869. Inconsistency in the return information while performing rolling upgrade ( J.Andreina via vinayakumarb ) + HDFS-7879. hdfs.dll does not export functions of the public libhdfs API. + (Chris Nauroth via wheat9) + BREAKDOWN OF HDFS-7584 SUBTASKS AND RELATED JIRAS HDFS-7720. Quota by Storage Type API, tools and ClientNameNode http://git-wip-us.apache.org/repos/asf/hadoop/blob/aca0abef/hadoop-hdfs-project/hadoop-hdfs/src/CMakeLists.txt ---------------------------------------------------------------------- diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/CMakeLists.txt b/hadoop-hdfs-project/hadoop-hdfs/src/CMakeLists.txt index aceeac1..563727b 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/CMakeLists.txt +++ b/hadoop-hdfs-project/hadoop-hdfs/src/CMakeLists.txt @@ -27,7 +27,15 @@ include(../../../hadoop-common-project/hadoop-common/src/JNIFlags.cmake NO_POLIC function(add_dual_library LIBNAME) add_library(${LIBNAME} SHARED ${ARGN}) add_library(${LIBNAME}_static STATIC ${ARGN}) - set_target_properties(${LIBNAME}_static PROPERTIES OUTPUT_NAME ${LIBNAME}) + # Linux builds traditionally ship a libhdfs.a (static linking) and libhdfs.so + # (dynamic linking). On Windows, we cannot use the same base name for both + # static and dynamic, because Windows does not use distinct file extensions + # for a statically linked library vs. a DLL import library. Both use the + # .lib extension. On Windows, we'll build the static library as + # hdfs_static.lib. + if (NOT WIN32) + set_target_properties(${LIBNAME}_static PROPERTIES OUTPUT_NAME ${LIBNAME}) + endif (NOT WIN32) endfunction(add_dual_library) # Link both a static and a dynamic target against some libraries @@ -105,11 +113,14 @@ else (WIN32) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g -Wall -O2") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_REENTRANT -D_GNU_SOURCE") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fvisibility=hidden") set(OS_DIR main/native/libhdfs/os/posix) set(OS_LINK_LIBRARIES pthread) set(OUT_DIR target/usr/local/lib) endif (WIN32) +add_definitions(-DLIBHDFS_DLL_EXPORT) + include_directories( ${GENERATED_JAVAH} ${CMAKE_CURRENT_SOURCE_DIR} @@ -150,7 +161,7 @@ add_executable(test_libhdfs_ops main/native/libhdfs/test/test_libhdfs_ops.c ) target_link_libraries(test_libhdfs_ops - hdfs + hdfs_static ${JAVA_JVM_LIBRARY} ) @@ -158,7 +169,7 @@ add_executable(test_libhdfs_read main/native/libhdfs/test/test_libhdfs_read.c ) target_link_libraries(test_libhdfs_read - hdfs + hdfs_static ${JAVA_JVM_LIBRARY} ) @@ -166,7 +177,7 @@ add_executable(test_libhdfs_write main/native/libhdfs/test/test_libhdfs_write.c ) target_link_libraries(test_libhdfs_write - hdfs + hdfs_static ${JAVA_JVM_LIBRARY} ) @@ -196,7 +207,7 @@ add_executable(test_libhdfs_threaded ${OS_DIR}/thread.c ) target_link_libraries(test_libhdfs_threaded - hdfs + hdfs_static native_mini_dfs ${OS_LINK_LIBRARIES} ) @@ -206,7 +217,7 @@ add_executable(test_libhdfs_zerocopy main/native/libhdfs/test/test_libhdfs_zerocopy.c ) target_link_libraries(test_libhdfs_zerocopy - hdfs + hdfs_static native_mini_dfs ${OS_LINK_LIBRARIES} ) http://git-wip-us.apache.org/repos/asf/hadoop/blob/aca0abef/hadoop-hdfs-project/hadoop-hdfs/src/main/native/libhdfs/hdfs.h ---------------------------------------------------------------------- diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/native/libhdfs/hdfs.h b/hadoop-hdfs-project/hadoop-hdfs/src/main/native/libhdfs/hdfs.h index 3406d6b..64889ed 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/main/native/libhdfs/hdfs.h +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/native/libhdfs/hdfs.h @@ -24,6 +24,30 @@ #include <stdint.h> /* for uint64_t, etc. */ #include <time.h> /* for time_t */ +/* + * Support export of DLL symbols during libhdfs build, and import of DLL symbols + * during client application build. A client application may optionally define + * symbol LIBHDFS_DLL_IMPORT in its build. This is not strictly required, but + * the compiler can produce more efficient code with it. + */ +#ifdef WIN32 + #ifdef LIBHDFS_DLL_EXPORT + #define LIBHDFS_EXTERNAL __declspec(dllexport) + #elif LIBHDFS_DLL_IMPORT + #define LIBHDFS_EXTERNAL __declspec(dllimport) + #else + #define LIBHDFS_EXTERNAL + #endif +#else + #ifdef LIBHDFS_DLL_EXPORT + #define LIBHDFS_EXTERNAL __attribute__((visibility("default"))) + #elif LIBHDFS_DLL_IMPORT + #define LIBHDFS_EXTERNAL __attribute__((visibility("default"))) + #else + #define LIBHDFS_EXTERNAL + #endif +#endif + #ifndef O_RDONLY #define O_RDONLY 1 #endif @@ -77,6 +101,7 @@ extern "C" { * @param file The HDFS file * @return 1 if the file is open for read; 0 otherwise */ + LIBHDFS_EXTERNAL int hdfsFileIsOpenForRead(hdfsFile file); /** @@ -85,6 +110,7 @@ extern "C" { * @param file The HDFS file * @return 1 if the file is open for write; 0 otherwise */ + LIBHDFS_EXTERNAL int hdfsFileIsOpenForWrite(hdfsFile file); struct hdfsReadStatistics { @@ -107,6 +133,7 @@ extern "C" { * ENOTSUP. webhdfs, LocalFilesystem, and so forth may * not support read statistics. */ + LIBHDFS_EXTERNAL int hdfsFileGetReadStatistics(hdfsFile file, struct hdfsReadStatistics **stats); @@ -115,6 +142,7 @@ extern "C" { * * @return the number of remote bytes read. */ + LIBHDFS_EXTERNAL int64_t hdfsReadStatisticsGetRemoteBytesRead( const struct hdfsReadStatistics *stats); @@ -129,6 +157,7 @@ extern "C" { * statistics. * Errno will also be set to this code on failure. */ + LIBHDFS_EXTERNAL int hdfsFileClearReadStatistics(hdfsFile file); /** @@ -136,6 +165,7 @@ extern "C" { * * @param stats The HDFS read statistics to free. */ + LIBHDFS_EXTERNAL void hdfsFileFreeReadStatistics(struct hdfsReadStatistics *stats); /** @@ -147,6 +177,7 @@ extern "C" { * @return Returns a handle to the filesystem or NULL on error. * @deprecated Use hdfsBuilderConnect instead. */ + LIBHDFS_EXTERNAL hdfsFS hdfsConnectAsUser(const char* nn, tPort port, const char *user); /** @@ -157,6 +188,7 @@ extern "C" { * @return Returns a handle to the filesystem or NULL on error. * @deprecated Use hdfsBuilderConnect instead. */ + LIBHDFS_EXTERNAL hdfsFS hdfsConnect(const char* nn, tPort port); /** @@ -170,6 +202,7 @@ extern "C" { * @return Returns a handle to the filesystem or NULL on error. * @deprecated Use hdfsBuilderConnect instead. */ + LIBHDFS_EXTERNAL hdfsFS hdfsConnectAsUserNewInstance(const char* nn, tPort port, const char *user ); /** @@ -182,6 +215,7 @@ extern "C" { * @return Returns a handle to the filesystem or NULL on error. * @deprecated Use hdfsBuilderConnect instead. */ + LIBHDFS_EXTERNAL hdfsFS hdfsConnectNewInstance(const char* nn, tPort port); /** @@ -196,6 +230,7 @@ extern "C" { * @param bld The HDFS builder * @return Returns a handle to the filesystem, or NULL on error. */ + LIBHDFS_EXTERNAL hdfsFS hdfsBuilderConnect(struct hdfsBuilder *bld); /** @@ -203,6 +238,7 @@ extern "C" { * * @return The HDFS builder, or NULL on error. */ + LIBHDFS_EXTERNAL struct hdfsBuilder *hdfsNewBuilder(void); /** @@ -211,6 +247,7 @@ extern "C" { * * @param bld The HDFS builder */ + LIBHDFS_EXTERNAL void hdfsBuilderSetForceNewInstance(struct hdfsBuilder *bld); /** @@ -234,6 +271,7 @@ extern "C" { * hdfsBuilderSetNameNodePort. However, you must not pass the * port in two different ways. */ + LIBHDFS_EXTERNAL void hdfsBuilderSetNameNode(struct hdfsBuilder *bld, const char *nn); /** @@ -242,6 +280,7 @@ extern "C" { * @param bld The HDFS builder * @param port The port. */ + LIBHDFS_EXTERNAL void hdfsBuilderSetNameNodePort(struct hdfsBuilder *bld, tPort port); /** @@ -250,6 +289,7 @@ extern "C" { * @param bld The HDFS builder * @param userName The user name. The string will be shallow-copied. */ + LIBHDFS_EXTERNAL void hdfsBuilderSetUserName(struct hdfsBuilder *bld, const char *userName); /** @@ -260,6 +300,7 @@ extern "C" { * @param kerbTicketCachePath The Kerberos ticket cache path. The string * will be shallow-copied. */ + LIBHDFS_EXTERNAL void hdfsBuilderSetKerbTicketCachePath(struct hdfsBuilder *bld, const char *kerbTicketCachePath); @@ -271,6 +312,7 @@ extern "C" { * * @param bld The HDFS builder */ + LIBHDFS_EXTERNAL void hdfsFreeBuilder(struct hdfsBuilder *bld); /** @@ -284,6 +326,7 @@ extern "C" { * * @return 0 on success; nonzero error code otherwise. */ + LIBHDFS_EXTERNAL int hdfsBuilderConfSetStr(struct hdfsBuilder *bld, const char *key, const char *val); @@ -298,6 +341,7 @@ extern "C" { * @return 0 on success; nonzero error code otherwise. * Failure to find the key is not an error. */ + LIBHDFS_EXTERNAL int hdfsConfGetStr(const char *key, char **val); /** @@ -310,6 +354,7 @@ extern "C" { * @return 0 on success; nonzero error code otherwise. * Failure to find the key is not an error. */ + LIBHDFS_EXTERNAL int hdfsConfGetInt(const char *key, int32_t *val); /** @@ -317,6 +362,7 @@ extern "C" { * * @param val A configuration string obtained from hdfsConfGetStr */ + LIBHDFS_EXTERNAL void hdfsConfStrFree(char *val); /** @@ -327,6 +373,7 @@ extern "C" { * Even if there is an error, the resources associated with the * hdfsFS will be freed. */ + LIBHDFS_EXTERNAL int hdfsDisconnect(hdfsFS fs); @@ -344,6 +391,7 @@ extern "C" { * default configured values. * @return Returns the handle to the open file or NULL on error. */ + LIBHDFS_EXTERNAL hdfsFile hdfsOpenFile(hdfsFS fs, const char* path, int flags, int bufferSize, short replication, tSize blocksize); @@ -355,6 +403,7 @@ extern "C" { * ENOTSUP if the file does not support unbuffering * Errno will also be set to this value. */ + LIBHDFS_EXTERNAL int hdfsUnbufferFile(hdfsFile file); /** @@ -367,6 +416,7 @@ extern "C" { * be freed at the end of this call, even if there was an I/O * error. */ + LIBHDFS_EXTERNAL int hdfsCloseFile(hdfsFS fs, hdfsFile file); @@ -376,6 +426,7 @@ extern "C" { * @param path The path to look for * @return Returns 0 on success, -1 on error. */ + LIBHDFS_EXTERNAL int hdfsExists(hdfsFS fs, const char *path); @@ -387,6 +438,7 @@ extern "C" { * @param desiredPos Offset into the file to seek into. * @return Returns 0 on success, -1 on error. */ + LIBHDFS_EXTERNAL int hdfsSeek(hdfsFS fs, hdfsFile file, tOffset desiredPos); @@ -396,6 +448,7 @@ extern "C" { * @param file The file handle. * @return Current offset, -1 on error. */ + LIBHDFS_EXTERNAL tOffset hdfsTell(hdfsFS fs, hdfsFile file); @@ -413,6 +466,7 @@ extern "C" { * and set errno to EINTR if data is temporarily unavailable, * but we are not yet at the end of the file. */ + LIBHDFS_EXTERNAL tSize hdfsRead(hdfsFS fs, hdfsFile file, void* buffer, tSize length); /** @@ -424,6 +478,7 @@ extern "C" { * @param length The length of the buffer. * @return See hdfsRead */ + LIBHDFS_EXTERNAL tSize hdfsPread(hdfsFS fs, hdfsFile file, tOffset position, void* buffer, tSize length); @@ -436,6 +491,7 @@ extern "C" { * @param length The no. of bytes to write. * @return Returns the number of bytes written, -1 on error. */ + LIBHDFS_EXTERNAL tSize hdfsWrite(hdfsFS fs, hdfsFile file, const void* buffer, tSize length); @@ -446,6 +502,7 @@ extern "C" { * @param file The file handle. * @return Returns 0 on success, -1 on error. */ + LIBHDFS_EXTERNAL int hdfsFlush(hdfsFS fs, hdfsFile file); @@ -456,6 +513,7 @@ extern "C" { * @param file file handle * @return 0 on success, -1 on error and sets errno */ + LIBHDFS_EXTERNAL int hdfsHFlush(hdfsFS fs, hdfsFile file); @@ -467,6 +525,7 @@ extern "C" { * @param file file handle * @return 0 on success, -1 on error and sets errno */ + LIBHDFS_EXTERNAL int hdfsHSync(hdfsFS fs, hdfsFile file); @@ -477,6 +536,7 @@ extern "C" { * @param file The file handle. * @return Returns available bytes; -1 on error. */ + LIBHDFS_EXTERNAL int hdfsAvailable(hdfsFS fs, hdfsFile file); @@ -488,6 +548,7 @@ extern "C" { * @param dst The path of destination file. * @return Returns 0 on success, -1 on error. */ + LIBHDFS_EXTERNAL int hdfsCopy(hdfsFS srcFS, const char* src, hdfsFS dstFS, const char* dst); @@ -499,6 +560,7 @@ extern "C" { * @param dst The path of destination file. * @return Returns 0 on success, -1 on error. */ + LIBHDFS_EXTERNAL int hdfsMove(hdfsFS srcFS, const char* src, hdfsFS dstFS, const char* dst); @@ -511,6 +573,7 @@ extern "C" { * case of a file the recursive argument is irrelevant. * @return Returns 0 on success, -1 on error. */ + LIBHDFS_EXTERNAL int hdfsDelete(hdfsFS fs, const char* path, int recursive); /** @@ -520,6 +583,7 @@ extern "C" { * @param newPath The path of the destination file. * @return Returns 0 on success, -1 on error. */ + LIBHDFS_EXTERNAL int hdfsRename(hdfsFS fs, const char* oldPath, const char* newPath); @@ -531,6 +595,7 @@ extern "C" { * @param bufferSize The length of user-buffer. * @return Returns buffer, NULL on error. */ + LIBHDFS_EXTERNAL char* hdfsGetWorkingDirectory(hdfsFS fs, char *buffer, size_t bufferSize); @@ -541,6 +606,7 @@ extern "C" { * @param path The path of the new 'cwd'. * @return Returns 0 on success, -1 on error. */ + LIBHDFS_EXTERNAL int hdfsSetWorkingDirectory(hdfsFS fs, const char* path); @@ -551,6 +617,7 @@ extern "C" { * @param path The path of the directory. * @return Returns 0 on success, -1 on error. */ + LIBHDFS_EXTERNAL int hdfsCreateDirectory(hdfsFS fs, const char* path); @@ -561,6 +628,7 @@ extern "C" { * @param path The path of the file. * @return Returns 0 on success, -1 on error. */ + LIBHDFS_EXTERNAL int hdfsSetReplication(hdfsFS fs, const char* path, int16_t replication); @@ -590,6 +658,7 @@ extern "C" { * @return Returns a dynamically-allocated array of hdfsFileInfo * objects; NULL on error. */ + LIBHDFS_EXTERNAL hdfsFileInfo *hdfsListDirectory(hdfsFS fs, const char* path, int *numEntries); @@ -603,6 +672,7 @@ extern "C" { * @return Returns a dynamically-allocated hdfsFileInfo object; * NULL on error. */ + LIBHDFS_EXTERNAL hdfsFileInfo *hdfsGetPathInfo(hdfsFS fs, const char* path); @@ -612,6 +682,7 @@ extern "C" { * objects. * @param numEntries The size of the array. */ + LIBHDFS_EXTERNAL void hdfsFreeFileInfo(hdfsFileInfo *hdfsFileInfo, int numEntries); /** @@ -620,6 +691,7 @@ extern "C" { * @return -1 if there was an error (errno will be set), 0 if the file is * not encrypted, 1 if the file is encrypted. */ + LIBHDFS_EXTERNAL int hdfsFileIsEncrypted(hdfsFileInfo *hdfsFileInfo); @@ -635,6 +707,7 @@ extern "C" { * @return Returns a dynamically-allocated 2-d array of blocks-hosts; * NULL on error. */ + LIBHDFS_EXTERNAL char*** hdfsGetHosts(hdfsFS fs, const char* path, tOffset start, tOffset length); @@ -645,6 +718,7 @@ extern "C" { * objects. * @param numEntries The size of the array. */ + LIBHDFS_EXTERNAL void hdfsFreeHosts(char ***blockHosts); @@ -656,6 +730,7 @@ extern "C" { * * @return Returns the default blocksize, or -1 on error. */ + LIBHDFS_EXTERNAL tOffset hdfsGetDefaultBlockSize(hdfsFS fs); @@ -669,6 +744,7 @@ extern "C" { * * @return Returns the default blocksize, or -1 on error. */ + LIBHDFS_EXTERNAL tOffset hdfsGetDefaultBlockSizeAtPath(hdfsFS fs, const char *path); @@ -677,6 +753,7 @@ extern "C" { * @param fs The configured filesystem handle. * @return Returns the raw-capacity; -1 on error. */ + LIBHDFS_EXTERNAL tOffset hdfsGetCapacity(hdfsFS fs); @@ -685,6 +762,7 @@ extern "C" { * @param fs The configured filesystem handle. * @return Returns the total-size; -1 on error. */ + LIBHDFS_EXTERNAL tOffset hdfsGetUsed(hdfsFS fs); /** @@ -696,6 +774,7 @@ extern "C" { * @param group Group string. Set to NULL for 'no change' * @return 0 on success else -1 */ + LIBHDFS_EXTERNAL int hdfsChown(hdfsFS fs, const char* path, const char *owner, const char *group); @@ -706,7 +785,8 @@ extern "C" { * @param mode the bitmask to set it to * @return 0 on success else -1 */ - int hdfsChmod(hdfsFS fs, const char* path, short mode); + LIBHDFS_EXTERNAL + int hdfsChmod(hdfsFS fs, const char* path, short mode); /** * hdfsUtime @@ -716,6 +796,7 @@ extern "C" { * @param atime new access time or -1 for no change * @return 0 on success else -1 */ + LIBHDFS_EXTERNAL int hdfsUtime(hdfsFS fs, const char* path, tTime mtime, tTime atime); /** @@ -728,6 +809,7 @@ extern "C" { * not be allocated. If NULL is returned, errno will * contain the error number. */ + LIBHDFS_EXTERNAL struct hadoopRzOptions *hadoopRzOptionsAlloc(void); /** @@ -739,6 +821,7 @@ extern "C" { * * @return 0 on success; -1 plus errno on failure. */ + LIBHDFS_EXTERNAL int hadoopRzOptionsSetSkipChecksum( struct hadoopRzOptions *opts, int skip); @@ -756,6 +839,7 @@ extern "C" { * instantiated; * -1 plus errno otherwise. */ + LIBHDFS_EXTERNAL int hadoopRzOptionsSetByteBufferPool( struct hadoopRzOptions *opts, const char *className); @@ -765,6 +849,7 @@ extern "C" { * @param opts The options structure to free. * Any associated ByteBufferPool will also be freed. */ + LIBHDFS_EXTERNAL void hadoopRzOptionsFree(struct hadoopRzOptions *opts); /** @@ -790,6 +875,7 @@ extern "C" { * zero-copy read, and there was no ByteBufferPool * supplied. */ + LIBHDFS_EXTERNAL struct hadoopRzBuffer* hadoopReadZero(hdfsFile file, struct hadoopRzOptions *opts, int32_t maxLength); @@ -799,6 +885,7 @@ extern "C" { * @param buffer a buffer returned from readZero. * @return the length of the buffer. */ + LIBHDFS_EXTERNAL int32_t hadoopRzBufferLength(const struct hadoopRzBuffer *buffer); /** @@ -811,6 +898,7 @@ extern "C" { * @return a pointer to the start of the buffer. This will be * NULL when end-of-file has been reached. */ + LIBHDFS_EXTERNAL const void *hadoopRzBufferGet(const struct hadoopRzBuffer *buffer); /** @@ -820,12 +908,14 @@ extern "C" { * the same stream you called hadoopReadZero on. * @param buffer The buffer to release. */ + LIBHDFS_EXTERNAL void hadoopRzBufferFree(hdfsFile file, struct hadoopRzBuffer *buffer); #ifdef __cplusplus } #endif +#undef LIBHDFS_EXTERNAL #endif /*LIBHDFS_HDFS_H*/ /**