summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorroot <[email protected]>2023-12-04 10:13:02 +0000
committerroot <[email protected]>2023-12-04 10:13:02 +0000
commit4d2ddeeec873c25ea771290122f45a4b0e985dd3 (patch)
treea4e5ee9d72ca4a731ae0831d7ff18a511750e351
parentdd61d8ceb6ef027aa9082247252bc27fe1393880 (diff)
fix judge interval for last failed get token time
-rw-r--r--shaping/src/shaper.cpp25
1 files changed, 24 insertions, 1 deletions
diff --git a/shaping/src/shaper.cpp b/shaping/src/shaper.cpp
index 43108c5..170a235 100644
--- a/shaping/src/shaper.cpp
+++ b/shaping/src/shaper.cpp
@@ -650,6 +650,28 @@ static void shaper_profile_hash_node_update(struct shaping_profile_info *profile
return;
}
+static int shaping_swarmkv_is_too_short_interval(long long curr_time_ms, struct shaping_profile_info *profile)
+{
+ long long last_failed_ms;
+
+ switch (profile->type) {
+ case PROFILE_TYPE_GENERIC:
+ last_failed_ms = profile->hash_node->last_failed_get_token_ms;
+ break;
+ case PROFILE_TYPE_HOST_FARINESS:
+ case PROFILE_TYPE_MAX_MIN_HOST_FAIRNESS:
+ case PROFILE_TYPE_SPLIT_BY_LOCAL_HOST:
+ last_failed_ms = profile->last_failed_get_token_ms;
+ break;
+ }
+
+ if (curr_time_ms - last_failed_ms < TOKEN_GET_FAILED_INTERVAL_MS) {//if failed to get token in last 1ms, it't too short interval; for swarmkv can't reproduce token in 1ms
+ return 1;
+ } else {
+ return 0;
+ }
+}
+
static int shaper_token_consume(struct shaping_thread_ctx *ctx, struct shaping_flow *sf, int req_token_bytes,
struct shaping_profile_info *profile, int profile_type, unsigned char direction)
{
@@ -680,7 +702,8 @@ static int shaper_token_consume(struct shaping_thread_ctx *ctx, struct shaping_f
struct timespec curr_timespec;
clock_gettime(CLOCK_MONOTONIC, &curr_timespec);
long long curr_time_ms = curr_timespec.tv_sec * MILLI_SECONDS_PER_SEC + curr_timespec.tv_nsec / NANO_SECONDS_PER_MILLI_SEC;
- if (curr_time_ms - profile->hash_node->last_failed_get_token_ms < TOKEN_GET_FAILED_INTERVAL_MS) {//if failed to get token in last 1ms, return failed; for swarmkv can't reproduce token in 1ms
+
+ if (shaping_swarmkv_is_too_short_interval(curr_time_ms, profile)) {
return SHAPER_TOKEN_GET_FAILED;
}