Add "mtu" field to requests that benefit from it

Not used right now, but this way we can easily start stuffing more
data in responses.

I also split off some arguments in `NewClient`, unrelated change
(I wanted to pair the MTU with a single client, but I then realized
that it's enough to have it as some global property for now).
This commit is contained in:
Francesco Mazzoli
2023-06-15 08:46:43 +00:00
parent b840931575
commit e26eeaede1
23 changed files with 265 additions and 69 deletions

View File

@@ -373,7 +373,8 @@ struct BincodeBuf {
}
};
constexpr size_t UDP_MTU = 1472;
constexpr size_t DEFAULT_UDP_MTU = 1472; // 1500 - IP header - ICMP header
constexpr size_t MAX_UDP_MTU = 8972; // 9000 - IP header - ICMP header
constexpr uint8_t BLOCK_SERVICE_STALE = 1u;
constexpr uint8_t BLOCK_SERVICE_NO_READ = 1u<<1;

View File

@@ -1180,22 +1180,26 @@ std::ostream& operator<<(std::ostream& out, const StatDirectoryResp& x) {
void ReadDirReq::pack(BincodeBuf& buf) const {
dirId.pack(buf);
buf.packScalar<uint64_t>(startHash);
buf.packScalar<uint16_t>(mtu);
}
void ReadDirReq::unpack(BincodeBuf& buf) {
dirId.unpack(buf);
startHash = buf.unpackScalar<uint64_t>();
mtu = buf.unpackScalar<uint16_t>();
}
void ReadDirReq::clear() {
dirId = InodeId();
startHash = uint64_t(0);
mtu = uint16_t(0);
}
bool ReadDirReq::operator==(const ReadDirReq& rhs) const {
if ((InodeId)this->dirId != (InodeId)rhs.dirId) { return false; };
if ((uint64_t)this->startHash != (uint64_t)rhs.startHash) { return false; };
if ((uint16_t)this->mtu != (uint16_t)rhs.mtu) { return false; };
return true;
}
std::ostream& operator<<(std::ostream& out, const ReadDirReq& x) {
out << "ReadDirReq(" << "DirId=" << x.dirId << ", " << "StartHash=" << x.startHash << ")";
out << "ReadDirReq(" << "DirId=" << x.dirId << ", " << "StartHash=" << x.startHash << ", " << "Mtu=" << x.mtu << ")";
return out;
}
@@ -1481,25 +1485,29 @@ void FileSpansReq::pack(BincodeBuf& buf) const {
fileId.pack(buf);
buf.packScalar<uint64_t>(byteOffset);
buf.packScalar<uint32_t>(limit);
buf.packScalar<uint16_t>(mtu);
}
void FileSpansReq::unpack(BincodeBuf& buf) {
fileId.unpack(buf);
byteOffset = buf.unpackScalar<uint64_t>();
limit = buf.unpackScalar<uint32_t>();
mtu = buf.unpackScalar<uint16_t>();
}
void FileSpansReq::clear() {
fileId = InodeId();
byteOffset = uint64_t(0);
limit = uint32_t(0);
mtu = uint16_t(0);
}
bool FileSpansReq::operator==(const FileSpansReq& rhs) const {
if ((InodeId)this->fileId != (InodeId)rhs.fileId) { return false; };
if ((uint64_t)this->byteOffset != (uint64_t)rhs.byteOffset) { return false; };
if ((uint32_t)this->limit != (uint32_t)rhs.limit) { return false; };
if ((uint16_t)this->mtu != (uint16_t)rhs.mtu) { return false; };
return true;
}
std::ostream& operator<<(std::ostream& out, const FileSpansReq& x) {
out << "FileSpansReq(" << "FileId=" << x.fileId << ", " << "ByteOffset=" << x.byteOffset << ", " << "Limit=" << x.limit << ")";
out << "FileSpansReq(" << "FileId=" << x.fileId << ", " << "ByteOffset=" << x.byteOffset << ", " << "Limit=" << x.limit << ", " << "Mtu=" << x.mtu << ")";
return out;
}
@@ -1799,19 +1807,23 @@ std::ostream& operator<<(std::ostream& out, const ExpireTransientFileResp& x) {
void VisitDirectoriesReq::pack(BincodeBuf& buf) const {
beginId.pack(buf);
buf.packScalar<uint16_t>(mtu);
}
void VisitDirectoriesReq::unpack(BincodeBuf& buf) {
beginId.unpack(buf);
mtu = buf.unpackScalar<uint16_t>();
}
void VisitDirectoriesReq::clear() {
beginId = InodeId();
mtu = uint16_t(0);
}
bool VisitDirectoriesReq::operator==(const VisitDirectoriesReq& rhs) const {
if ((InodeId)this->beginId != (InodeId)rhs.beginId) { return false; };
if ((uint16_t)this->mtu != (uint16_t)rhs.mtu) { return false; };
return true;
}
std::ostream& operator<<(std::ostream& out, const VisitDirectoriesReq& x) {
out << "VisitDirectoriesReq(" << "BeginId=" << x.beginId << ")";
out << "VisitDirectoriesReq(" << "BeginId=" << x.beginId << ", " << "Mtu=" << x.mtu << ")";
return out;
}
@@ -1839,19 +1851,23 @@ std::ostream& operator<<(std::ostream& out, const VisitDirectoriesResp& x) {
void VisitFilesReq::pack(BincodeBuf& buf) const {
beginId.pack(buf);
buf.packScalar<uint16_t>(mtu);
}
void VisitFilesReq::unpack(BincodeBuf& buf) {
beginId.unpack(buf);
mtu = buf.unpackScalar<uint16_t>();
}
void VisitFilesReq::clear() {
beginId = InodeId();
mtu = uint16_t(0);
}
bool VisitFilesReq::operator==(const VisitFilesReq& rhs) const {
if ((InodeId)this->beginId != (InodeId)rhs.beginId) { return false; };
if ((uint16_t)this->mtu != (uint16_t)rhs.mtu) { return false; };
return true;
}
std::ostream& operator<<(std::ostream& out, const VisitFilesReq& x) {
out << "VisitFilesReq(" << "BeginId=" << x.beginId << ")";
out << "VisitFilesReq(" << "BeginId=" << x.beginId << ", " << "Mtu=" << x.mtu << ")";
return out;
}
@@ -1879,19 +1895,23 @@ std::ostream& operator<<(std::ostream& out, const VisitFilesResp& x) {
void VisitTransientFilesReq::pack(BincodeBuf& buf) const {
beginId.pack(buf);
buf.packScalar<uint16_t>(mtu);
}
void VisitTransientFilesReq::unpack(BincodeBuf& buf) {
beginId.unpack(buf);
mtu = buf.unpackScalar<uint16_t>();
}
void VisitTransientFilesReq::clear() {
beginId = InodeId();
mtu = uint16_t(0);
}
bool VisitTransientFilesReq::operator==(const VisitTransientFilesReq& rhs) const {
if ((InodeId)this->beginId != (InodeId)rhs.beginId) { return false; };
if ((uint16_t)this->mtu != (uint16_t)rhs.mtu) { return false; };
return true;
}
std::ostream& operator<<(std::ostream& out, const VisitTransientFilesReq& x) {
out << "VisitTransientFilesReq(" << "BeginId=" << x.beginId << ")";
out << "VisitTransientFilesReq(" << "BeginId=" << x.beginId << ", " << "Mtu=" << x.mtu << ")";
return out;
}
@@ -1920,22 +1940,26 @@ std::ostream& operator<<(std::ostream& out, const VisitTransientFilesResp& x) {
void FullReadDirReq::pack(BincodeBuf& buf) const {
dirId.pack(buf);
cursor.pack(buf);
buf.packScalar<uint16_t>(mtu);
}
void FullReadDirReq::unpack(BincodeBuf& buf) {
dirId.unpack(buf);
cursor.unpack(buf);
mtu = buf.unpackScalar<uint16_t>();
}
void FullReadDirReq::clear() {
dirId = InodeId();
cursor.clear();
mtu = uint16_t(0);
}
bool FullReadDirReq::operator==(const FullReadDirReq& rhs) const {
if ((InodeId)this->dirId != (InodeId)rhs.dirId) { return false; };
if (cursor != rhs.cursor) { return false; };
if ((uint16_t)this->mtu != (uint16_t)rhs.mtu) { return false; };
return true;
}
std::ostream& operator<<(std::ostream& out, const FullReadDirReq& x) {
out << "FullReadDirReq(" << "DirId=" << x.dirId << ", " << "Cursor=" << x.cursor << ")";
out << "FullReadDirReq(" << "DirId=" << x.dirId << ", " << "Cursor=" << x.cursor << ", " << "Mtu=" << x.mtu << ")";
return out;
}

View File

@@ -953,14 +953,16 @@ std::ostream& operator<<(std::ostream& out, const StatDirectoryResp& x);
struct ReadDirReq {
InodeId dirId;
uint64_t startHash;
uint16_t mtu;
static constexpr uint16_t STATIC_SIZE = 8 + 8; // dirId + startHash
static constexpr uint16_t STATIC_SIZE = 8 + 8 + 2; // dirId + startHash + mtu
ReadDirReq() { clear(); }
uint16_t packedSize() const {
uint16_t _size = 0;
_size += 8; // dirId
_size += 8; // startHash
_size += 2; // mtu
return _size;
}
void pack(BincodeBuf& buf) const;
@@ -1224,8 +1226,9 @@ struct FileSpansReq {
InodeId fileId;
uint64_t byteOffset;
uint32_t limit;
uint16_t mtu;
static constexpr uint16_t STATIC_SIZE = 8 + 8 + 4; // fileId + byteOffset + limit
static constexpr uint16_t STATIC_SIZE = 8 + 8 + 4 + 2; // fileId + byteOffset + limit + mtu
FileSpansReq() { clear(); }
uint16_t packedSize() const {
@@ -1233,6 +1236,7 @@ struct FileSpansReq {
_size += 8; // fileId
_size += 8; // byteOffset
_size += 4; // limit
_size += 2; // mtu
return _size;
}
void pack(BincodeBuf& buf) const;
@@ -1522,13 +1526,15 @@ std::ostream& operator<<(std::ostream& out, const ExpireTransientFileResp& x);
struct VisitDirectoriesReq {
InodeId beginId;
uint16_t mtu;
static constexpr uint16_t STATIC_SIZE = 8; // beginId
static constexpr uint16_t STATIC_SIZE = 8 + 2; // beginId + mtu
VisitDirectoriesReq() { clear(); }
uint16_t packedSize() const {
uint16_t _size = 0;
_size += 8; // beginId
_size += 2; // mtu
return _size;
}
void pack(BincodeBuf& buf) const;
@@ -1562,13 +1568,15 @@ std::ostream& operator<<(std::ostream& out, const VisitDirectoriesResp& x);
struct VisitFilesReq {
InodeId beginId;
uint16_t mtu;
static constexpr uint16_t STATIC_SIZE = 8; // beginId
static constexpr uint16_t STATIC_SIZE = 8 + 2; // beginId + mtu
VisitFilesReq() { clear(); }
uint16_t packedSize() const {
uint16_t _size = 0;
_size += 8; // beginId
_size += 2; // mtu
return _size;
}
void pack(BincodeBuf& buf) const;
@@ -1602,13 +1610,15 @@ std::ostream& operator<<(std::ostream& out, const VisitFilesResp& x);
struct VisitTransientFilesReq {
InodeId beginId;
uint16_t mtu;
static constexpr uint16_t STATIC_SIZE = 8; // beginId
static constexpr uint16_t STATIC_SIZE = 8 + 2; // beginId + mtu
VisitTransientFilesReq() { clear(); }
uint16_t packedSize() const {
uint16_t _size = 0;
_size += 8; // beginId
_size += 2; // mtu
return _size;
}
void pack(BincodeBuf& buf) const;
@@ -1643,14 +1653,16 @@ std::ostream& operator<<(std::ostream& out, const VisitTransientFilesResp& x);
struct FullReadDirReq {
InodeId dirId;
FullReadDirCursor cursor;
uint16_t mtu;
static constexpr uint16_t STATIC_SIZE = 8 + FullReadDirCursor::STATIC_SIZE; // dirId + cursor
static constexpr uint16_t STATIC_SIZE = 8 + FullReadDirCursor::STATIC_SIZE + 2; // dirId + cursor + mtu
FullReadDirReq() { clear(); }
uint16_t packedSize() const {
uint16_t _size = 0;
_size += 8; // dirId
_size += cursor.packedSize(); // cursor
_size += 2; // mtu
return _size;
}
void pack(BincodeBuf& buf) const;