HDFS-9741: libhdfs++: GetLastError not returning meaningful messages after some failures. Contributed by Bob Hansen

This commit is contained in:
Bob Hansen 2016-02-03 16:41:15 -05:00 committed by James Clampffer
parent d807773752
commit 288a9a9ee7

View File

@ -61,7 +61,7 @@ thread_local std::string errstr;
/* Fetch last error that happened in this thread */
void hdfsGetLastError(char *buf, int len) {
if(nullptr == buf || len < 1 || errstr.empty()) {
if(nullptr == buf || len < 1) {
return;
}
@ -93,7 +93,7 @@ struct hdfsBuilder {
};
/* Error handling with optional debug to stderr */
static void ReportError(int errnum, std::string msg) {
static void ReportError(int errnum, const std::string & msg) {
errno = errnum;
errstr = msg;
#ifdef LIBHDFSPP_C_API_ENABLE_DEBUG
@ -106,24 +106,32 @@ static void ReportError(int errnum, std::string msg) {
/* Convert Status wrapped error into appropriate errno and return code */
static int Error(const Status &stat) {
const char * default_message;
int errnum;
int code = stat.code();
switch (code) {
case Status::Code::kOk:
return 0;
case Status::Code::kInvalidArgument:
ReportError(EINVAL, "Invalid argument");
errnum = EINVAL;
default_message = "Invalid argument";
break;
case Status::Code::kResourceUnavailable:
ReportError(EAGAIN, "Resource temporarily unavailable");
errnum = EAGAIN;
default_message = "Resource temporarily unavailable";
break;
case Status::Code::kUnimplemented:
ReportError(ENOSYS, "Function not implemented");
errnum = ENOSYS;
default_message = "Function not implemented";
break;
case Status::Code::kException:
ReportError(EINTR, "Exception raised");
errnum = EINTR;
default_message = "Exception raised";
break;
case Status::Code::kOperationCanceled:
ReportError(EINTR, "Operation canceled");
errnum = EINTR;
default_message = "Operation canceled";
break;
case Status::Code::kPermissionDenied:
if (!stat.ToString().empty())
@ -132,8 +140,13 @@ static int Error(const Status &stat) {
ReportError(EACCES, "Permission denied");
break;
default:
ReportError(ENOSYS, "Error: unrecognised code");
errnum = ENOSYS;
default_message = "Error: unrecognised code";
}
if (stat.ToString().empty())
ReportError(errnum, default_message);
else
ReportError(errnum, stat.ToString());
return -1;
}
@ -176,6 +189,7 @@ hdfsFS hdfsConnectAsUser(const char* nn, tPort port, const char *user) {
FileSystem *fs = FileSystem::New(io_service, user_name, Options());
if (!fs) {
ReportError(ENODEV, "Could not create FileSystem object");
return nullptr;
}
@ -217,6 +231,7 @@ hdfsFile hdfsOpenFile(hdfsFS fs, const char *path, int flags, int bufferSize,
FileHandle *f = nullptr;
Status stat = fs->get_impl()->Open(path, &f);
if (!stat.ok()) {
Error(stat);
return nullptr;
}
return new hdfsFile_internal(f);
@ -365,6 +380,7 @@ int hdfsBuilderConfSetStr(struct hdfsBuilder *bld, const char *key,
}
else
{
ReportError(EINVAL, "Could not change Builder value");
return 1;
}
}
@ -454,5 +470,6 @@ int hdfsBuilderConfGetInt(struct hdfsBuilder *bld, const char *key, int32_t *val
*val = *value;
}
// If not found, don't change val
ReportError(EINVAL, "Could not get Builder value");
return 0;
}