Cockatrice/libcockatrice_protocol/libcockatrice/protocol/pending_command.h
BruebachL b91e872f5f
[Network] Measure real server round-trip times (#7153)
* [Network] Measure real server round-trip times

Time each command container from send to response with QElapsedTimer,
aggregate samples in a fixed-size ring buffer (last/median/p95/max),
and emit aggregated pingStatsUpdated at most once per second so the
hot path stays free of signal traffic. Stats are cleared on
disconnect. Forward the signal through ConnectionController for UI
consumers. Unit-tested in latency_tracker_test.

Took 37 minutes

Took 4 minutes

# Commit time for manual adjustment:
# Took 8 minutes

* Move params to struct, more informative debug

Took 56 seconds

Took 53 seconds

Took 2 minutes

Took 33 seconds

---------

Co-authored-by: Lukas Brübach <Bruebach.Lukas@bdosecurity.de>
2026-08-23 00:03:52 +02:00

48 lines
1.2 KiB
C++

/**
* @file pending_command.h
* @ingroup Messages
*/
//! \todo Document this file.
#ifndef PENDING_COMMAND_H
#define PENDING_COMMAND_H
#include <QElapsedTimer>
#include <QVariant>
#include <libcockatrice/protocol/pb/commands.pb.h>
#include <libcockatrice/protocol/pb/response.pb.h>
class PendingCommand : public QObject
{
Q_OBJECT
signals:
void finished(const Response &response, const CommandContainer &commandContainer, const QVariant &extraData);
private:
CommandContainer commandContainer;
QVariant extraData;
int ticks;
QElapsedTimer startTime;
public:
explicit PendingCommand(const CommandContainer &_commandContainer, QVariant _extraData = QVariant());
CommandContainer &getCommandContainer();
void setExtraData(const QVariant &_extraData);
QVariant getExtraData() const;
void processResponse(const Response &response);
int tick();
/**
* @brief Starts the round-trip timer. Called by the client thread right
* before the command container is handed to the transport layer.
*/
void startTiming();
/**
* @return Milliseconds elapsed since startTiming(), or -1 if the timer was
* never started.
*/
qint64 elapsedMs() const;
};
#endif