Aggie Student Toolkit — Load Balancer CSCE 412 Project 4
Arnav Fotedar · Fall 2026 · C++ load balancer simulation
Loading...
Searching...
No Matches
RequestGenerator.cpp
Go to the documentation of this file.
1
6
7#include "RequestGenerator.h"
8
9#include <algorithm>
10#include <cmath>
11
12namespace {
14constexpr std::size_t kSampleCount = 10;
15}
16
18 : settings_(settings),
19 seed_(seed),
20 engine_(seed),
21 taskCycles_(settings.minTaskCycles, settings.maxTaskCycles),
22 octet_(0, 255),
23 firstOctet_(1, 223),
24 hostOctet_(1, 254),
25 streaming_(settings.streamingShare) {}
26
27double RequestGenerator::rateAt(unsigned long cycle) const {
28 if (settings_.wavePeriod == 0 || settings_.waveAmplitude == 0.0) {
29 return settings_.arrivalRate;
30 }
31 const double pi = std::acos(-1.0);
32 const double phase = 2.0 * pi * static_cast<double>(cycle % settings_.wavePeriod) / settings_.wavePeriod;
33 return std::max(0.0, settings_.arrivalRate * (1.0 + settings_.waveAmplitude * std::sin(phase)));
34}
35
36std::string RequestGenerator::randomIp() {
37 unsigned int first = firstOctet_(engine_);
38 while (first == 127) { // skip the loopback network
39 first = firstOctet_(engine_);
40 }
41 return std::to_string(first) + "." + std::to_string(octet_(engine_)) + "." +
42 std::to_string(octet_(engine_)) + "." + std::to_string(hostOctet_(engine_));
43}
44
46 Request request;
47 request.id = nextId_++;
48 request.sourceIp = randomIp();
49 request.destinationIp = randomIp();
50 request.taskCycles = taskCycles_(engine_);
51 request.arrivalCycle = cycle;
52 request.jobType = streaming_(engine_) ? JobType::Streaming : JobType::Processing;
53 record(request);
54 return request;
55}
56
57std::vector<Request> RequestGenerator::makeInitialBatch(std::size_t count, unsigned long cycle) {
58 std::vector<Request> batch;
59 batch.reserve(count);
60 for (std::size_t i = 0; i < count; ++i) {
61 batch.push_back(makeRequest(cycle));
62 }
63 stats_.initial += count;
64 return batch;
65}
66
67std::vector<Request> RequestGenerator::arrivalsFor(unsigned long cycle) {
68 const double rate = rateAt(cycle);
69 unsigned int count = 0;
70 if (rate > 0.0) { // a Poisson mean must be positive
71 arrivals_.param(std::poisson_distribution<unsigned int>::param_type(rate));
72 count = arrivals_(engine_);
73 }
74 stats_.arrivalHistogram[std::min<std::size_t>(count, GeneratorStats::kArrivalBins - 1)]++;
75 stats_.maxArrivalsInCycle = std::max<unsigned long>(stats_.maxArrivalsInCycle, count);
76 std::vector<Request> batch;
77 batch.reserve(count);
78 for (unsigned int i = 0; i < count; ++i) {
79 batch.push_back(makeRequest(cycle));
80 }
81 return batch;
82}
83
84void RequestGenerator::record(const Request& request) {
85 if (stats_.total == 0) {
86 stats_.minTaskSeen = request.taskCycles;
87 stats_.maxTaskSeen = request.taskCycles;
88 }
89 ++stats_.total;
90 if (request.jobType == JobType::Streaming) {
91 ++stats_.streaming;
92 } else {
93 ++stats_.processing;
94 }
95 stats_.minTaskSeen = std::min(stats_.minTaskSeen, request.taskCycles);
96 stats_.maxTaskSeen = std::max(stats_.maxTaskSeen, request.taskCycles);
97 stats_.taskCycleSum += request.taskCycles;
98
99 const unsigned long span = settings_.maxTaskCycles - settings_.minTaskCycles + 1UL;
100 const unsigned long offset = request.taskCycles - settings_.minTaskCycles;
101 stats_.taskHistogram[offset * GeneratorStats::kTaskBins / span]++;
102
103 if (samples_.size() < kSampleCount) {
104 samples_.push_back(request);
105 }
106}
107
109 return settings_;
110}
111
113 return stats_;
114}
115
116std::uint32_t RequestGenerator::seed() const {
117 return seed_;
118}
119
120const std::vector<Request>& RequestGenerator::samples() const {
121 return samples_;
122}
@ Processing
Short computational job, such as rendering a page or running a query.
Definition Request.h:20
@ Streaming
Long-lived transfer, such as streaming media or a large download.
Definition Request.h:21
Declares the RequestGenerator class, the seeded source of random traffic.
RequestGenerator(const GeneratorSettings &settings, std::uint32_t seed)
Creates a generator.
Request makeRequest(unsigned long cycle)
Creates one random request.
const std::vector< Request > & samples() const
const GeneratorStats & stats() const
std::vector< Request > makeInitialBatch(std::size_t count, unsigned long cycle)
Creates the initial queue contents.
const GeneratorSettings & settings() const
std::vector< Request > arrivalsFor(unsigned long cycle)
Creates the random arrivals for one clock cycle.
double rateAt(unsigned long cycle) const
Returns the mean arrival rate at a given cycle.
std::uint32_t seed() const
Tunable parameters for random request generation.
Running statistics that show the randomness of generated traffic.
static constexpr std::size_t kArrivalBins
Arrival-count buckets: 0, 1, 2, 3, 4+.
unsigned int minTaskSeen
Shortest task actually generated.
unsigned int maxTaskSeen
Longest task actually generated.
static constexpr std::size_t kTaskBins
Number of task-length histogram bins.
unsigned long total
Requests generated, including the initial queue.
A single web request waiting for, or receiving, service.
Definition Request.h:41
unsigned int taskCycles
Clock cycles of processing required (always at least 1).
Definition Request.h:45
unsigned long arrivalCycle
Clock cycle at which the request was generated.
Definition Request.h:46
JobType jobType
Processing ('P') or streaming ('S') work.
Definition Request.h:47
std::string destinationIp
IPv4 address the response is returned to.
Definition Request.h:44
unsigned long id
Sequential identifier assigned by the generator.
Definition Request.h:42
std::string sourceIp
IPv4 address of the client sending the request.
Definition Request.h:43