
Fixes test failure (https://github.com/valkey-io/valkey/actions/runs/10146979329/job/28056316421?pr=837) on 32 bit system for slot stats metric underflow on the following condition: ``` server.cluster->slot_stats[c->slot].network_bytes_out += (len * listLength(server.replicas)); ``` * Here listLength accesses `len` which is of `unsigned long` type and multiplied with `len` (which could be negative). This is a risky operation and behaves differently based on the architecture. ``` clusterSlotStatsAddNetworkBytesOutForReplication(-sdslen(selectcmd->ptr)); ``` * `sdslen` method returns `size_t`. applying `-` operation to decrement network bytes out is also incorrect. This change adds assertion on `len` being negative and handles the wrapping of overall value. --------- Signed-off-by: Harkrishn Patro <harkrisp@amazon.com>
24 lines
886 B
C
24 lines
886 B
C
#include "server.h"
|
|
#include "cluster.h"
|
|
#include "script.h"
|
|
#include "cluster_legacy.h"
|
|
|
|
/* General use-cases. */
|
|
void clusterSlotStatReset(int slot);
|
|
void clusterSlotStatResetAll(void);
|
|
|
|
/* cpu-usec metric. */
|
|
void clusterSlotStatsAddCpuDuration(client *c, ustime_t duration);
|
|
void clusterSlotStatsInvalidateSlotIfApplicable(scriptRunCtx *ctx);
|
|
|
|
/* network-bytes-in metric. */
|
|
void clusterSlotStatsAddNetworkBytesInForUserClient(client *c);
|
|
void clusterSlotStatsSetClusterMsgLength(uint32_t len);
|
|
void clusterSlotStatsResetClusterMsgLength(void);
|
|
|
|
/* network-bytes-out metric. */
|
|
void clusterSlotStatsAddNetworkBytesOutForUserClient(client *c);
|
|
void clusterSlotStatsIncrNetworkBytesOutForReplication(long long len);
|
|
void clusterSlotStatsDecrNetworkBytesOutForReplication(long long len);
|
|
void clusterSlotStatsAddNetworkBytesOutForShardedPubSubInternalPropagation(client *c, int slot);
|