]> git.ipfire.org Git - thirdparty/openldap.git/commitdiff
ITS#9599 Online latency tracking
authorOndřej Kuzník <okuznik@symas.com>
Wed, 10 Mar 2021 16:22:34 +0000 (16:22 +0000)
committerOndřej Kuzník <okuznik@symas.com>
Fri, 13 Aug 2021 09:57:14 +0000 (10:57 +0100)
servers/lloadd/tier_bestof.c

index 393258053ea079a32e604dbb76ab9ce443d39ab1..a598d5f832cca023d4ae16dfe12d4d67831c2305 100644 (file)
@@ -57,8 +57,27 @@ bestof_cmp( const void *left, const void *right )
 {
     const LloadBackend *l = left;
     const LloadBackend *r = right;
+    struct timeval now;
+    uintptr_t count, diff;
+    float a = l->b_fitness, b = r->b_fitness, factor = 1;
+
+    gettimeofday( &now, NULL );
+    /* We assume this is less than a second after the last update */
+    factor = 1 / ( pow( ( 1 / factor ) + 1, now.tv_usec / 1000000.0 ) - 1 );
+
+    count = __atomic_load_n( &l->b_operation_count, __ATOMIC_RELAXED );
+    diff = __atomic_load_n( &l->b_operation_time, __ATOMIC_RELAXED );
+    if ( count ) {
+        a = ( a * factor + (float)diff * l->b_weight / count ) / ( factor + 1 );
+    }
+
+    count = __atomic_load_n( &r->b_operation_count, __ATOMIC_RELAXED );
+    diff = __atomic_load_n( &r->b_operation_time, __ATOMIC_RELAXED );
+    if ( count ) {
+        b = ( b * factor + (float)diff * r->b_weight / count ) / ( factor + 1 );
+    }
 
-    return l->b_fitness - r->b_fitness;
+    return (a - b < 0) ? -1 : (a - b == 0) ? 0 : 1;
 }
 
 LloadTier *