add randomization of data for ordered test

This commit is contained in:
Stephen Birarda 2015-08-20 12:44:10 -07:00
parent 74d6e5ba89
commit 039e6121bc
2 changed files with 67 additions and 17 deletions

View file

@ -11,6 +11,8 @@
#include "UDTTest.h" #include "UDTTest.h"
#include <random>
#include <QtCore/QDebug> #include <QtCore/QDebug>
#include <udt/Constants.h> #include <udt/Constants.h>
@ -29,16 +31,16 @@ const QCommandLineOption PACKET_SIZE {
QString(udt::MAX_PACKET_SIZE_WITH_UDP_HEADER) QString(udt::MAX_PACKET_SIZE_WITH_UDP_HEADER)
}; };
const QCommandLineOption MIN_PACKET_SIZE { const QCommandLineOption MIN_PACKET_SIZE {
"min-packet-size", "min size for sent packets in bytes", "min-bytes" "min-packet-size", "min size for sent packets in bytes", "min bytes"
}; };
const QCommandLineOption MAX_PACKET_SIZE { const QCommandLineOption MAX_PACKET_SIZE {
"max-packet-size", "max size for sent packets in bytes", "max-bytes" "max-packet-size", "max size for sent packets in bytes", "max bytes"
}; };
const QCommandLineOption MAX_SEND_BYTES { const QCommandLineOption MAX_SEND_BYTES {
"max-send-bytes", "number of bytes to send before stopping (default is infinite)", "max-bytes" "max-send-bytes", "number of bytes to send before stopping (default is infinite)", "max bytes"
}; };
const QCommandLineOption MAX_SEND_PACKETS { const QCommandLineOption MAX_SEND_PACKETS {
"max-send-packets", "number of packets to send before stopping (default is infinite)", "max-packets" "max-send-packets", "number of packets to send before stopping (default is infinite)", "max packets"
}; };
const QCommandLineOption UNRELIABLE_PACKETS { const QCommandLineOption UNRELIABLE_PACKETS {
"unreliable", "send unreliable packets (default is reliable)" "unreliable", "send unreliable packets (default is reliable)"
@ -46,6 +48,9 @@ const QCommandLineOption UNRELIABLE_PACKETS {
const QCommandLineOption ORDERED_PACKETS { const QCommandLineOption ORDERED_PACKETS {
"ordered", "send ordered packets (default is unordered)" "ordered", "send ordered packets (default is unordered)"
}; };
const QCommandLineOption MESSAGE_SIZE {
"message-size", "megabytes per message payload for ordered sending (default is 100)", "megabytes"
};
const QStringList CLIENT_STATS_TABLE_HEADERS { const QStringList CLIENT_STATS_TABLE_HEADERS {
"Send Rate (P/s)", "Bandwidth (P/s)", "RTT(ms)", "CW (P)", "Send Period (us)", "Send Rate (P/s)", "Bandwidth (P/s)", "RTT(ms)", "CW (P)", "Send Period (us)",
@ -138,6 +143,17 @@ UDTTest::UDTTest(int& argc, char** argv) :
_sendOrdered = true; _sendOrdered = true;
} }
if (_argumentParser.isSet(MESSAGE_SIZE)) {
if (_argumentParser.isSet(ORDERED_PACKETS)) {
static const double BYTES_PER_MEGABYTE = 1000000;
_messageSize = (int) _argumentParser.value(MESSAGE_SIZE).toInt() * BYTES_PER_MEGABYTE;
qDebug() << "Message size for ordered packet sending is" << QString("%1MB").arg(_messageSize / BYTES_PER_MEGABYTE);
} else {
qWarning() << "message-size has no effect if not sending ordered - it will be ignored";
}
}
if (!_target.isNull()) { if (!_target.isNull()) {
sendInitialPackets(); sendInitialPackets();
} }
@ -159,7 +175,8 @@ void UDTTest::parseArguments() {
_argumentParser.addOptions({ _argumentParser.addOptions({
PORT_OPTION, TARGET_OPTION, PACKET_SIZE, MIN_PACKET_SIZE, MAX_PACKET_SIZE, PORT_OPTION, TARGET_OPTION, PACKET_SIZE, MIN_PACKET_SIZE, MAX_PACKET_SIZE,
MAX_SEND_BYTES, MAX_SEND_PACKETS, UNRELIABLE_PACKETS, ORDERED_PACKETS MAX_SEND_BYTES, MAX_SEND_PACKETS, UNRELIABLE_PACKETS, ORDERED_PACKETS,
MESSAGE_SIZE
}); });
if (!_argumentParser.parse(arguments())) { if (!_argumentParser.parse(arguments())) {
@ -189,6 +206,8 @@ void UDTTest::sendInitialPackets() {
} }
} }
static const int FIRST_MESSAGE_SEED = 742272;
void UDTTest::sendPacket() { void UDTTest::sendPacket() {
if (_maxSendPackets != -1 && _totalQueuedPackets > _maxSendPackets) { if (_maxSendPackets != -1 && _totalQueuedPackets > _maxSendPackets) {
@ -216,22 +235,51 @@ void UDTTest::sendPacket() {
} }
if (_sendOrdered) { if (_sendOrdered) {
// check if it is time to add another message - we do this every time 95% of the message size has been sent
static int call = 0; static int call = 0;
call = (call + 1) % 4; static int packetSize = udt::Packet::maxPayloadSize(true);
if (call == 0) { static int messageSizePackets = (int) ceil(_messageSize / udt::Packet::maxPayloadSize());
auto packetList = std::unique_ptr<udt::PacketList>(new udt::PacketList(PacketType::BulkAvatarData, QByteArray(), true, true));
for (int i = 0; i < 4; i++) { static int refillCount = (int) (messageSizePackets * 0.95);
packetList->writePrimitive(0x1);
packetList->writePrimitive(0x2); if (call++ % refillCount == 0) {
packetList->writePrimitive(0x3); // construct a reliable and ordered packet list
packetList->writePrimitive(0x4); auto packetList = std::unique_ptr<udt::PacketList>({
packetList->closeCurrentPacket(false); new udt::PacketList(PacketType::BulkAvatarData, QByteArray(), true, true)
});
static int currentSeed = FIRST_MESSAGE_SEED;
std::random_device rd;
std::mt19937 generator(rd());
// seed the generator with a value that the receiver will also use when verifying the ordered message
generator.seed(currentSeed++);
// setup a distribution for integer values
std::uniform_int_distribution<> dis(1, UINT64_MAX);
// fill the packet list with random data according to the constant seed (so receiver can verify)
for (int i = 0; i < messageSizePackets; ++i) {
// setup a QByteArray full of zeros for our random padded data
QByteArray randomPaddedData { packetSize, 0 };
// generate a random integer for the first 8 bytes of the random data
uint64_t randomInt = dis(generator);
randomPaddedData.replace(0, sizeof(randomInt), reinterpret_cast<char*>(&randomInt));
// write this data to the PacketList
packetList->write(randomPaddedData);
} }
packetList->closeCurrentPacket(false);
_totalQueuedBytes += packetList->getDataSize(); _totalQueuedBytes += packetList->getDataSize();
_totalQueuedPackets += packetList->getNumPackets();
_socket.writePacketList(std::move(packetList), _target); _socket.writePacketList(std::move(packetList), _target);
} }
_totalQueuedPackets += 4;
} else { } else {
auto newPacket = udt::Packet::create(packetPayloadSize, _sendReliable); auto newPacket = udt::Packet::create(packetPayloadSize, _sendReliable);
newPacket->setPayloadSize(packetPayloadSize); newPacket->setPayloadSize(packetPayloadSize);
@ -239,12 +287,12 @@ void UDTTest::sendPacket() {
_totalQueuedBytes += newPacket->getDataSize(); _totalQueuedBytes += newPacket->getDataSize();
// queue or send this packet by calling write packet on the socket for our target // queue or send this packet by calling write packet on the socket for our target
// if (
if (_sendReliable) { if (_sendReliable) {
_socket.writePacket(std::move(newPacket), _target); _socket.writePacket(std::move(newPacket), _target);
} else { } else {
_socket.writePacket(*newPacket, _target); _socket.writePacket(*newPacket, _target);
} }
++_totalQueuedPackets; ++_totalQueuedPackets;
} }

View file

@ -48,6 +48,8 @@ private:
bool _sendReliable { true }; // whether packets are sent reliably or unreliably bool _sendReliable { true }; // whether packets are sent reliably or unreliably
bool _sendOrdered { false }; // whether to send ordered packets bool _sendOrdered { false }; // whether to send ordered packets
int _messageSize { 10000000 }; // number of bytes per message while sending ordered
int _totalQueuedPackets { 0 }; // keeps track of the number of packets we have already queued int _totalQueuedPackets { 0 }; // keeps track of the number of packets we have already queued
int _totalQueuedBytes { 0 }; // keeps track of the number of bytes we have already queued int _totalQueuedBytes { 0 }; // keeps track of the number of bytes we have already queued
}; };