void RemoteBlockReader::skip(int64_t len) { int64_t todo = len; assert(cursor + len <= endOffset); try { while (todo > 0) { if (cursor >= endOffset) { THROW(HdfsIOException, "RemoteBlockReader: skip over block end from Datanode: %s, Block: %s.", datanode.formatAddress().c_str(), binfo.toString().c_str()); } if (position >= size) { readNextPacket(); } int batch = size - position; batch = batch < todo ? batch : static_cast<int>(todo); position += batch; cursor += batch; todo -= batch; } } catch (const HdfsTimeoutException & e) { NESTED_THROW(HdfsIOException, "RemoteBlockReader: failed to read Block: %s from Datanode: %s.", binfo.toString().c_str(), datanode.formatAddress().c_str()); } catch (const HdfsNetworkException & e) { NESTED_THROW(HdfsIOException, "RemoteBlockReader: failed to read Block: %s from Datanode: %s.", binfo.toString().c_str(), datanode.formatAddress().c_str()); } }
int32_t RemoteBlockReader::read(char * buf, int32_t len) { assert(0 != len && NULL != buf); if (cursor >= endOffset) { THROW(HdfsIOException, "RemoteBlockReader: read over block end from Datanode: %s, Block: %s.", datanode.formatAddress().c_str(), binfo.toString().c_str()); } try { if (position >= size) { readNextPacket(); } int32_t todo = len < size - position ? len : size - position; memcpy(buf, &buffer[position], todo); position += todo; cursor += todo; return todo; } catch (const HdfsTimeoutException & e) { NESTED_THROW(HdfsIOException, "RemoteBlockReader: failed to read Block: %s from Datanode: %s.", binfo.toString().c_str(), datanode.formatAddress().c_str()); } catch (const HdfsNetworkException & e) { NESTED_THROW(HdfsIOException, "RemoteBlockReader: failed to read Block: %s from Datanode: %s.", binfo.toString().c_str(), datanode.formatAddress().c_str()); } }
static void HandleYarnFailoverException(const Yarn::YarnFailoverException & e) { try { rethrow_if_nested(e); } catch (...) { NESTED_THROW(Yarn::YarnRpcException, "%s", e.what()); } //should not reach here abort(); }
static void HandleHdfsFailoverException(const HdfsFailoverException & e) { try { Hdfs::rethrow_if_nested(e); } catch (...) { NESTED_THROW(Hdfs::HdfsRpcException, "%s", e.what()); } //should not reach here abort(); }
std::string Token::toString() const { try { size_t len = 0; std::vector<char> buffer(1024); WritableUtils out(&buffer[0], buffer.size()); len += out.WriteInt32(identifier.size()); len += out.WriteRaw(&identifier[0], identifier.size()); len += out.WriteInt32(password.size()); len += out.WriteRaw(&password[0], password.size()); len += out.WriteText(kind); len += out.WriteText(service); return Base64Encode(&buffer[0], len); } catch (...) { NESTED_THROW(HdfsIOException, "cannot convert token to string"); } }
shared_ptr<Socket> RemoteBlockReader::getNextPeer(const DatanodeInfo& dn) { shared_ptr<Socket> sock; try { sock = peerCache.getConnection(dn); if (!sock) { sock = shared_ptr<Socket>(new TcpSocketImpl); sock->connect(dn.getIpAddr().c_str(), dn.getXferPort(), connTimeout); sock->setNoDelay(true); } } catch (const HdfsTimeoutException & e) { NESTED_THROW(HdfsIOException, "RemoteBlockReader: Failed to connect to %s", dn.formatAddress().c_str()); } return sock; }
shared_ptr<PacketHeader> RemoteBlockReader::readPacketHeader() { try { shared_ptr<PacketHeader> retval; static const int packetHeaderLen = PacketHeader::GetPkgHeaderSize(); std::vector<char> buf(packetHeaderLen); if (lastHeader && lastHeader->isLastPacketInBlock()) { THROW(HdfsIOException, "RemoteBlockReader: read over block end from Datanode: %s, Block: %s.", datanode.formatAddress().c_str(), binfo.toString().c_str()); } in->readFully(&buf[0], packetHeaderLen, readTimeout); retval = shared_ptr<PacketHeader>(new PacketHeader); retval->readFields(&buf[0], packetHeaderLen); return retval; } catch (const HdfsIOException & e) { NESTED_THROW(HdfsIOException, "RemoteBlockReader: failed to read block header for Block: %s from Datanode: %s.", binfo.toString().c_str(), datanode.formatAddress().c_str()); } }
Token & Token::fromString(const std::string & str) { int32_t len; try { std::vector<char> buffer; Base64Decode(str, buffer); WritableUtils in(&buffer[0], buffer.size()); len = in.ReadInt32(); identifier.resize(len); in.ReadRaw(&identifier[0], len); len = in.ReadInt32(); password.resize(len); in.ReadRaw(&password[0], len); kind = in.ReadText(); service = in.ReadText(); return *this; } catch (...) { NESTED_THROW(HdfsInvalidBlockToken, "cannot construct a token from the string"); } }