blob: 75983445e08e401adcff1354f65389224dc7731d [file] [log] [blame]
/**
* 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.
*/
#ifndef _HDFS_LIBHDFS3_CLIENT_PACKET_H_
#define _HDFS_LIBHDFS3_CLIENT_PACKET_H_
#include <stdint.h>
#include <vector>
#define HEART_BEAT_SEQNO -1
namespace hdfs {
namespace internal {
class ConstPacketBuffer {
public:
ConstPacketBuffer(const char * buf, int size) :
buffer(buf), size(size) {
}
const char * getBuffer() const {
return buffer;
}
const int getSize() const {
return size;
}
private:
const char * buffer;
const int size;
};
/**
* buffer is pointed into like follows:
* (C is checksum data, D is payload data)
*
* [HHHHHCCCCC________________DDDDDDDDDDDDDDDD___]
* ^ ^ ^ ^
* | checksumPos dataStart dataPos
* checksumStart
*/
class Packet {
public:
/**
* create a heart beat packet
*/
Packet();
/**
* create a new packet
*/
Packet(int pktSize, int chunksPerPkt, int64_t offsetInBlock, int64_t seqno, int checksumSize);
void reset(int pktSize, int chunksPerPkt, int64_t offsetInBlock, int64_t seqno, int checksumSize);
void addChecksum(uint32_t checksum);
void addData(const char * buf, int size);
void setSyncFlag(bool sync);
void increaseNumChunks();
bool isFull();
bool isHeartbeat();
void setLastPacketInBlock(bool lastPacket);
int getDataSize();
const ConstPacketBuffer getBuffer();
int64_t getLastByteOffsetBlock();
int64_t getSeqno() const {
return seqno;
}
bool isLastPacketInBlock() const {
return lastPacketInBlock;
}
int64_t getOffsetInBlock() const {
return offsetInBlock;
}
private:
bool lastPacketInBlock; // is this the last packet in block
bool syncBlock; // sync block to disk?
int checksumPos;
int checksumSize;
int checksumStart;
int dataPos;
int dataStart;
int headerStart;
int maxChunks; // max chunks in packet
int numChunks; // number of chunks currently in packet
int64_t offsetInBlock; // offset in block
int64_t seqno; // sequence number of packet in block
std::vector<char> buffer;
};
}
}
#endif /* _HDFS_LIBHDFS3_CLIENT_PACKET_H_ */