HDFS-7188. support build libhdfs3 on windows (Thanh Do via Colin P. McCabe)
diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/CMake/Options.cmake b/hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/CMake/Options.cmake
index b957c40..738e404 100644
--- a/hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/CMake/Options.cmake
+++ b/hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/CMake/Options.cmake
@@ -63,6 +63,7 @@
# In Visual Studio 2013, this option will use SS4.2 instructions
# if available. Not sure about the behaviour in Visual Studio 2010.
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /arch:SSE2")
+ ADD_DEFINITIONS(-D__SSE4_2__)
ELSE(MSVC)
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -msse4.2")
ENDIF(MSVC)
@@ -80,25 +81,29 @@
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wl,-bind_at_load")
ENDIF(OS_MACOSX AND CMAKE_COMPILER_IS_GNUCXX)
-
IF(OS_LINUX)
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wl,--export-dynamic")
ENDIF(OS_LINUX)
+IF(MSVC)
+ # Always enable boost for windows as VC does not support some C++11 features,
+ # such as nested exception.
+ IF(ENABLE_BOOST STREQUAL OFF)
+ ADD_DEFINITIONS(-DNEED_BOOST)
+ ENDIF(ENABLE_BOOST STREQUAL OFF)
+ # Find boost libraries with flavor: mt-sgd (multi-thread, static, and debug)
+ SET(Boost_USE_STATIC_LIBS ON)
+ SET(Boost_USE_MULTITHREADED ON)
+ SET(Boost_USE_STATIC_RUNTIME ON)
+ FIND_PACKAGE(Boost 1.53 COMPONENTS thread chrono system atomic iostreams REQUIRED)
+ INCLUDE_DIRECTORIES("${Boost_INCLUDE_DIRS}")
+ LINK_DIRECTORIES("${Boost_LIBRARY_DIRS}")
+ENDIF(MSVC)
+
SET(BOOST_ROOT ${CMAKE_PREFIX_PATH})
IF(ENABLE_BOOST STREQUAL ON)
MESSAGE(STATUS "using boost instead of native compiler c++0x support.")
- IF(MSVC)
- # Find boost libraries with flavor: mt-sgd (multi-thread, static, and debug)
- SET(Boost_USE_STATIC_LIBS ON)
- SET(Boost_USE_MULTITHREADED ON)
- SET(Boost_USE_STATIC_RUNTIME ON)
- FIND_PACKAGE(Boost 1.53 COMPONENTS thread chrono system atomic iostreams REQUIRED)
- INCLUDE_DIRECTORIES("${Boost_INCLUDE_DIRS}")
- LINK_DIRECTORIES("${Boost_LIBRARY_DIRS}")
- ELSE(MSVC)
- FIND_PACKAGE(Boost 1.53 REQUIRED)
- ENDIF(MSVC)
+ FIND_PACKAGE(Boost 1.53 REQUIRED)
SET(NEED_BOOST true CACHE INTERNAL "boost is required")
ELSE(ENABLE_BOOST STREQUAL ON)
SET(NEED_BOOST false CACHE INTERNAL "boost is required")
@@ -157,6 +162,8 @@
ENDIF(ENABLE_LIBCPP STREQUAL ON)
ELSEIF(MSVC)
SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MTd")
+ ADD_DEFINITIONS(-D_CRT_SECURE_NO_WARNINGS)
+ ADD_DEFINITIONS(-D_SCL_SECURE_NO_WARNINGS)
ENDIF(CMAKE_COMPILER_IS_GNUCXX)
TRY_COMPILE(STRERROR_R_RETURN_INT
diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/os/posix/Platform.cc b/hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/os/posix/Platform.cc
new file mode 100644
index 0000000..5747eb9
--- /dev/null
+++ b/hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/os/posix/Platform.cc
@@ -0,0 +1,344 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "platform.h"
+#include "Exception.h"
+#include "ExceptionInternal.h"
+#include "Logger.h"
+#include "UnorderedMap.h"
+#include "client/KerberosName.h"
+#include "client/UserInfo.h"
+#include "network/Syscall.h"
+#include "network/TcpSocket.h"
+#include "server/NamenodeProxy.h"
+
+#include <algorithm>
+#include <arpa/inet.h>
+#include <cassert>
+#include <climits>
+#include <cstring>
+#include <errno.h>
+#include <fcntl.h>
+#include <ifaddrs.h>
+#include <inttypes.h>
+#include <iostream>
+#include <netdb.h>
+#include <netinet/in.h>
+#include <netinet/tcp.h>
+#include <poll.h>
+#include <pwd.h>
+#include <regex.h>
+#include <stdint.h>
+#include <string>
+#include <sys/socket.h>
+#include <sys/types.h>
+#include <unistd.h>
+#include <vector>
+
+#include <sstream>
+
+namespace hdfs {
+namespace internal {
+
+/* InputStreamImpl.cc */
+unordered_set<std::string> BuildLocalAddrSet() {
+ unordered_set<std::string> set;
+ struct ifaddrs *ifAddr = NULL;
+ struct ifaddrs *pifAddr = NULL;
+ struct sockaddr *addr;
+
+ if (getifaddrs(&ifAddr)) {
+ THROW(HdfsNetworkException,
+ "InputStreamImpl: cannot get local network interface: %s",
+ GetSystemErrorInfo(errno));
+ }
+
+ try {
+ std::vector<char> host;
+ const char *pHost;
+ host.resize(INET6_ADDRSTRLEN + 1);
+
+ for (pifAddr = ifAddr; pifAddr != NULL; pifAddr = pifAddr->ifa_next) {
+ addr = pifAddr->ifa_addr;
+ memset(&host[0], 0, INET6_ADDRSTRLEN + 1);
+
+ if (addr->sa_family == AF_INET) {
+ pHost = inet_ntop(
+ addr->sa_family,
+ &(reinterpret_cast<struct sockaddr_in *>(addr))->sin_addr,
+ &host[0], INET6_ADDRSTRLEN);
+ } else if (addr->sa_family == AF_INET6) {
+ pHost = inet_ntop(
+ addr->sa_family,
+ &(reinterpret_cast<struct sockaddr_in6 *>(addr))->sin6_addr,
+ &host[0], INET6_ADDRSTRLEN);
+ } else {
+ continue;
+ }
+
+ if (NULL == pHost) {
+ THROW(HdfsNetworkException,
+ "InputStreamImpl: cannot get convert network address "
+ "to textual form: %s",
+ GetSystemErrorInfo(errno));
+ }
+
+ set.insert(pHost);
+ }
+
+ /*
+ * add hostname.
+ */
+ long hostlen = sysconf(_SC_HOST_NAME_MAX);
+ host.resize(hostlen + 1);
+
+ if (gethostname(&host[0], host.size())) {
+ THROW(HdfsNetworkException,
+ "InputStreamImpl: cannot get hostname: %s",
+ GetSystemErrorInfo(errno));
+ }
+
+ set.insert(&host[0]);
+ } catch (...) {
+ if (ifAddr != NULL) {
+ freeifaddrs(ifAddr);
+ }
+
+ throw;
+ }
+
+ if (ifAddr != NULL) {
+ freeifaddrs(ifAddr);
+ }
+
+ return set;
+}
+
+/* TpcSocket.cc */
+void TcpSocketImpl::setBlockMode(bool enable) {
+ int flag;
+ flag = syscalls::fcntl(sock, F_GETFL, 0);
+
+ if (-1 == flag) {
+ THROW(HdfsNetworkException, "Get socket flag failed for remote node %s: %s",
+ remoteAddr.c_str(), GetSystemErrorInfo(errno));
+ }
+
+ flag = enable ? (flag & ~O_NONBLOCK) : (flag | O_NONBLOCK);
+
+ if (-1 == syscalls::fcntl(sock, F_SETFL, flag)) {
+ THROW(HdfsNetworkException, "Set socket flag failed for remote "
+ "node %s: %s", remoteAddr.c_str(), GetSystemErrorInfo(errno));
+ }
+}
+
+/* NamenodeProxy.cc */
+static uint32_t GetInitNamenodeIndex(const std::string &id) {
+ std::string path = "/tmp/";
+ path += id;
+ int fd;
+ uint32_t index = 0;
+ /*
+ * try create the file
+ */
+ fd = open(path.c_str(), O_WRONLY | O_CREAT | O_EXCL, 0666);
+
+ if (fd < 0) {
+ if (errno == EEXIST) {
+ /*
+ * the file already exist, try to open it
+ */
+ fd = open(path.c_str(), O_RDONLY);
+ } else {
+ /*
+ * failed to create, do not care why
+ */
+ return 0;
+ }
+ } else {
+ if (0 != flock(fd, LOCK_EX)) {
+ /*
+ * failed to lock
+ */
+ close(fd);
+ return index;
+ }
+
+ /*
+ * created file, initialize it with 0
+ */
+ write(fd, &index, sizeof(index));
+ flock(fd, LOCK_UN);
+ close(fd);
+ return index;
+ }
+
+ /*
+ * the file exist, read it.
+ */
+ if (fd >= 0) {
+ if (0 != flock(fd, LOCK_SH)) {
+ /*
+ * failed to lock
+ */
+ close(fd);
+ return index;
+ }
+
+ if (sizeof(index) != read(fd, &index, sizeof(index))) {
+ /*
+ * failed to read, do not care why
+ */
+ index = 0;
+ }
+
+ flock(fd, LOCK_UN);
+ close(fd);
+ }
+
+ return index;
+}
+
+static void SetInitNamenodeIndex(const std::string &id, uint32_t index) {
+ std::string path = "/tmp/";
+ path += id;
+ int fd;
+ /*
+ * try open the file for write
+ */
+ fd = open(path.c_str(), O_WRONLY);
+
+ if (fd > 0) {
+ if (0 != flock(fd, LOCK_EX)) {
+ /*
+ * failed to lock
+ */
+ close(fd);
+ return;
+ }
+
+ write(fd, &index, sizeof(index));
+ flock(fd, LOCK_UN);
+ close(fd);
+ }
+}
+
+/* KerberosName.cc */
+static void HandleRegError(int rc, regex_t *comp) {
+ std::vector<char> buffer;
+ size_t size = regerror(rc, comp, NULL, 0);
+ buffer.resize(size + 1);
+ regerror(rc, comp, &buffer[0], buffer.size());
+ THROW(HdfsIOException,
+ "KerberosName: Failed to parse Kerberos principal.");
+}
+
+void KerberosName::parse(const std::string &principal) {
+ int rc;
+ static const char * pattern = "([^/@]*)(/([^/@]*))?@([^/@]*)";
+ regex_t comp;
+ regmatch_t pmatch[5];
+
+ if (principal.empty()) {
+ return;
+ }
+
+ memset(&comp, 0, sizeof(regex_t));
+ rc = regcomp(&comp, pattern, REG_EXTENDED);
+
+ if (rc) {
+ HandleRegError(rc, &comp);
+ }
+
+ try {
+ memset(pmatch, 0, sizeof(pmatch));
+ rc = regexec(&comp, principal.c_str(),
+ sizeof(pmatch) / sizeof(pmatch[1]), pmatch, 0);
+
+ if (rc && rc != REG_NOMATCH) {
+ HandleRegError(rc, &comp);
+ }
+
+ if (rc == REG_NOMATCH) {
+ if (principal.find('@') != principal.npos) {
+ THROW(HdfsIOException,
+ "KerberosName: Malformed Kerberos name: %s",
+ principal.c_str());
+ } else {
+ name = principal;
+ }
+ } else {
+ if (pmatch[1].rm_so != -1) {
+ name = principal.substr(pmatch[1].rm_so,
+ pmatch[1].rm_eo - pmatch[1].rm_so);
+ }
+
+ if (pmatch[3].rm_so != -1) {
+ host = principal.substr(pmatch[3].rm_so,
+ pmatch[3].rm_eo - pmatch[3].rm_so);
+ }
+
+ if (pmatch[4].rm_so != -1) {
+ realm = principal.substr(pmatch[4].rm_so,
+ pmatch[4].rm_eo - pmatch[4].rm_so);
+ }
+ }
+ } catch (...) {
+ regfree(&comp);
+ throw;
+ }
+
+ regfree(&comp);
+}
+
+/* UserInfo.cc */
+UserInfo UserInfo::LocalUser() {
+ UserInfo retval;
+ uid_t uid, euid;
+ int bufsize;
+ struct passwd pwd, epwd, *result = NULL;
+ euid = geteuid();
+ uid = getuid();
+
+ if ((bufsize = sysconf(_SC_GETPW_R_SIZE_MAX)) == -1) {
+ THROW(InvalidParameter,
+ "Invalid input: \"sysconf\" function failed to get the "
+ "configure with key \"_SC_GETPW_R_SIZE_MAX\".");
+ }
+
+ std::vector<char> buffer(bufsize);
+
+ if (getpwuid_r(euid, &epwd, &buffer[0], bufsize, &result) != 0 || !result) {
+ THROW(InvalidParameter,
+ "Invalid input: effective user name cannot be found with UID %u.",
+ euid);
+ }
+
+ retval.setEffectiveUser(epwd.pw_name);
+
+ if (getpwuid_r(uid, &pwd, &buffer[0], bufsize, &result) != 0 || !result) {
+ THROW(InvalidParameter,
+ "Invalid input: real user name cannot be found with UID %u.",
+ uid);
+ }
+
+ retval.setRealUser(pwd.pw_name);
+ return retval;
+}
+
+}
+}
diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/src/common/StackPrinter.cc b/hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/os/posix/StackPrinter.cc
similarity index 100%
rename from hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/src/common/StackPrinter.cc
rename to hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/os/posix/StackPrinter.cc
diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/src/common/Thread.cc b/hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/os/posix/Thread.cc
similarity index 100%
rename from hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/src/common/Thread.cc
rename to hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/os/posix/Thread.cc
diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/os/windows/Platform.cc b/hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/os/windows/Platform.cc
new file mode 100644
index 0000000..2280e36
--- /dev/null
+++ b/hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/os/windows/Platform.cc
@@ -0,0 +1,303 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "platform.h"
+#include "Exception.h"
+#include "ExceptionInternal.h"
+#include "Logger.h"
+#include "UnorderedMap.h"
+#include "client/KerberosName.h"
+#include "client/UserInfo.h"
+#include "network/Syscall.h"
+#include "network/TcpSocket.h"
+#include "server/NamenodeProxy.h"
+
+#include <regex>
+#include <vector>
+
+int poll(struct pollfd *fds, unsigned long nfds, int timeout) {
+ return WSAPoll(fds, nfds, timeout);
+}
+
+namespace hdfs {
+namespace internal {
+
+/* InputStreamImpl.cc */
+unordered_set<std::string> BuildLocalAddrSet() {
+#define MALLOC(x) HeapAlloc(GetProcessHeap(), 0, (x))
+#define FREE(x) HeapFree(GetProcessHeap(), 0, (x))
+ DWORD dwSize = 0;
+ DWORD dwRetVal = 0;
+ unsigned int i = 0;
+
+ // Set the flags to pass to GetAdaptersAddresses
+ ULONG flags = GAA_FLAG_INCLUDE_PREFIX;
+
+ // default to unspecified address family (both)
+ ULONG family = AF_UNSPEC;
+ PIP_ADAPTER_ADDRESSES pAddresses = NULL;
+ ULONG outBufLen = 0;
+
+ PIP_ADAPTER_ADDRESSES pCurrAddresses = NULL;
+ PIP_ADAPTER_UNICAST_ADDRESS pUnicast = NULL;
+ PIP_ADAPTER_ANYCAST_ADDRESS pAnycast = NULL;
+ PIP_ADAPTER_MULTICAST_ADDRESS pMulticast = NULL;
+
+ outBufLen = sizeof (IP_ADAPTER_ADDRESSES);
+ pAddresses = (IP_ADAPTER_ADDRESSES *) MALLOC(outBufLen);
+
+ // Make an initial call to GetAdaptersAddresses to get the
+ // size needed into the outBufLen variable
+ if (GetAdaptersAddresses(
+ family,
+ flags,
+ NULL,
+ pAddresses,
+ &outBufLen) == ERROR_BUFFER_OVERFLOW) {
+ FREE(pAddresses);
+ pAddresses = (IP_ADAPTER_ADDRESSES *) MALLOC(outBufLen);
+ }
+
+ if (pAddresses == NULL) {
+ THROW(HdfsNetworkException,
+ "InputStreamImpl: malloc failed, "
+ "cannot get local network interface: %s",
+ GetSystemErrorInfo(errno));
+ }
+
+ // Make a second call to GetAdapters Addresses to get the
+ // actual data we want
+ dwRetVal =
+ GetAdaptersAddresses(family, flags, NULL, pAddresses, &outBufLen);
+
+ if (dwRetVal == NO_ERROR) {
+ // If successful, construct the address set
+ unordered_set<std::string> set; // to be returned
+ std::vector<char> host;
+ const char *pHost;
+ host.resize(INET6_ADDRSTRLEN + 1);
+
+ pCurrAddresses = pAddresses;
+ while (pCurrAddresses) {
+ // TODO: scan Anycast, Multicast as well.
+ // scan unicast address list
+ pUnicast = pCurrAddresses->FirstUnicastAddress;
+ while (pUnicast != NULL) {
+ memset(&host[0], 0, INET6_ADDRSTRLEN);
+ ULONG _family = pUnicast->Address.lpSockaddr->sa_family;
+ if (_family == AF_INET) {
+ SOCKADDR_IN *sa_in =
+ (SOCKADDR_IN *)pUnicast->Address.lpSockaddr;
+ pHost = InetNtop(
+ AF_INET,
+ &(sa_in->sin_addr),
+ &host[0],
+ INET6_ADDRSTRLEN);
+ }
+ else {
+ SOCKADDR_IN6 *sa_in6 =
+ (SOCKADDR_IN6 *)pUnicast->Address.lpSockaddr;
+ pHost = InetNtop(
+ AF_INET,
+ &(sa_in6->sin6_addr),
+ &host[0],
+ INET6_ADDRSTRLEN);
+ }
+ if (pHost == NULL) {
+ THROW(HdfsNetworkException,
+ "InputStreamImpl: cannot get convert network address to textual form: %s",
+ GetSystemErrorInfo(errno));
+ }
+ set.insert(pHost);
+ pUnicast = pUnicast->Next;
+ } // inner while
+ pCurrAddresses = pCurrAddresses->Next;
+ } // while
+
+ // TODO: replace hardcoded HOST_NAME_MAX
+ int _HOST_NAME_MAX = 128;
+ host.resize(_HOST_NAME_MAX + 1);
+ if (gethostname(&host[0], host.size())) {
+ THROW(HdfsNetworkException,
+ "InputStreamImpl: cannot get hostname: %s",
+ GetSystemErrorInfo(errno));
+ }
+ set.insert(&host[0]);
+ if (pAddresses != NULL) {
+ FREE(pAddresses);
+ }
+ return set;
+ }
+ else {
+ printf("Call to GetAdaptersAddresses failed with error: %d\n",
+ dwRetVal);
+ if (pAddresses != NULL) {
+ FREE(pAddresses);
+ }
+ THROW(HdfsNetworkException,
+ "InputStreamImpl: cannot get local network interface: %s",
+ GetSystemErrorInfo(errno));
+ }
+}
+
+/* TpcSocket.cc */
+void TcpSocketImpl::setBlockMode(bool enable) {
+ u_long blocking_mode = (enable) ? 0 : 1;
+ int rc = syscalls::ioctlsocket(sock, FIONBIO, &blocking_mode);
+ if (rc == SOCKET_ERROR) {
+ THROW(HdfsNetworkException, "Get socket flag failed for remote node %s: %s",
+ remoteAddr.c_str(), GetSystemErrorInfo(errno));
+ }
+}
+
+/* NamenodeProxy.cc */
+static std::string GetTmpPath() {
+ char lpTempPathBuffer[MAX_PATH];
+ // Gets the temp path env string (no guarantee it's a valid path).
+ DWORD dwRetVal = GetTempPath(
+ MAX_PATH, // length of the buffer
+ lpTempPathBuffer); // buffer for path
+ if (dwRetVal > MAX_PATH || (dwRetVal == 0))
+ THROW(HdfsException, "GetTmpPath failed");
+ return std::string(lpTempPathBuffer);
+}
+
+static uint32_t GetInitNamenodeIndex(const std::string id) {
+ std::string path = GetTmpPath();
+ path += id;
+ HANDLE fd = INVALID_HANDLE_VALUE;
+ uint32_t index = 0;
+
+ fd = CreateFile(
+ path.c_str(),
+ GENERIC_WRITE, // write only
+ 0, // do not share, is this right shared mode?
+ NULL, // default security
+ CREATE_NEW, // call fails if file exists, ERROR_FILE_EXISTS
+ FILE_ATTRIBUTE_NORMAL, // normal file
+ NULL); // no template
+
+ if (fd == INVALID_HANDLE_VALUE) {
+ // File already exists, try to open it
+ if (GetLastError() == ERROR_FILE_EXISTS) {
+ fd = CreateFile(path.c_str(),
+ GENERIC_READ, // open for reading
+ 0, // do not share
+ NULL, // default security
+ OPEN_EXISTING, // existing file only
+ FILE_ATTRIBUTE_NORMAL, // normal file
+ NULL // // no template
+ );
+ }
+ else {
+ // TODO: log, or throw exception when a file is failed to open
+ return 0;
+ }
+ }
+ else {
+ DWORD dwBytesToWrite = (DWORD)sizeof(index);
+ DWORD dwBytesWritten = 0;
+ BOOL bErrorFlag = WriteFile(
+ fd,
+ &index,
+ dwBytesToWrite,
+ &dwBytesToWrite,
+ NULL);
+ // TODO: check error code and number of bytes written
+ return index;
+ }
+
+ // the file exists, read it
+ DWORD dwBytesToRead = 0;
+ if (FALSE == ReadFile(fd, &index, sizeof(index), &dwBytesToRead, NULL)) {
+ index = 0; // fail to read, don't care
+ }
+ return index;
+}
+
+static void SetInitNamenodeIndex(const std::string & id, uint32_t index) {
+ std::string path = GetTmpPath();
+ path += id;
+ HANDLE fd = INVALID_HANDLE_VALUE;
+ fd = CreateFile(
+ path.c_str(),
+ GENERIC_WRITE, // write only
+ 0, // do not share, is this right shared mode?
+ NULL, // default security
+ OPEN_ALWAYS, // call fails if file exists, ERROR_FILE_EXISTS
+ FILE_ATTRIBUTE_NORMAL, // normal file
+ NULL); // no template
+ if (fd != INVALID_HANDLE_VALUE) {
+ DWORD dwBytesToWrite = (DWORD)sizeof(index);
+ DWORD dwBytesWritten = 0;
+ BOOL bErrorFlag = WriteFile(
+ fd,
+ &index,
+ dwBytesToWrite,
+ &dwBytesToWrite,
+ NULL);
+ }
+}
+
+/* KerberosName.cc */
+void KerberosName::parse(const std::string & principal) {
+ int rc;
+ // primary/instance@REALM
+ // [^/@]* = anything but / and @
+ static const char * pattern = "([^/@]*)(/([^/@]*))?@([^/@]*)";
+ std::tr1::cmatch res;
+ std::tr1::regex rx(pattern);
+ if (!std::tr1::regex_search(principal.c_str(), res, rx)) {
+ // Check if principal is just simply a username without the @thing
+ if (principal.find('@') != principal.npos) {
+ THROW(HdfsIOException,
+ "KerberosName: Malformed Kerberos name: %s",
+ principal.c_str());
+ }
+ else {
+ name = principal;
+ return;
+ }
+ }
+ if (res[1].length() > 0) {
+ name = res[1];
+ }
+ if (res[3].length() > 0) {
+ host = res[3];
+ }
+ if (res[4].length() > 0) {
+ realm = res[4];
+ }
+}
+
+/* UserInfo.cc */
+UserInfo UserInfo::LocalUser() {
+ UserInfo retval;
+ char username[UNLEN + 1];
+ DWORD username_len = UNLEN + 1;
+ GetUserName(username, &username_len);
+ std::string str(username);
+
+ // Assume for now in Windows real and effective users are the same.
+ retval.setRealUser(&str[0]);
+ retval.setEffectiveUser(&str[0]);
+ return retval;
+}
+
+}
+}
diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/os/windows/StackPrinter.cc b/hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/os/windows/StackPrinter.cc
new file mode 100644
index 0000000..bb309c4
--- /dev/null
+++ b/hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/os/windows/StackPrinter.cc
@@ -0,0 +1,62 @@
+/**
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+#include "StackPrinter.h"
+
+#include <boost/format.hpp>
+#include <DbgHelp.h>
+#pragma comment(lib, "dbghelp.lib")
+#include <sstream>
+#include <string>
+#include <vector>
+namespace hdfs {
+namespace internal {
+
+const std::string PrintStack(int skip, int maxDepth) {
+ std::ostringstream ss;
+ unsigned int i;
+ std::vector<void *> stack;
+ stack.resize(maxDepth);
+ unsigned short frames;
+ SYMBOL_INFO *symbol;
+ HANDLE process;
+ process = GetCurrentProcess();
+
+ SymInitialize(process, NULL, TRUE);
+
+ frames = CaptureStackBackTrace(0, maxDepth, &stack[0], NULL);
+ symbol = (SYMBOL_INFO *)
+ calloc(sizeof(SYMBOL_INFO) + 256 * sizeof(char), 1);
+ symbol->MaxNameLen = 255;
+ symbol->SizeOfStruct = sizeof(SYMBOL_INFO);
+
+ for (i = 0; i < frames; i++) {
+ SymFromAddr(process, (DWORD64)(stack[i]), 0, symbol);
+ printf("%i: %s - 0x%0X\n",
+ frames - i - 1, symbol->Name, symbol->Address);
+ // We use boost here, this may not be optimized for performance.
+ // TODO: fix this when we decide not to use boost for VS 2010
+ ss << boost::format("%i: %s - 0x%0X\n")
+ % (frames - i - 1) % symbol->Name % symbol->Address;
+ }
+ free(symbol);
+ return ss.str();
+}
+
+}
+}
diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/os/windows/Thread.cc b/hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/os/windows/Thread.cc
new file mode 100644
index 0000000..8dacbde
--- /dev/null
+++ b/hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/os/windows/Thread.cc
@@ -0,0 +1,41 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "Thread.h"
+
+#include <pthread.h>
+#include <signal.h>
+#include <unistd.h>
+
+namespace hdfs {
+namespace internal {
+
+// Signal in Windows is limited.
+sigset_t ThreadBlockSignal() {
+ signal(SIGINT, SIG_IGN);
+ signal(SIGTERM, SIG_IGN);
+ return 0;
+}
+
+void ThreadUnBlockSignal(sigset_t sigs) {
+ signal(SIGINT, SIG_DFL);
+ signal(SIGTERM, SIG_DFL);
+}
+
+}
+}
diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/os/windows/platform.h b/hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/os/windows/platform.h
index 2ae44e9..c26662b 100644
--- a/hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/os/windows/platform.h
+++ b/hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/os/windows/platform.h
@@ -77,6 +77,16 @@
#define lseek _lseek
/*
+ * Constants used for socket api.
+ */
+#define SHUT_RDWR SD_BOTH
+
+/*
+ * Account for lack of poll syscall.
+ */
+int poll(struct pollfd *fds, unsigned long nfds, int timeout);
+
+/*
* String related.
*/
#define snprintf(str, size, format, ...) \
@@ -105,8 +115,33 @@
#define PATH_SEPRATOR '\\'
/*
+ * gcc-style type-checked format arguments are not supported on Windows, so just
+ * stub this macro.
+ */
+#define TYPE_CHECKED_PRINTF_FORMAT(formatArg, varArgs)
+
+/*
* Support for signals in Windows is limited.
*/
typedef unsigned long sigset_t;
+/*
+ * Account for lack of dprint in Windows by using
+ * write syscall to write message to a file.
+ */
+#include<vector>
+inline int dprintf(int fd, const char *fmt, ...) {
+ va_list ap;
+ std::vector<char> buffer;
+ //determine buffer size
+ va_start(ap, fmt);
+ int size = vsnprintf(&buffer[0], buffer.size(), fmt, ap);
+ va_end(ap);
+ va_start(ap, fmt);
+ buffer.resize(size);
+ vsnprintf(&buffer[0], buffer.size(), fmt, ap);
+ va_end(ap);
+ _write(fd, &buffer[0], buffer.size());
+}
+
#endif // LIBHDFS3_WINDOWS_PLATFORM_H
diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/os/windows/sys/mman.c b/hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/os/windows/sys/mman.c
new file mode 100644
index 0000000..9568e29
--- /dev/null
+++ b/hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/os/windows/sys/mman.c
@@ -0,0 +1,204 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * The MIT License (MIT)
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+#include <windows.h>
+#include <errno.h>
+#include <io.h>
+
+#include "mman.h"
+
+static int __map_mman_error(const DWORD err, const int deferr) {
+ return err;
+}
+
+static DWORD __map_mmap_prot_page(const int prot) {
+ DWORD protect = 0;
+
+ if (prot == PROT_NONE)
+ return protect;
+
+ if ((prot & PROT_EXEC) != 0) {
+ protect = ((prot & PROT_WRITE) != 0) ?
+ PAGE_EXECUTE_READWRITE : PAGE_EXECUTE_READ;
+ }
+ else {
+ protect = ((prot & PROT_WRITE) != 0) ?
+ PAGE_READWRITE : PAGE_READONLY;
+ }
+
+ return protect;
+}
+
+static DWORD __map_mmap_prot_file(const int prot) {
+ DWORD desiredAccess = 0;
+
+ if (prot == PROT_NONE)
+ return desiredAccess;
+
+ if ((prot & PROT_READ) != 0)
+ desiredAccess |= FILE_MAP_READ;
+ if ((prot & PROT_WRITE) != 0)
+ desiredAccess |= FILE_MAP_WRITE;
+ if ((prot & PROT_EXEC) != 0)
+ desiredAccess |= FILE_MAP_EXECUTE;
+
+ return desiredAccess;
+}
+
+int posix_madvise(void *addr, size_t len, int advice) {
+ // Ignore this function in Windows.
+ // TODO: this can be implemented using PrefetchVirtualMemory.
+ return 0;
+}
+
+void* mmap(void *addr,size_t len, int prot,
+ int flags, int fildes, off_t off) {
+ HANDLE fm, h;
+
+ void * map = MAP_FAILED;
+
+#ifdef _MSC_VER
+#pragma warning(push)
+#pragma warning(disable: 4293)
+#endif
+
+ const DWORD dwFileOffsetLow = (sizeof(off_t) <= sizeof(DWORD)) ?
+ (DWORD)off : (DWORD)(off & 0xFFFFFFFFL);
+ const DWORD dwFileOffsetHigh = (sizeof(off_t) <= sizeof(DWORD)) ?
+ (DWORD)0 : (DWORD)((off >> 32) & 0xFFFFFFFFL);
+ const DWORD protect = __map_mmap_prot_page(prot);
+ const DWORD desiredAccess = __map_mmap_prot_file(prot);
+ const off_t maxSize = off + (off_t)len;
+ const DWORD dwMaxSizeLow = (sizeof(off_t) <= sizeof(DWORD)) ?
+ (DWORD)maxSize : (DWORD)(maxSize & 0xFFFFFFFFL);
+ const DWORD dwMaxSizeHigh = (sizeof(off_t) <= sizeof(DWORD)) ?
+ (DWORD)0 : (DWORD)((maxSize >> 32) & 0xFFFFFFFFL);
+
+#ifdef _MSC_VER
+#pragma warning(pop)
+#endif
+
+ errno = 0;
+
+ if (len == 0
+ /* Unsupported flag combinations */
+ || (flags & MAP_FIXED) != 0
+ /* Usupported protection combinations */
+ || prot == PROT_EXEC) {
+ errno = EINVAL;
+ return MAP_FAILED;
+ }
+
+ h = ((flags & MAP_ANONYMOUS) == 0) ?
+ (HANDLE)_get_osfhandle(fildes) : INVALID_HANDLE_VALUE;
+
+ if ((flags & MAP_ANONYMOUS) == 0 && h == INVALID_HANDLE_VALUE) {
+ errno = EBADF;
+ return MAP_FAILED;
+ }
+
+ fm =
+ CreateFileMapping(h, NULL, protect, dwMaxSizeHigh, dwMaxSizeLow, NULL);
+
+ if (fm == NULL) {
+ errno = __map_mman_error(GetLastError(), EPERM);
+ return MAP_FAILED;
+ }
+ map = MapViewOfFile(
+ fm, desiredAccess,
+ dwFileOffsetHigh, dwFileOffsetLow, len);
+
+ CloseHandle(fm);
+
+ if (map == NULL) {
+ errno = __map_mman_error(GetLastError(), EPERM);
+ return MAP_FAILED;
+ }
+
+ return map;
+}
+
+int munmap(void *addr, size_t len) {
+ if (UnmapViewOfFile(addr))
+ return 0;
+
+ errno = __map_mman_error(GetLastError(), EPERM);
+
+ return -1;
+}
+
+int _mprotect(void *addr, size_t len, int prot) {
+ DWORD newProtect = __map_mmap_prot_page(prot);
+ DWORD oldProtect = 0;
+
+ if (VirtualProtect(addr, len, newProtect, &oldProtect))
+ return 0;
+
+ errno = __map_mman_error(GetLastError(), EPERM);
+
+ return -1;
+}
+
+int msync(void *addr, size_t len, int flags) {
+ if (FlushViewOfFile(addr, len))
+ return 0;
+
+ errno = __map_mman_error(GetLastError(), EPERM);
+
+ return -1;
+}
+
+int mlock(const void *addr, size_t len) {
+ if (VirtualLock((LPVOID)addr, len))
+ return 0;
+
+ errno = __map_mman_error(GetLastError(), EPERM);
+
+ return -1;
+}
+
+int munlock(const void *addr, size_t len) {
+ if (VirtualUnlock((LPVOID)addr, len))
+ return 0;
+
+ errno = __map_mman_error(GetLastError(), EPERM);
+
+ return -1;
+}
diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/os/windows/sys/mman.h b/hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/os/windows/sys/mman.h
index 97c50e3..2189006 100644
--- a/hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/os/windows/sys/mman.h
+++ b/hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/os/windows/sys/mman.h
@@ -16,4 +16,64 @@
* limitations under the License.
*/
-/* Dummy file for Windows build */
+/**
+ * The MIT License (MIT)
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+#ifndef _SYS_MMAN_H_
+#define _SYS_MMAN_H_
+
+#include <sys/types.h>
+#include <stdlib.h>
+
+#define PROT_NONE 0
+#define PROT_READ 1
+#define PROT_WRITE 2
+#define PROT_EXEC 4
+
+#define MAP_FILE 0
+#define MAP_SHARED 1
+#define MAP_PRIVATE 2
+#define MAP_TYPE 0xf
+#define MAP_FIXED 0x10
+#define MAP_ANONYMOUS 0x20
+#define MAP_ANON MAP_ANONYMOUS
+
+#define MAP_FAILED ((void *)-1)
+
+/* Flags for msync. */
+#define MS_ASYNC 1
+#define MS_SYNC 2
+#define MS_INVALIDATE 4
+
+/* For poxis_madvice family */
+#define POSIX_MADV_SEQUENTIAL 2
+
+void* mmap(void *addr, size_t len, int prot, int flags, int fildes, off_t off);
+int munmap(void *addr, size_t len);
+int _mprotect(void *addr, size_t len, int prot);
+int msync(void *addr, size_t len, int flags);
+int mlock(const void *addr, size_t len);
+int munlock(const void *addr, size_t len);
+
+int posix_madvise(void *addr, size_t len, int advice);
+
+#endif /* _SYS_MMAN_H_ */
diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/os/windows/sys/time.h b/hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/os/windows/sys/time.h
index 97c50e3..c797f73 100644
--- a/hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/os/windows/sys/time.h
+++ b/hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/os/windows/sys/time.h
@@ -16,4 +16,24 @@
* limitations under the License.
*/
-/* Dummy file for Windows build */
+#include "platform.h"
+
+inline int gettimeofday(struct timeval *tv, struct timezone* tz) {
+ SYSTEMTIME localtime;
+ GetLocalTime(&localtime);
+ // GetLocalTime only allows upto ms.
+ tv->tv_usec = localtime.wMilliseconds;
+ time_t timeval;
+ tv->tv_sec = time(&timeval);
+ return 0;
+}
+
+inline struct tm *localtime_r(long* tv_sec, struct tm *result) {
+ if (localtime_s(result, reinterpret_cast<time_t*>(tv_sec)) == 0) {
+ // Good
+ return result;
+ }
+ else {
+ return NULL;
+ }
+}
\ No newline at end of file
diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/os/windows/uuid/uuid.h b/hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/os/windows/uuid/uuid.h
index 21826c8..3c5ff8e 100644
--- a/hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/os/windows/uuid/uuid.h
+++ b/hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/os/windows/uuid/uuid.h
@@ -20,13 +20,18 @@
#define _UUID_HEADER_FOR_WIN_
/*
- * This file an Windows equivalent of libuuid.
+ * This file a Windows equivalence of libuuid.
*/
#include <Rpc.h>
#include <RpcDce.h>
#pragma comment(lib, "rpcrt4.lib")
-#define uuid_generate(id) UuidCreate(&(id))
+#undef uuid_t
+typedef unsigned char uuid_t[16];
+
+// It is OK to reinterpret cast, as UUID is a struct with 16 bytes.
+// TODO: write our own uuid generator to get rid of libuuid dependency.
+#define uuid_generate(id) UuidCreate(reinterpret_cast<UUID *>(id))
#endif
diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/src/CMakeLists.txt b/hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/src/CMakeLists.txt
index ad0e0a2..b45ec3f 100644
--- a/hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/src/CMakeLists.txt
+++ b/hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/src/CMakeLists.txt
@@ -47,6 +47,17 @@
AUTO_SOURCES(files "*.h" "RECURSE" "${CMAKE_CURRENT_SOURCE_DIR}")
LIST(APPEND LIBHDFS3_SOURCES ${files})
+SET(LIBHDFS3_SOURCES
+ ${LIBHDFS3_SOURCES}
+ ${libhdfs3_OS_PLATFORM_DIR}/Thread.cc
+ ${libhdfs3_OS_PLATFORM_DIR}/StackPrinter.cc
+ ${libhdfs3_OS_PLATFORM_DIR}/Platform.cc
+)
+IF(MSVC)
+ SET(LIBHDFS3_SOURCES
+ ${LIBHDFS3_SOURCES}
+ ${libhdfs3_OS_PLATFORM_DIR}/sys/mman.c)
+ENDIF(MSVC)
AUTO_SOURCES(libhdfs3_PROTO_FILES "proto/*.proto" "RECURSE" "${CMAKE_CURRENT_SOURCE_DIR}")
SET(libhdfs3_PROTO_FILES ${libhdfs3_PROTO_FILES} PARENT_SCOPE)
@@ -54,7 +65,10 @@
INCLUDE_DIRECTORIES("${CMAKE_BINARY_DIR}")
SET(LIBHDFS_SRC_DIR ${HADOOP_TOP_DIR}/hadoop-hdfs-project/hadoop-hdfs/src/main/native/libhdfs/)
-INCLUDE_DIRECTORIES(${LIBHDFS_SRC_DIR})
+IF(NOT MSVC)
+ # In windows, there will a conflict with Exception.h native/libhdfs.
+ INCLUDE_DIRECTORIES(${LIBHDFS_SRC_DIR})
+ENDIF(NOT MSVC)
SET(HEADER
${LIBHDFS_SRC_DIR}/hdfs.h
diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/src/client/BlockLocation.h b/hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/src/client/BlockLocation.h
index 6e7f3e3..b249853 100644
--- a/hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/src/client/BlockLocation.h
+++ b/hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/src/client/BlockLocation.h
@@ -19,6 +19,7 @@
#ifndef _HDFS_LIBHDFS3_CLIENT_BLOCKLOCATION_H_
#define _HDFS_LIBHDFS3_CLIENT_BLOCKLOCATION_H_
+#include <stdint.h>
#include <string>
#include <vector>
diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/src/client/InputStreamImpl.cc b/hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/src/client/InputStreamImpl.cc
index ca4c645..5f52746 100644
--- a/hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/src/client/InputStreamImpl.cc
+++ b/hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/src/client/InputStreamImpl.cc
@@ -42,79 +42,6 @@
unordered_map<uint32_t, shared_ptr<LocalBlockInforCacheType>>
InputStreamImpl::LocalBlockInforCache;
-unordered_set<std::string> BuildLocalAddrSet() {
- unordered_set<std::string> set;
- struct ifaddrs *ifAddr = NULL;
- struct ifaddrs *pifAddr = NULL;
- struct sockaddr *addr;
-
- if (getifaddrs(&ifAddr)) {
- THROW(HdfsNetworkException,
- "InputStreamImpl: cannot get local network interface: %s",
- GetSystemErrorInfo(errno));
- }
-
- try {
- std::vector<char> host;
- const char *pHost;
- host.resize(INET6_ADDRSTRLEN + 1);
-
- for (pifAddr = ifAddr; pifAddr != NULL; pifAddr = pifAddr->ifa_next) {
- addr = pifAddr->ifa_addr;
- memset(&host[0], 0, INET6_ADDRSTRLEN + 1);
-
- if (addr->sa_family == AF_INET) {
- pHost = inet_ntop(
- addr->sa_family,
- &(reinterpret_cast<struct sockaddr_in *>(addr))->sin_addr,
- &host[0], INET6_ADDRSTRLEN);
- } else if (addr->sa_family == AF_INET6) {
- pHost = inet_ntop(
- addr->sa_family,
- &(reinterpret_cast<struct sockaddr_in6 *>(addr))->sin6_addr,
- &host[0], INET6_ADDRSTRLEN);
- } else {
- continue;
- }
-
- if (NULL == pHost) {
- THROW(HdfsNetworkException,
- "InputStreamImpl: cannot get convert network address "
- "to textual form: %s",
- GetSystemErrorInfo(errno));
- }
-
- set.insert(pHost);
- }
-
- /*
- * add hostname.
- */
- long hostlen = sysconf(_SC_HOST_NAME_MAX);
- host.resize(hostlen + 1);
-
- if (gethostname(&host[0], host.size())) {
- THROW(HdfsNetworkException,
- "InputStreamImpl: cannot get hostname: %s",
- GetSystemErrorInfo(errno));
- }
-
- set.insert(&host[0]);
- } catch (...) {
- if (ifAddr != NULL) {
- freeifaddrs(ifAddr);
- }
-
- throw;
- }
-
- if (ifAddr != NULL) {
- freeifaddrs(ifAddr);
- }
-
- return set;
-}
-
InputStreamImpl::InputStreamImpl()
: closed(true),
localRead(true),
@@ -772,9 +699,9 @@
try {
while (todo > 0) {
- done = todo < std::numeric_limits<int32_t>::max()
+ done = todo < (std::numeric_limits<int32_t>::max)()
? static_cast<int32_t>(todo)
- : std::numeric_limits<int32_t>::max();
+ : (std::numeric_limits<int32_t>::max)();
done = readInternal(buf + (size - todo), done);
todo -= done;
}
diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/src/client/InputStreamImpl.h b/hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/src/client/InputStreamImpl.h
index 5202a33..ce51889 100644
--- a/hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/src/client/InputStreamImpl.h
+++ b/hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/src/client/InputStreamImpl.h
@@ -45,6 +45,8 @@
typedef LruMap<LocalBlockInforCacheKey, BlockLocalPathInfo>
LocalBlockInforCacheType;
+unordered_set<std::string> BuildLocalAddrSet();
+
/**
* A input stream used read data from hdfs.
*/
diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/src/client/KerberosName.cc b/hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/src/client/KerberosName.cc
index 877758c..7bef116 100644
--- a/hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/src/client/KerberosName.cc
+++ b/hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/src/client/KerberosName.cc
@@ -21,22 +21,12 @@
#include "Exception.h"
#include "ExceptionInternal.h"
-#include <regex.h>
#include <string.h>
#include <vector>
namespace hdfs {
namespace internal {
-static void HandleRegError(int rc, regex_t *comp) {
- std::vector<char> buffer;
- size_t size = regerror(rc, comp, NULL, 0);
- buffer.resize(size + 1);
- regerror(rc, comp, &buffer[0], buffer.size());
- THROW(HdfsIOException,
- "KerberosName: Failed to parse Kerberos principal.");
-}
-
KerberosName::KerberosName() {
}
@@ -44,64 +34,6 @@
parse(principal);
}
-void KerberosName::parse(const std::string &principal) {
- int rc;
- static const char * pattern = "([^/@]*)(/([^/@]*))?@([^/@]*)";
- regex_t comp;
- regmatch_t pmatch[5];
-
- if (principal.empty()) {
- return;
- }
-
- memset(&comp, 0, sizeof(regex_t));
- rc = regcomp(&comp, pattern, REG_EXTENDED);
-
- if (rc) {
- HandleRegError(rc, &comp);
- }
-
- try {
- memset(pmatch, 0, sizeof(pmatch));
- rc = regexec(&comp, principal.c_str(),
- sizeof(pmatch) / sizeof(pmatch[1]), pmatch, 0);
-
- if (rc && rc != REG_NOMATCH) {
- HandleRegError(rc, &comp);
- }
-
- if (rc == REG_NOMATCH) {
- if (principal.find('@') != principal.npos) {
- THROW(HdfsIOException,
- "KerberosName: Malformed Kerberos name: %s",
- principal.c_str());
- } else {
- name = principal;
- }
- } else {
- if (pmatch[1].rm_so != -1) {
- name = principal.substr(pmatch[1].rm_so,
- pmatch[1].rm_eo - pmatch[1].rm_so);
- }
-
- if (pmatch[3].rm_so != -1) {
- host = principal.substr(pmatch[3].rm_so,
- pmatch[3].rm_eo - pmatch[3].rm_so);
- }
-
- if (pmatch[4].rm_so != -1) {
- realm = principal.substr(pmatch[4].rm_so,
- pmatch[4].rm_eo - pmatch[4].rm_so);
- }
- }
- } catch (...) {
- regfree(&comp);
- throw;
- }
-
- regfree(&comp);
-}
-
size_t KerberosName::hash_value() const {
size_t values[] = { StringHasher(name), StringHasher(host), StringHasher(
realm)
diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/src/client/Permission.h b/hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/src/client/Permission.h
index fafb7fe..8b817ba 100644
--- a/hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/src/client/Permission.h
+++ b/hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/src/client/Permission.h
@@ -18,6 +18,7 @@
#ifndef _HDFS_LIBHDFS3_CLIENT_PERMISSION_H_
#define _HDFS_LIBHDFS3_CLIENT_PERMISSION_H_
+#include <stdint.h>
#include <string>
namespace hdfs {
diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/src/client/UserInfo.cc b/hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/src/client/UserInfo.cc
index a68bca0..6d7ffaa 100644
--- a/hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/src/client/UserInfo.cc
+++ b/hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/src/client/UserInfo.cc
@@ -29,40 +29,6 @@
namespace hdfs {
namespace internal {
-UserInfo UserInfo::LocalUser() {
- UserInfo retval;
- uid_t uid, euid;
- int bufsize;
- struct passwd pwd, epwd, *result = NULL;
- euid = geteuid();
- uid = getuid();
-
- if ((bufsize = sysconf(_SC_GETPW_R_SIZE_MAX)) == -1) {
- THROW(InvalidParameter,
- "Invalid input: \"sysconf\" function failed to get the "
- "configure with key \"_SC_GETPW_R_SIZE_MAX\".");
- }
-
- std::vector<char> buffer(bufsize);
-
- if (getpwuid_r(euid, &epwd, &buffer[0], bufsize, &result) != 0 || !result) {
- THROW(InvalidParameter,
- "Invalid input: effective user name cannot be found with UID %u.",
- euid);
- }
-
- retval.setEffectiveUser(epwd.pw_name);
-
- if (getpwuid_r(uid, &pwd, &buffer[0], bufsize, &result) != 0 || !result) {
- THROW(InvalidParameter,
- "Invalid input: real user name cannot be found with UID %u.",
- uid);
- }
-
- retval.setRealUser(pwd.pw_name);
- return retval;
-}
-
size_t UserInfo::hash_value() const {
size_t values[] = { StringHasher(realUser), effectiveUser.hash_value() };
return CombineHasher(values, sizeof(values) / sizeof(values[0]));
diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/src/common/Atoi.cc b/hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/src/common/Atoi.cc
index 58786c4..c01d2a9 100644
--- a/hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/src/common/Atoi.cc
+++ b/hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/src/common/Atoi.cc
@@ -42,8 +42,8 @@
oss << "Invalid int32_t type: " << str;
return Status(EINVAL, oss.str());
}
- if (ERANGE == errno || retval > std::numeric_limits<int32_t>::max() ||
- retval < std::numeric_limits<int32_t>::min()) {
+ if (ERANGE == errno || retval > (std::numeric_limits<int32_t>::max)() ||
+ retval < (std::numeric_limits<int32_t>::min)()) {
ostringstream oss;
oss << "Underflow/Overflow in int32_t type: " << str;
return Status(EINVAL, oss.str());
@@ -63,8 +63,8 @@
oss << "Invalid int64_t type: " << str;
return Status(EINVAL, oss.str());
}
- if (ERANGE == errno || retval > std::numeric_limits<int64_t>::max() ||
- retval < std::numeric_limits<int64_t>::min()) {
+ if (ERANGE == errno || retval > (std::numeric_limits<int64_t>::max)() ||
+ retval < (std::numeric_limits<int64_t>::min)()) {
ostringstream oss;
oss << "Underflow/Overflow in int64_t type: " << str;
return Status(EINVAL, oss.str());
@@ -100,8 +100,8 @@
oss << "Invalid double type: " << str;
return Status(EINVAL, oss.str());
}
- if (ERANGE == errno || retval > std::numeric_limits<double>::max() ||
- retval < std::numeric_limits<double>::min()) {
+ if (ERANGE == errno || retval > (std::numeric_limits<double>::max)() ||
+ retval < (std::numeric_limits<double>::min)()) {
ostringstream oss;
oss << "Underflow/Overflow in double type: " << str;
return Status(EINVAL, oss.str());
diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/src/common/BigEndian.h b/hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/src/common/BigEndian.h
index ab508ce..35f41f0 100644
--- a/hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/src/common/BigEndian.h
+++ b/hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/src/common/BigEndian.h
@@ -19,6 +19,7 @@
#ifndef _HDFS_LIBHDFS3_COMMON_BIGENDIAN_H_
#define _HDFS_LIBHDFS3_COMMON_BIGENDIAN_H_
+#include <platform.h>
#include <arpa/inet.h>
#include <stdint.h>
#include <string.h>
diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/src/common/CFileWrapper.cc b/hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/src/common/CFileWrapper.cc
index 15eeffa..75ff683 100644
--- a/hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/src/common/CFileWrapper.cc
+++ b/hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/src/common/CFileWrapper.cc
@@ -84,8 +84,8 @@
bool seek_set = true;
while (todo > 0) {
- batch = todo < std::numeric_limits<long>::max() ?
- todo : std::numeric_limits<long>::max();
+ batch = todo < (std::numeric_limits<long>::max)() ?
+ todo : (std::numeric_limits<long>::max)();
off_t rc = fseek(file, static_cast<long>(batch),
seek_set ? SEEK_SET : SEEK_CUR);
seek_set = false;
diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/src/common/ExceptionInternal.h b/hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/src/common/ExceptionInternal.h
index 1cd6a02..0f421d6 100644
--- a/hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/src/common/ExceptionInternal.h
+++ b/hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/src/common/ExceptionInternal.h
@@ -34,7 +34,6 @@
#define STACK_DEPTH 64
-#define PATH_SEPRATOR '/'
inline static const char *SkipPathPrefix(const char *path) {
int i, len = strlen(path);
diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/src/common/MappedFileWrapper.cc b/hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/src/common/MappedFileWrapper.cc
index 18fe995..062c434 100644
--- a/hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/src/common/MappedFileWrapper.cc
+++ b/hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/src/common/MappedFileWrapper.cc
@@ -67,7 +67,7 @@
path = ss.str();
if (static_cast<uint64_t>(size) >
- static_cast<uint64_t>(std::numeric_limits<size_t>::max())) {
+ static_cast<uint64_t>((std::numeric_limits<size_t>::max)())) {
THROW(HdfsIOException,
"Cannot create memory mapped file for \"%s\", file is too large.",
path.c_str());
@@ -86,7 +86,7 @@
size = st.st_size;
if (static_cast<uint64_t>(size) >
- static_cast<uint64_t>(std::numeric_limits<size_t>::max())) {
+ static_cast<uint64_t>((std::numeric_limits<size_t>::max)())) {
THROW(HdfsIOException,
"Cannot create memory mapped file for \"%s\", file is too large.",
path.c_str());
diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/src/common/SharedPtr.h b/hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/src/common/SharedPtr.h
index 76ab1d4..9ca232b0 100644
--- a/hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/src/common/SharedPtr.h
+++ b/hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/src/common/SharedPtr.h
@@ -19,7 +19,7 @@
#ifndef _HDFS_LIBHDFS3_COMMON_SHARED_PTR_H_
#define _HDFS_LIBHDFS3_COMMON_SHARED_PTR_H_
-#ifdef _LIBCPP_VERSION
+#if (defined _LIBCPP_VERSION || defined _WIN32)
#include <memory>
namespace hdfs {
diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/src/common/UnorderedMap.h b/hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/src/common/UnorderedMap.h
index e6b2e04..e48534e 100644
--- a/hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/src/common/UnorderedMap.h
+++ b/hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/src/common/UnorderedMap.h
@@ -19,7 +19,22 @@
#ifndef _HDFS_LIBHDFS3_COMMON_UNORDERED_MAP_H_
#define _HDFS_LIBHDFS3_COMMON_UNORDERED_MAP_H_
-#ifdef _LIBCPP_VERSION
+// Use boost for Windows, to avoid xutility type cast complain.
+#if (defined NEED_BOOST && defined _WIN32)
+
+#include <boost/unordered_map.hpp>
+#include <boost/unordered_set.hpp>
+
+namespace hdfs {
+namespace internal {
+
+using boost::unordered_map;
+using boost::unordered_set;
+
+}
+}
+
+#elif (defined _LIBCPP_VERSION || defined _WIN32)
#include <unordered_map>
#include <unordered_set>
diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/src/common/WritableUtils.cc b/hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/src/common/WritableUtils.cc
index b26c993..5236ea9 100644
--- a/hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/src/common/WritableUtils.cc
+++ b/hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/src/common/WritableUtils.cc
@@ -16,6 +16,7 @@
* limitations under the License.
*/
+#include "platform.h"
#include "WritableUtils.h"
#include <arpa/inet.h>
@@ -35,8 +36,8 @@
int64_t val;
val = ReadInt64();
- if (val < std::numeric_limits<int32_t>::min()
- || val > std::numeric_limits<int32_t>::max()) {
+ if (val < (std::numeric_limits<int32_t>::min)()
+ || val > (std::numeric_limits<int32_t>::max)()) {
throw std::range_error("overflow");
}
diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/src/common/WritableUtils.h b/hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/src/common/WritableUtils.h
index 7a16882..2dd95d9 100644
--- a/hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/src/common/WritableUtils.h
+++ b/hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/src/common/WritableUtils.h
@@ -19,6 +19,7 @@
#ifndef _HDFS_LIBHDFS_3_UTIL_WRITABLEUTILS_H_
#define _HDFS_LIBHDFS_3_UTIL_WRITABLEUTILS_H_
+#include <stdint.h>
#include <string>
namespace hdfs {
diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/src/common/WriteBuffer.h b/hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/src/common/WriteBuffer.h
index 0935c3f..7e14a4a 100644
--- a/hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/src/common/WriteBuffer.h
+++ b/hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/src/common/WriteBuffer.h
@@ -19,6 +19,7 @@
#ifndef _HDFS_LIBHDFS3_COMMON_WRITEBUFFER_H_
#define _HDFS_LIBHDFS3_COMMON_WRITEBUFFER_H_
+#include "platform.h"
#include <cassert>
#include <cstddef>
#include <cstring>
diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/src/network/Syscall.h b/hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/src/network/Syscall.h
index 5dab57c..e90bbac 100644
--- a/hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/src/network/Syscall.h
+++ b/hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/src/network/Syscall.h
@@ -19,6 +19,7 @@
#ifndef _HDFS_LIBHDFS3_NETWORK_SYSCALL_H_
#define _HDFS_LIBHDFS3_NETWORK_SYSCALL_H_
+#include "platform.h"
#include <fcntl.h>
#include <netdb.h>
#include <poll.h>
@@ -34,11 +35,16 @@
using ::socket;
using ::connect;
using ::getpeername;
-using ::fcntl;
using ::setsockopt;
using ::poll;
using ::shutdown;
using ::close;
+#ifdef _WIN32
+using ::ioctlsocket;
+using ::closesocket;
+#else
+using ::fcntl;
+#endif
}
diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/src/network/TcpSocket.cc b/hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/src/network/TcpSocket.cc
index de2db9d..e320454 100644
--- a/hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/src/network/TcpSocket.cc
+++ b/hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/src/network/TcpSocket.cc
@@ -280,7 +280,7 @@
struct sockaddr peer;
- unsigned int len = sizeof(peer);
+ socklen_t len = sizeof(peer);
memset(&peer, 0, sizeof(peer));
@@ -309,23 +309,6 @@
}
}
-void TcpSocketImpl::setBlockMode(bool enable) {
- int flag;
- flag = syscalls::fcntl(sock, F_GETFL, 0);
-
- if (-1 == flag) {
- THROW(HdfsNetworkException, "Get socket flag failed for remote node %s: %s",
- remoteAddr.c_str(), GetSystemErrorInfo(errno));
- }
-
- flag = enable ? (flag & ~O_NONBLOCK) : (flag | O_NONBLOCK);
-
- if (-1 == syscalls::fcntl(sock, F_SETFL, flag)) {
- THROW(HdfsNetworkException, "Set socket flag failed for remote "
- "node %s: %s", remoteAddr.c_str(), GetSystemErrorInfo(errno));
- }
-}
-
bool TcpSocketImpl::poll(bool read, bool write, int timeout) {
assert(-1 != sock);
int rc;
@@ -375,7 +358,8 @@
l.l_onoff = timeout > 0 ? true : false;
l.l_linger = timeout > 0 ? timeout : 0;
- if (syscalls::setsockopt(sock, SOL_SOCKET, SO_LINGER, &l, sizeof(l))) {
+ if (syscalls::setsockopt(sock, SOL_SOCKET, SO_LINGER,
+ reinterpret_cast<char *>(&l), sizeof(l))) {
THROW(HdfsNetworkException, "Set socket flag failed for remote "
"node %s: %s", remoteAddr.c_str(), GetSystemErrorInfo(errno));
}
@@ -388,7 +372,7 @@
timeo.tv_usec = (timeout % 1000) * 1000;
if (syscalls::setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO,
- &timeo, sizeof(timeo))) {
+ reinterpret_cast<char *>(&timeo), sizeof(timeo))) {
THROW(HdfsNetworkException, "Set socket flag failed for remote "
"node %s: %s", remoteAddr.c_str(), GetSystemErrorInfo(errno));
}
diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/src/rpc/RpcClient.h b/hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/src/rpc/RpcClient.h
index 7a7a65a..696de55 100644
--- a/hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/src/rpc/RpcClient.h
+++ b/hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/src/rpc/RpcClient.h
@@ -123,7 +123,7 @@
static mutex mutid;
lock_guard<mutex> lock(mutid);
++count;
- count = count < std::numeric_limits<int32_t>::max() ? count : 0;
+ count = count < (std::numeric_limits<int32_t>::max)() ? count : 0;
return count;
}
diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/src/server/NamenodeProxy.cc b/hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/src/server/NamenodeProxy.cc
index 020f719..0fe54c8 100644
--- a/hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/src/server/NamenodeProxy.cc
+++ b/hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/src/server/NamenodeProxy.cc
@@ -33,96 +33,6 @@
namespace hdfs {
namespace internal {
-static uint32_t GetInitNamenodeIndex(const std::string &id) {
- std::string path = "/tmp/";
- path += id;
- int fd;
- uint32_t index = 0;
- /*
- * try create the file
- */
- fd = open(path.c_str(), O_WRONLY | O_CREAT | O_EXCL, 0666);
-
- if (fd < 0) {
- if (errno == EEXIST) {
- /*
- * the file already exist, try to open it
- */
- fd = open(path.c_str(), O_RDONLY);
- } else {
- /*
- * failed to create, do not care why
- */
- return 0;
- }
- } else {
- if (0 != flock(fd, LOCK_EX)) {
- /*
- * failed to lock
- */
- close(fd);
- return index;
- }
-
- /*
- * created file, initialize it with 0
- */
- write(fd, &index, sizeof(index));
- flock(fd, LOCK_UN);
- close(fd);
- return index;
- }
-
- /*
- * the file exist, read it.
- */
- if (fd >= 0) {
- if (0 != flock(fd, LOCK_SH)) {
- /*
- * failed to lock
- */
- close(fd);
- return index;
- }
-
- if (sizeof(index) != read(fd, &index, sizeof(index))) {
- /*
- * failed to read, do not care why
- */
- index = 0;
- }
-
- flock(fd, LOCK_UN);
- close(fd);
- }
-
- return index;
-}
-
-static void SetInitNamenodeIndex(const std::string &id, uint32_t index) {
- std::string path = "/tmp/";
- path += id;
- int fd;
- /*
- * try open the file for write
- */
- fd = open(path.c_str(), O_WRONLY);
-
- if (fd > 0) {
- if (0 != flock(fd, LOCK_EX)) {
- /*
- * failed to lock
- */
- close(fd);
- return;
- }
-
- write(fd, &index, sizeof(index));
- flock(fd, LOCK_UN);
- close(fd);
- }
-}
-
NamenodeProxy::NamenodeProxy(const std::vector<NamenodeInfo> &namenodeInfos,
const std::string &tokenService,
const SessionConfig &c, const RpcAuth &a) :
diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/src/server/NamenodeProxy.h b/hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/src/server/NamenodeProxy.h
index 65e1cd7..60698df 100644
--- a/hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/src/server/NamenodeProxy.h
+++ b/hadoop-hdfs-project/hadoop-hdfs/src/contrib/libhdfs3/src/server/NamenodeProxy.h
@@ -30,6 +30,10 @@
namespace hdfs {
namespace internal {
+void SetInitNamenodeIndex(const std::string & id, uint32_t index);
+uint32_t GetInitNamenodeIndex(const std::string id);
+
+
class NamenodeProxy : public Namenode {
public:
NamenodeProxy(const std::vector<NamenodeInfo> &namenodeInfos,