proxygen
proxygen::compress::CompressionSimulator Class Reference

#include <CompressionSimulator.h>

Public Member Functions

 CompressionSimulator (SimParams p)
 
bool readInputFromFileAndSchedule (const std::string &filename)
 
void run ()
 
void flushSchemePackets (CompressionScheme *scheme)
 
void flushPacket (CompressionScheme *scheme)
 

Private Member Functions

void flushRequests (CompressionScheme *scheme)
 
void setupRequest (uint16_t seqn, HTTPMessage &&msg, std::chrono::milliseconds encodeDelay)
 
CompressionSchemegetScheme (folly::StringPiece host)
 
std::unique_ptr< CompressionSchememakeScheme ()
 
std::pair< FrameFlags, std::unique_ptr< folly::IOBuf > > encode (CompressionScheme *scheme, bool newPacket, uint16_t seqn)
 
void decodePacket (CompressionScheme *scheme, std::list< CompressionScheme::BlockInfo > &blocks)
 
void decode (CompressionScheme *scheme, FrameFlags flags, std::unique_ptr< folly::IOBuf > encodedReq, SimStreamingCallback &cb)
 
void scheduleEvent (folly::Function< void()> f, std::chrono::milliseconds ms)
 
void sendAck (CompressionScheme *scheme, std::unique_ptr< CompressionScheme::Ack > ack)
 
void recvAck (CompressionScheme *scheme, std::unique_ptr< CompressionScheme::Ack > ack)
 
std::chrono::milliseconds deliveryDelay ()
 
std::chrono::milliseconds rtt ()
 
std::chrono::milliseconds one_half_rtt ()
 
std::chrono::milliseconds rxmitDelay ()
 
bool loss ()
 
bool delayed ()
 
std::chrono::milliseconds extraDelay ()
 
uint32_t minOOOThresh ()
 

Private Attributes

SimParams params_
 
std::vector< proxygen::HTTPMessagerequests_
 
folly::EventBase eventBase_
 
std::unordered_map< std::string, std::unique_ptr< CompressionScheme > > domains_
 
std::vector< SimStreamingCallbackcallbacks_
 
folly::Random::DefaultGenerator rng_
 
SimStats stats_
 

Detailed Description

Definition at line 23 of file CompressionSimulator.h.

Constructor & Destructor Documentation

Member Function Documentation

void proxygen::compress::CompressionSimulator::decode ( CompressionScheme scheme,
FrameFlags  flags,
std::unique_ptr< folly::IOBuf encodedReq,
SimStreamingCallback cb 
)
private

Definition at line 304 of file CompressionSimulator.cpp.

References proxygen::compress::CompressionScheme::decode(), and folly::gen::move.

Referenced by CompressionSimulator().

307  {
308  scheme->decode(flags, std::move(encodedReq), stats_, cb);
309 }
constexpr detail::Map< Move > move
Definition: Base-inl.h:2567
virtual void decode(FrameFlags flags, std::unique_ptr< folly::IOBuf > encodedReq, SimStats &stats, SimStreamingCallback &cb)=0
void proxygen::compress::CompressionSimulator::decodePacket ( CompressionScheme scheme,
std::list< CompressionScheme::BlockInfo > &  blocks 
)
private

Definition at line 311 of file CompressionSimulator.cpp.

References fizz::decode(), and folly::gen::move.

Referenced by CompressionSimulator().

313  {
314  VLOG(1) << "decode packet with " << blocks.size() << " blocks";
315  while (!blocks.empty()) {
316  auto encodeRes = &blocks.front();
317  // TODO(ckrasic) - to get packet coordination correct, could plumb
318  // through "start of packet" flag here. Probably not worth it,
319  // since it seems to make only a very small difference (about a
320  // 0.1% compressiondifference on my facebook har).
321  decode(scheme,
322  std::get<0>(*encodeRes),
323  std::move(std::get<2>(*encodeRes)),
324  *std::get<3>(*encodeRes));
325  blocks.pop_front();
326  }
327 }
constexpr detail::Map< Move > move
Definition: Base-inl.h:2567
void decode(CompressionScheme *scheme, FrameFlags flags, std::unique_ptr< folly::IOBuf > encodedReq, SimStreamingCallback &cb)
bool proxygen::compress::CompressionSimulator::delayed ( )
private

Definition at line 390 of file CompressionSimulator.cpp.

Referenced by CompressionSimulator().

390  {
391  return Random::randDouble01(rng_) < params_.delayProbability;
392 }
folly::Random::DefaultGenerator rng_
std::chrono::milliseconds proxygen::compress::CompressionSimulator::deliveryDelay ( )
private

Definition at line 352 of file CompressionSimulator.cpp.

Referenced by CompressionSimulator().

352  {
353  std::chrono::milliseconds delay = one_half_rtt();
354  while (loss()) {
356  scheduleEvent([] { VLOG(4) << "Packet lost!"; }, delay);
357  std::chrono::milliseconds rxmit = rxmitDelay();
358  delay += rxmit;
360  [rxmit] {
361  VLOG(4) << "Packet loss detected, retransmitting with additional "
362  << rxmit.count();
363  },
364  delay - one_half_rtt());
365  }
366  if (delayed()) {
367  scheduleEvent([] { VLOG(4) << "Packet delayed in network"; }, delay);
368  delay += extraDelay();
369  }
370  return delay;
371 }
void scheduleEvent(folly::Function< void()> f, std::chrono::milliseconds ms)
std::pair< FrameFlags, unique_ptr< IOBuf > > proxygen::compress::CompressionSimulator::encode ( CompressionScheme scheme,
bool  newPacket,
uint16_t  seqn 
)
private

Definition at line 284 of file CompressionSimulator.cpp.

References proxygen::compress::CompressionScheme::encode(), proxygen::HTTP_HEADER_HOST, folly::gen::move, and proxygen::compress::prepareMessageForCompression().

Referenced by CompressionSimulator().

285  {
286  VLOG(1) << "Start encoding request=" << index;
287  // vector to hold cookie crumbs
288  vector<string> cookies;
289  vector<compress::Header> allHeaders = prepareMessageForCompression(
290  requests_[index], cookies);
291 
292  auto before = stats_.uncompressed;
293  auto res = scheme->encode(newPacket, std::move(allHeaders), stats_);
294  VLOG(1) << "Encoded request=" << index << " for host="
295  << requests_[index].getHeaders().getSingleOrEmpty(HTTP_HEADER_HOST)
296  << " orig size=" << (stats_.uncompressed - before)
297  << " block size=" << res.second->computeChainDataLength()
298  << " cumulative bytes=" << stats_.compressed
299  << " cumulative compression ratio="
300  << int(100 - double(100 * stats_.compressed) / stats_.uncompressed);
301  return res;
302 }
constexpr detail::Map< Move > move
Definition: Base-inl.h:2567
virtual std::pair< FrameFlags, std::unique_ptr< folly::IOBuf > > encode(bool newPacket, std::vector< compress::Header > allHeaders, SimStats &stats)=0
std::vector< compress::Header > prepareMessageForCompression(const HTTPMessage &msg, std::vector< string > &cookies)
std::vector< proxygen::HTTPMessage > requests_
std::chrono::milliseconds proxygen::compress::CompressionSimulator::extraDelay ( )
private

Definition at line 394 of file CompressionSimulator.cpp.

References uint32_t.

Referenced by CompressionSimulator().

394  {
395  uint32_t ms = params_.maxDelay.count() * Random::randDouble01(rng_);
396  return std::chrono::milliseconds(ms);
397 }
std::chrono::milliseconds maxDelay
folly::Random::DefaultGenerator rng_
void proxygen::compress::CompressionSimulator::flushPacket ( CompressionScheme scheme)

Definition at line 184 of file CompressionSimulator.cpp.

References proxygen::compress::CompressionScheme::decodeDelay, folly::gen::move, proxygen::compress::CompressionScheme::packetBlocks, and proxygen::compress::CompressionScheme::packetBytes.

Referenced by CompressionSimulator().

184  {
185  if (scheme->packetBlocks.empty()) {
186  return;
187  }
188 
189  stats_.packets++;
190  VLOG(1) << "schedule decode for " << scheme->packetBlocks.size()
191  << " blocks at " << scheme->decodeDelay.count();
193  {[this, scheme, blocks = std::move(scheme->packetBlocks)]() mutable {
194  decodePacket(scheme, blocks);
195  }},
196  scheme->decodeDelay);
197  scheme->packetBytes = 0;
198 }
void decodePacket(CompressionScheme *scheme, std::list< CompressionScheme::BlockInfo > &blocks)
constexpr detail::Map< Move > move
Definition: Base-inl.h:2567
void scheduleEvent(folly::Function< void()> f, std::chrono::milliseconds ms)
std::chrono::milliseconds decodeDelay
void proxygen::compress::CompressionSimulator::flushRequests ( CompressionScheme scheme)
private

Definition at line 103 of file CompressionSimulator.cpp.

References folly::gen::move, proxygen::compress::CompressionScheme::packetIndices, and proxygen::compress::CompressionScheme::prev.

Referenced by CompressionSimulator().

103  {
104  VLOG(5) << "schedule encode for " << scheme->packetIndices.size()
105  << " blocks at " << scheme->prev.count();
106  // Flush previous train
108  [this, scheme, indices = std::move(scheme->packetIndices)]() mutable {
109  bool newPacket = true;
110  while (!indices.empty()) {
111  int16_t index = indices.front();
112  indices.pop_front();
113  auto schemeIndex = scheme->index;
114  auto encodeRes = encode(scheme, newPacket, index);
115  FrameFlags flags = encodeRes.first;
116  bool allowOOO = flags.allowOOO;
117  if (schemeIndex < minOOOThresh()) {
118  allowOOO = false;
119  auto ack = scheme->getAck(schemeIndex);
120  if (ack) {
121  scheme->recvAck(std::move(ack));
122  }
123  }
124  stats_.allowedOOO += (allowOOO) ? 1 : 0;
125  flags.allowOOO = allowOOO;
126  scheme->encodedBlocks.emplace_back(flags,
127  newPacket,
128  std::move(encodeRes.second),
129  &callbacks_[index]);
130  newPacket = false;
131  }
132  eventBase_.runInLoop(scheme, true);
133  },
134  scheme->prev);
135 }
constexpr detail::Map< Move > move
Definition: Base-inl.h:2567
void runInLoop(LoopCallback *callback, bool thisIteration=false)
Definition: EventBase.cpp:520
void scheduleEvent(folly::Function< void()> f, std::chrono::milliseconds ms)
void proxygen::compress::CompressionSimulator::flushSchemePackets ( CompressionScheme scheme)

Definition at line 200 of file CompressionSimulator.cpp.

References proxygen::compress::CompressionScheme::decodeDelay, proxygen::compress::CompressionScheme::encodedBlocks, max, min, proxygen::compress::CompressionScheme::packetBlocks, and proxygen::compress::CompressionScheme::packetBytes.

Referenced by CompressionSimulator().

200  {
201  CHECK(!scheme->encodedBlocks.empty());
202  VLOG(2) << "Flushing " << scheme->encodedBlocks.size() << " requests";
203  // tracks the number of bytes in the current simulated packet
204  auto encodeRes = &scheme->encodedBlocks.front();
205  bool newPacket = std::get<1>(*encodeRes);
206  size_t headerBlockBytesRemaining =
207  std::get<2>(*encodeRes)->computeChainDataLength();
208  std::chrono::milliseconds packetDelay = deliveryDelay();
209  scheme->decodeDelay = packetDelay;
210  while (true) {
211  if (newPacket) {
212  flushPacket(scheme);
213  }
214  newPacket = false;
215  // precondition packetBytes < kMTU
216  if (scheme->packetBytes + headerBlockBytesRemaining >= kMTU) {
217  // Header block filled current packet, triggering a flush
218  VLOG(2) << "Request(s) spanned multiple packets";
219  newPacket = true;
220  } else {
221  scheme->packetBytes += headerBlockBytesRemaining;
222  }
223  headerBlockBytesRemaining -=
224  std::min(headerBlockBytesRemaining, kMTU - scheme->packetBytes);
225  if (headerBlockBytesRemaining == 0) {
226  // Move from the first element of encodedBlocks to the last
227  // element of packetBlocks.
228  scheme->packetBlocks.splice(scheme->packetBlocks.end(),
229  scheme->encodedBlocks,
230  scheme->encodedBlocks.begin());
231  if (scheme->encodedBlocks.empty()) {
232  // All done
233  break;
234  }
235  // Grab the next request
236  encodeRes = &scheme->encodedBlocks.front();
237  newPacket = std::get<1>(*encodeRes);
238  headerBlockBytesRemaining =
239  std::get<2>(*encodeRes)->computeChainDataLength();
240  }
241  if (newPacket) {
242  packetDelay = deliveryDelay();
243  scheme->decodeDelay = std::max(scheme->decodeDelay, packetDelay);
244  }
245  }
246  flushPacket(scheme);
247  CHECK(scheme->encodedBlocks.empty());
248 }
LogLevel max
Definition: LogLevel.cpp:31
LogLevel min
Definition: LogLevel.cpp:30
std::chrono::milliseconds decodeDelay
void flushPacket(CompressionScheme *scheme)
CompressionScheme * proxygen::compress::CompressionSimulator::getScheme ( folly::StringPiece  host)
private

Definition at line 250 of file CompressionSimulator.cpp.

References folly::Range< Iter >::endsWith(), folly::Range< Iter >::find(), folly::INFO, folly::gen::move, and folly::Range< Iter >::str().

Referenced by CompressionSimulator().

250  {
251  static string blended("\"Facebook\"");
252  if (params_.blend &&
253  (domain.endsWith("facebook.com") || domain.endsWith("fbcdn.net"))) {
254  domain = blended;
255  }
256 
257  auto it = domains_.find(domain.str());
258  CompressionScheme* scheme = nullptr;
259  if (it == domains_.end()) {
260  LOG(INFO) << "Creating scheme for domain=" << domain;
261  auto schemePtr = makeScheme();
262  scheme = schemePtr.get();
263  domains_.emplace(domain.str(), std::move(schemePtr));
264  } else {
265  scheme = it->second.get();
266  }
267  return scheme;
268 }
std::unique_ptr< CompressionScheme > makeScheme()
constexpr detail::Map< Move > move
Definition: Base-inl.h:2567
std::unordered_map< std::string, std::unique_ptr< CompressionScheme > > domains_
bool proxygen::compress::CompressionSimulator::loss ( )
private

Definition at line 386 of file CompressionSimulator.cpp.

Referenced by CompressionSimulator().

386  {
387  return Random::randDouble01(rng_) < params_.lossProbability;
388 }
folly::Random::DefaultGenerator rng_
unique_ptr< CompressionScheme > proxygen::compress::CompressionSimulator::makeScheme ( )
private

Definition at line 270 of file CompressionSimulator.cpp.

References folly::FATAL.

Referenced by CompressionSimulator().

270  {
271  switch (params_.type) {
272  case SchemeType::QPACK:
273  return make_unique<QPACKScheme>(this, params_.tableSize,
275  case SchemeType::QMIN:
276  return make_unique<QMINScheme>(this, params_.tableSize);
277  case SchemeType::HPACK:
278  return make_unique<HPACKScheme>(this, params_.tableSize);
279  }
280  LOG(FATAL) << "Bad scheme";
281  return nullptr;
282 }
uint32_t proxygen::compress::CompressionSimulator::minOOOThresh ( )
private

Definition at line 399 of file CompressionSimulator.cpp.

Referenced by CompressionSimulator().

std::chrono::milliseconds proxygen::compress::CompressionSimulator::one_half_rtt ( )
private

Definition at line 377 of file CompressionSimulator.cpp.

Referenced by CompressionSimulator().

377  {
378  return params_.rtt / 2;
379 }
std::chrono::milliseconds rtt
bool proxygen::compress::CompressionSimulator::readInputFromFileAndSchedule ( const std::string filename)

Definition at line 36 of file CompressionSimulator.cpp.

References a, b, proxygen::ERROR, folly::exceptionStr(), folly::gen::fromFile(), proxygen::HTTPMessage::getStartTime(), proxygen::millisecondsBetween(), folly::gen::move, proxygen::HTTPArchive::requests, and uint16_t.

Referenced by CompressionSimulator(), and main().

37  {
38  unique_ptr<HTTPArchive> har;
39  try {
40  har = HTTPArchive::fromFile(kTestDir + filename);
41  } catch (const std::exception& ex) {
42  LOG(ERROR) << folly::exceptionStr(ex);
43  }
44  if (!har || har->requests.size() == 0) {
45  return false;
46  }
47  // Sort by start time (har ordered by finish time?)
48  std::sort(har->requests.begin(),
49  har->requests.end(),
50  [](const HTTPMessage& a, const HTTPMessage& b) {
51  return a.getStartTime() < b.getStartTime();
52  });
53  TimePoint last = har->requests[0].getStartTime();
54  std::chrono::milliseconds cumulativeDelay(0);
55  uint16_t index = 0;
56  for (HTTPMessage& msg : har->requests) {
57  auto delayFromPrevious = millisecondsBetween(msg.getStartTime(), last);
58  // If there was a quiescent gap in the HAR of at least some value, shrink
59  // it so the test doesn't last forever
60  if (delayFromPrevious > std::chrono::milliseconds(1000)) {
61  delayFromPrevious = std::chrono::milliseconds(1000);
62  }
63  last = msg.getStartTime();
64  cumulativeDelay += delayFromPrevious;
65  setupRequest(index++, std::move(msg), cumulativeDelay);
66  }
67  for (auto& kv : domains_) {
68  flushRequests(kv.second.get());
69  }
70  return true;
71 }
std::chrono::milliseconds millisecondsBetween(std::chrono::time_point< ClockType > finish, std::chrono::time_point< ClockType > start)
Definition: Time.h:85
char b
fbstring exceptionStr(const std::exception &e)
constexpr detail::Map< Move > move
Definition: Base-inl.h:2567
std::unordered_map< std::string, std::unique_ptr< CompressionScheme > > domains_
TimePoint getStartTime() const
Definition: HTTPMessage.h:622
void setupRequest(uint16_t seqn, HTTPMessage &&msg, std::chrono::milliseconds encodeDelay)
static std::unique_ptr< HTTPArchive > fromFile(const std::string &filename)
char a
void flushRequests(CompressionScheme *scheme)
std::vector< HTTPMessage > requests
Definition: HTTPArchive.h:24
void proxygen::compress::CompressionSimulator::recvAck ( CompressionScheme scheme,
std::unique_ptr< CompressionScheme::Ack ack 
)
private

Definition at line 347 of file CompressionSimulator.cpp.

References folly::gen::move, and proxygen::compress::CompressionScheme::recvAck().

Referenced by CompressionSimulator().

348  {
349  scheme->recvAck(std::move(ack));
350 }
virtual void recvAck(std::unique_ptr< Ack >)=0
constexpr detail::Map< Move > move
Definition: Base-inl.h:2567
std::chrono::milliseconds proxygen::compress::CompressionSimulator::rtt ( )
private

Definition at line 373 of file CompressionSimulator.cpp.

Referenced by CompressionSimulator().

373  {
374  return params_.rtt;
375 }
std::chrono::milliseconds rtt
void proxygen::compress::CompressionSimulator::run ( )

Definition at line 73 of file CompressionSimulator.cpp.

References folly::INFO, and uint32_t.

Referenced by CompressionSimulator(), and main().

73  {
74 #ifndef HAVE_REAL_QMIN
75  if (params_.type == SchemeType::QMIN) {
76  LOG(INFO) << "QMIN not available";
77  return;
78  }
79 #endif
80 
81  LOG(INFO) << "Starting run";
82  eventBase_.loop();
83  uint32_t holBlockCount = 0;
84  for (auto& scheme : domains_) {
85  holBlockCount += scheme.second->getHolBlockCount();
86  }
87  LOG(INFO) << "Complete"
88  << "\nStats:"
89  "\nSeed: "
90  << params_.seed << "\nBlocks sent: " << requests_.size()
91  << "\nAllowed OOO: " << stats_.allowedOOO
92  << "\nPackets: " << stats_.packets
93  << "\nPacket Losses: " << stats_.packetLosses
94  << "\nHOL Block Count: " << holBlockCount
95  << "\nHOL Delay (ms): " << stats_.holDelay.count()
96  << "\nMax Queue Buffer Bytes: " << stats_.maxQueueBufferBytes
97  << "\nUncompressed Bytes: " << stats_.uncompressed
98  << "\nCompressed Bytes: " << stats_.compressed
99  << "\nCompression Ratio: "
100  << int(100 - double(100 * stats_.compressed) / stats_.uncompressed);
101 }
std::chrono::milliseconds holDelay
std::unordered_map< std::string, std::unique_ptr< CompressionScheme > > domains_
std::vector< proxygen::HTTPMessage > requests_
std::chrono::milliseconds proxygen::compress::CompressionSimulator::rxmitDelay ( )
private

Definition at line 381 of file CompressionSimulator.cpp.

References uint32_t.

Referenced by CompressionSimulator().

381  {
382  uint32_t ms = rtt().count() * Random::randDouble(1.1, 2, rng_);
383  return std::chrono::milliseconds(ms);
384 }
folly::Random::DefaultGenerator rng_
void proxygen::compress::CompressionSimulator::scheduleEvent ( folly::Function< void()>  f,
std::chrono::milliseconds  ms 
)
private

Definition at line 329 of file CompressionSimulator.cpp.

References f, and folly::gen::move.

Referenced by CompressionSimulator().

330  {
331  eventBase_.runAfterDelay(std::move(f), ms.count());
332 }
constexpr detail::Map< Move > move
Definition: Base-inl.h:2567
void runAfterDelay(Func cob, uint32_t milliseconds, InternalEnum internal=InternalEnum::NORMAL)
void proxygen::compress::CompressionSimulator::sendAck ( CompressionScheme scheme,
std::unique_ptr< CompressionScheme::Ack ack 
)
private

Definition at line 334 of file CompressionSimulator.cpp.

References a, and folly::gen::move.

Referenced by CompressionSimulator().

335  {
336  if (!ack) {
337  return;
338  }
339  // An ack is a packet
340  stats_.packets++;
341  scheduleEvent([a = std::move(ack),
342  this,
343  scheme]() mutable { recvAck(scheme, std::move(a)); },
344  deliveryDelay());
345 }
constexpr detail::Map< Move > move
Definition: Base-inl.h:2567
void scheduleEvent(folly::Function< void()> f, std::chrono::milliseconds ms)
char a
void recvAck(CompressionScheme *scheme, std::unique_ptr< CompressionScheme::Ack > ack)
void proxygen::compress::CompressionSimulator::setupRequest ( uint16_t  seqn,
HTTPMessage &&  msg,
std::chrono::milliseconds  encodeDelay 
)
private

Definition at line 137 of file CompressionSimulator.cpp.

References proxygen::HTTP_HEADER_HOST, and value.

Referenced by CompressionSimulator().

139  {
140  // Normalize to relative paths
141  const auto& query = msg.getQueryString();
142  if (query.empty()) {
143  msg.setURL(msg.getPath());
144  } else {
145  msg.setURL(folly::to<string>(msg.getPath(), "?", query));
146  }
147 
149  requests_.emplace_back(msg);
150  auto decodeCompleteCB =
151  [index, this, scheme](std::chrono::milliseconds holDelay) {
152  // record processed timestamp
153  CHECK(!callbacks_[index].getResult().hasError());
154  DCHECK_EQ(requests_[index], *callbacks_[index].getResult().value());
155  stats_.holDelay += holDelay;
156  VLOG(1) << "Finished decoding request=" << index
157  << " with holDelay=" << holDelay.count()
158  << " cumulative HoL delay=" << stats_.holDelay.count();
159  sendAck(scheme, scheme->getAck(callbacks_[index].seqn));
160  };
161  callbacks_.emplace_back(index, decodeCompleteCB);
162 
163  // Assume that all packets with same encodeDelay will form a packet
164  // train. Encode them as a group, so can we can emulate packet
165  // boundaries more realistically, telling the encoder which blocks
166  // start such trains.
167  if (scheme->packetIndices.size() > 0) {
168  auto delayFromPrevious = encodeDelay - scheme->prev;
169  VLOG(1) << "request " << index << " delay " << delayFromPrevious.count();
170  if (delayFromPrevious > std::chrono::milliseconds(1)) {
171  flushRequests(scheme);
172  }
173  }
174  scheme->prev = encodeDelay;
175  scheme->packetIndices.push_back(index);
176 }
std::vector< SimStreamingCallback > callbacks_
const std::string & getPath() const
Definition: HTTPMessage.h:215
std::chrono::milliseconds holDelay
const std::string & getQueryString() const
Definition: HTTPMessage.h:222
ParseURL setURL(T &&url)
Definition: HTTPMessage.h:183
void flushRequests(CompressionScheme *scheme)
static const char *const value
Definition: Conv.cpp:50
HTTPHeaders & getHeaders()
Definition: HTTPMessage.h:273
const std::string & getSingleOrEmpty(const T &nameOrCode) const
Definition: HTTPHeaders.h:420
CompressionScheme * getScheme(folly::StringPiece host)
void sendAck(CompressionScheme *scheme, std::unique_ptr< CompressionScheme::Ack > ack)
std::vector< proxygen::HTTPMessage > requests_

Member Data Documentation

std::vector<SimStreamingCallback> proxygen::compress::CompressionSimulator::callbacks_
private

Definition at line 70 of file CompressionSimulator.h.

std::unordered_map<std::string, std::unique_ptr<CompressionScheme> > proxygen::compress::CompressionSimulator::domains_
private

Definition at line 69 of file CompressionSimulator.h.

folly::EventBase proxygen::compress::CompressionSimulator::eventBase_
private

Definition at line 67 of file CompressionSimulator.h.

SimParams proxygen::compress::CompressionSimulator::params_
private

Definition at line 65 of file CompressionSimulator.h.

std::vector<proxygen::HTTPMessage> proxygen::compress::CompressionSimulator::requests_
private

Definition at line 66 of file CompressionSimulator.h.

folly::Random::DefaultGenerator proxygen::compress::CompressionSimulator::rng_
private
Initial value:
{
static_cast<folly::Random::DefaultGenerator::result_type>(params_.seed)}

Definition at line 71 of file CompressionSimulator.h.

SimStats proxygen::compress::CompressionSimulator::stats_
private

Definition at line 73 of file CompressionSimulator.h.


The documentation for this class was generated from the following files: