This is an automated email from the ASF dual-hosted git repository.

lhotari pushed a commit to branch branch-4.0
in repository https://gitbox.apache.org/repos/asf/pulsar.git

commit fa8bbf4d53a42d4bed378110f8ca22bf1356bf79
Author: Lucas Eby <[email protected]>
AuthorDate: Tue Nov 11 09:31:38 2025 -0600

    [fix][test] Add Delta Tolerance in Double-Precision Assertions to Fix 
Rounding Flakiness (#24972)
    
    (cherry picked from commit bd9d81ddd71e91faa4fd4661798920437d8b164c)
---
 .../extensions/scheduler/TransferShedderTest.java  | 133 +++++++++++----------
 1 file changed, 67 insertions(+), 66 deletions(-)

diff --git 
a/pulsar-broker/src/test/java/org/apache/pulsar/broker/loadbalance/extensions/scheduler/TransferShedderTest.java
 
b/pulsar-broker/src/test/java/org/apache/pulsar/broker/loadbalance/extensions/scheduler/TransferShedderTest.java
index e997eb36bab..716e1f2a2a2 100644
--- 
a/pulsar-broker/src/test/java/org/apache/pulsar/broker/loadbalance/extensions/scheduler/TransferShedderTest.java
+++ 
b/pulsar-broker/src/test/java/org/apache/pulsar/broker/loadbalance/extensions/scheduler/TransferShedderTest.java
@@ -110,6 +110,7 @@ import org.testng.annotations.Test;
 public class TransferShedderTest {
     double setupLoadAvg = 0.36400000000000005;
     double setupLoadStd = 0.3982762860126121;
+    double delta = 1e-5;
 
     PulsarService pulsar;
     NamespaceService namespaceService;
@@ -522,8 +523,8 @@ public class TransferShedderTest {
         var res = transferShedder.findBundlesForUnloading(ctx, Map.of(), 
Map.of());
         assertTrue(res.isEmpty());
         
assertEquals(counter.getBreakdownCounters().get(Skip).get(NoBundles).get(), 1);
-        assertEquals(counter.getLoadAvg(), setupLoadAvg);
-        assertEquals(counter.getLoadStd(), setupLoadStd);
+        assertEquals(counter.getLoadAvg(), setupLoadAvg, delta);
+        assertEquals(counter.getLoadStd(), setupLoadStd, delta);
     }
 
     @Test
@@ -543,8 +544,8 @@ public class TransferShedderTest {
         var res = transferShedder.findBundlesForUnloading(ctx, Map.of(), 
Map.of());
         assertTrue(res.isEmpty());
         
assertEquals(counter.getBreakdownCounters().get(Skip).get(NoLoadData).get(), 1);
-        assertEquals(counter.getLoadAvg(), setupLoadAvg);
-        assertEquals(counter.getLoadStd(), setupLoadStd);
+        assertEquals(counter.getLoadAvg(), setupLoadAvg, delta);
+        assertEquals(counter.getLoadStd(), setupLoadStd, delta);
     }
 
     @Test
@@ -587,8 +588,8 @@ public class TransferShedderTest {
         expected.add(new UnloadDecision(new Unload("broker4:8080", bundleD1, 
Optional.of("broker2:8080")),
                 Success, Overloaded));
         assertEquals(res, expected);
-        assertEquals(counter.getLoadAvg(), setupLoadAvg);
-        assertEquals(counter.getLoadStd(), setupLoadStd);
+        assertEquals(counter.getLoadAvg(), setupLoadAvg, delta);
+        assertEquals(counter.getLoadStd(), setupLoadStd, delta);
 
         var now = System.currentTimeMillis();
         recentlyUnloadedBrokers.put("broker1:8080", now);
@@ -616,8 +617,8 @@ public class TransferShedderTest {
                 Optional.of("broker1:8080")),
                 Success, Overloaded));
         assertEquals(res, expected);
-        assertEquals(counter.getLoadAvg(), setupLoadAvg);
-        assertEquals(counter.getLoadStd(), setupLoadStd);
+        assertEquals(counter.getLoadAvg(), setupLoadAvg, delta);
+        assertEquals(counter.getLoadStd(), setupLoadStd, delta);
     }
 
     @Test
@@ -655,8 +656,8 @@ public class TransferShedderTest {
         expected.add(new UnloadDecision(new Unload("broker4:8080", bundleD1, 
Optional.of("broker1:8080")),
                 Success, Overloaded));
         assertEquals(res, expected);
-        assertEquals(counter.getLoadAvg(), setupLoadAvg);
-        assertEquals(counter.getLoadStd(), setupLoadStd);
+        assertEquals(counter.getLoadAvg(), setupLoadAvg, delta);
+        assertEquals(counter.getLoadStd(), setupLoadStd, delta);
 
         // Test unload a has isolation policies broker.
         ctx.brokerConfiguration().setLoadBalancerTransferEnabled(false);
@@ -666,8 +667,8 @@ public class TransferShedderTest {
         expected.add(new UnloadDecision(new Unload("broker4:8080", bundleD1, 
Optional.empty()),
                 Success, Overloaded));
         assertEquals(res, expected);
-        assertEquals(counter.getLoadAvg(), setupLoadAvg);
-        assertEquals(counter.getLoadStd(), setupLoadStd);
+        assertEquals(counter.getLoadAvg(), setupLoadAvg, delta);
+        assertEquals(counter.getLoadStd(), setupLoadStd, delta);
 
 
         // test setLoadBalancerSheddingBundlesWithPoliciesEnabled=false;
@@ -678,16 +679,16 @@ public class TransferShedderTest {
         res = transferShedder.findBundlesForUnloading(ctx, Map.of(), Map.of());
         assertTrue(res.isEmpty());
         
assertEquals(counter.getBreakdownCounters().get(Skip).get(NoBundles).get(), 1);
-        assertEquals(counter.getLoadAvg(), setupLoadAvg);
-        assertEquals(counter.getLoadStd(), setupLoadStd);
+        assertEquals(counter.getLoadAvg(), setupLoadAvg, delta);
+        assertEquals(counter.getLoadStd(), setupLoadStd, delta);
 
         // Test unload a has isolation policies broker.
         ctx.brokerConfiguration().setLoadBalancerTransferEnabled(false);
         res = transferShedder.findBundlesForUnloading(ctx, Map.of(), Map.of());
         assertTrue(res.isEmpty());
         
assertEquals(counter.getBreakdownCounters().get(Skip).get(NoBundles).get(), 2);
-        assertEquals(counter.getLoadAvg(), setupLoadAvg);
-        assertEquals(counter.getLoadStd(), setupLoadStd);
+        assertEquals(counter.getLoadAvg(), setupLoadAvg, delta);
+        assertEquals(counter.getLoadStd(), setupLoadStd, delta);
     }
 
     public BrokerLookupData getLookupData() {
@@ -769,8 +770,8 @@ public class TransferShedderTest {
 
         assertTrue(res.isEmpty());
         
assertEquals(counter.getBreakdownCounters().get(Skip).get(NoBundles).get(), 1);
-        assertEquals(counter.getLoadAvg(), setupLoadAvg);
-        assertEquals(counter.getLoadStd(), setupLoadStd);
+        assertEquals(counter.getLoadAvg(), setupLoadAvg, delta);
+        assertEquals(counter.getLoadStd(), setupLoadStd, delta);
 
         doAnswer(invocationOnMock -> {
             Map<String, BrokerLookupData> brokers = 
invocationOnMock.getArgument(0);
@@ -787,8 +788,8 @@ public class TransferShedderTest {
         expected2.add(new UnloadDecision(new Unload("broker5:8080", bundleE1, 
Optional.of("broker1:8080")),
                 Success, Overloaded));
         assertEquals(res2, expected2);
-        assertEquals(counter.getLoadAvg(), setupLoadAvg);
-        assertEquals(counter.getLoadStd(), setupLoadStd);
+        assertEquals(counter.getLoadAvg(), setupLoadAvg, delta);
+        assertEquals(counter.getLoadStd(), setupLoadStd, delta);
     }
 
     @Test
@@ -818,8 +819,8 @@ public class TransferShedderTest {
 
         assertTrue(res.isEmpty());
         
assertEquals(counter.getBreakdownCounters().get(Skip).get(NoBundles).get(), 1);
-        assertEquals(counter.getLoadAvg(), setupLoadAvg);
-        assertEquals(counter.getLoadStd(), setupLoadStd);
+        assertEquals(counter.getLoadAvg(), setupLoadAvg, delta);
+        assertEquals(counter.getLoadStd(), setupLoadStd, delta);
     }
 
     @Test
@@ -881,8 +882,8 @@ public class TransferShedderTest {
 
         assertTrue(res.isEmpty());
         
assertEquals(counter.getBreakdownCounters().get(Skip).get(HitCount).get(), 1);
-        assertEquals(counter.getLoadAvg(), 0.2000000063578288);
-        assertEquals(counter.getLoadStd(), 0.08164966587949089);
+        assertEquals(counter.getLoadAvg(), 0.2000000063578288, delta);
+        assertEquals(counter.getLoadStd(), 0.08164966587949089, delta);
     }
 
     @Test
@@ -900,8 +901,8 @@ public class TransferShedderTest {
 
         assertTrue(res.isEmpty());
         
assertEquals(counter.getBreakdownCounters().get(Skip).get(NoBundles).get(), 1);
-        assertEquals(counter.getLoadAvg(), setupLoadAvg);
-        assertEquals(counter.getLoadStd(), setupLoadStd);
+        assertEquals(counter.getLoadAvg(), setupLoadAvg, delta);
+        assertEquals(counter.getLoadStd(), setupLoadStd, delta);
     }
 
     @Test
@@ -922,8 +923,8 @@ public class TransferShedderTest {
                 Optional.of("broker1:8080")),
                 Success, Overloaded));
         assertEquals(res, expected);
-        assertEquals(counter.getLoadAvg(), setupLoadAvg);
-        assertEquals(counter.getLoadStd(), setupLoadStd);
+        assertEquals(counter.getLoadAvg(), setupLoadAvg, delta);
+        assertEquals(counter.getLoadStd(), setupLoadStd, delta);
     }
 
     @Test
@@ -942,8 +943,8 @@ public class TransferShedderTest {
         var res = transferShedder.findBundlesForUnloading(ctx, Map.of(), 
Map.of());
         assertTrue(res.isEmpty());
         
assertEquals(counter.getBreakdownCounters().get(Skip).get(NoBundles).get(), 1);
-        assertEquals(counter.getLoadAvg(), setupLoadAvg);
-        assertEquals(counter.getLoadStd(), setupLoadStd);
+        assertEquals(counter.getLoadAvg(), setupLoadAvg, delta);
+        assertEquals(counter.getLoadStd(), setupLoadStd, delta);
     }
 
 
@@ -961,8 +962,8 @@ public class TransferShedderTest {
         expected.add(new UnloadDecision(new Unload("broker5:8080", bundleE1, 
Optional.of("broker1:8080")),
                 Success, Overloaded));
         assertEquals(res, expected);
-        assertEquals(counter.getLoadAvg(), 0.26400000000000007);
-        assertEquals(counter.getLoadStd(), 0.27644891028904417);
+        assertEquals(counter.getLoadAvg(), 0.26400000000000007, delta);
+        assertEquals(counter.getLoadStd(), 0.27644891028904417, delta);
     }
 
     @Test
@@ -1013,12 +1014,12 @@ public class TransferShedderTest {
         expected.add(new UnloadDecision(
                 new Unload("broker1:8080", 
"my-tenant/my-namespaceA/0x3FFFFFFF_0x4FFFFFFF",
                         Optional.of("broker2:8080")), Success, Overloaded));
-        assertEquals(counter.getLoadAvg(), 5.05);
-        assertEquals(counter.getLoadStd(), 4.95);
+        assertEquals(counter.getLoadAvg(), 5.05, delta);
+        assertEquals(counter.getLoadStd(), 4.95, delta);
         assertEquals(res, expected);
         var stats = (TransferShedder.LoadStats)
                 FieldUtils.readDeclaredField(transferShedder, "stats", true);
-        assertEquals(stats.std(), 0.050000004900021836);
+        assertEquals(stats.std(), 0.050000004900021836, delta);
     }
 
     @Test
@@ -1084,12 +1085,12 @@ public class TransferShedderTest {
                 new Unload("broker2:8080", 
"my-tenant/my-namespaceB/0x00000000_0x0FFFFFFF",
                         Optional.of("broker1:8080")),
                 Success, Overloaded));
-        assertEquals(counter.getLoadAvg(), 5.05);
-        assertEquals(counter.getLoadStd(), 4.95);
+        assertEquals(counter.getLoadAvg(), 5.05, delta);
+        assertEquals(counter.getLoadStd(), 4.95, delta);
         assertEquals(res, expected);
         var stats = (TransferShedder.LoadStats)
                 FieldUtils.readDeclaredField(transferShedder, "stats", true);
-        assertEquals(stats.std(), 0.050000004900021836);
+        assertEquals(stats.std(), 0.050000004900021836, delta);
 
     }
 
@@ -1123,19 +1124,19 @@ public class TransferShedderTest {
         expected.add(new UnloadDecision(
                 new Unload("broker1:8080",
                         res.stream().filter(x -> 
x.getUnload().sourceBroker().equals("broker1:8080")).findFirst().get()
-                        .getUnload().serviceUnit(), 
Optional.of("broker2:8080")),
+                                .getUnload().serviceUnit(), 
Optional.of("broker2:8080")),
                 Success, Overloaded));
         expected.add(new UnloadDecision(
                 new Unload("broker2:8080",
                         res.stream().filter(x -> 
x.getUnload().sourceBroker().equals("broker2:8080")).findFirst().get()
                                 .getUnload().serviceUnit(), 
Optional.of("broker1:8080")),
                 Success, Overloaded));
-        assertEquals(counter.getLoadAvg(), 0.74);
-        assertEquals(counter.getLoadStd(), 0.26);
+        assertEquals(counter.getLoadAvg(), 0.74, delta);
+        assertEquals(counter.getLoadStd(), 0.26, delta);
         assertEquals(res, expected);
         var stats = (TransferShedder.LoadStats)
                 FieldUtils.readDeclaredField(transferShedder, "stats", true);
-        assertEquals(stats.std(), 2.5809568279517847E-8);
+        assertEquals(stats.std(), 2.5809568279517847E-8, delta);
     }
 
     @Test
@@ -1161,8 +1162,8 @@ public class TransferShedderTest {
         expected.add(new UnloadDecision(new Unload("broker4:8080", bundleD1, 
Optional.of("broker2:8080")),
                 Success, Underloaded));
         assertEquals(res, expected);
-        assertEquals(counter.getLoadAvg(), 0.26400000000000007);
-        assertEquals(counter.getLoadStd(), 0.27644891028904417);
+        assertEquals(counter.getLoadAvg(), 0.26400000000000007, delta);
+        assertEquals(counter.getLoadStd(), 0.27644891028904417, delta);
     }
 
     @Test
@@ -1185,8 +1186,8 @@ public class TransferShedderTest {
         expected.add(new UnloadDecision(new Unload("broker4:8080", bundleD1, 
Optional.of("broker2:8080")),
                 Success, Underloaded));
         assertEquals(res, expected);
-        assertEquals(counter.getLoadAvg(), 0.262);
-        assertEquals(counter.getLoadStd(), 0.2780935094532054);
+        assertEquals(counter.getLoadAvg(), 0.262, delta);
+        assertEquals(counter.getLoadStd(), 0.2780935094532054, delta);
     }
 
     @Test
@@ -1203,8 +1204,8 @@ public class TransferShedderTest {
         expected.add(new UnloadDecision(new Unload("broker4:8080", bundleD1, 
Optional.of("broker2:8080")),
                 Success, Overloaded));
         assertEquals(res, expected);
-        assertEquals(counter.getLoadAvg(), setupLoadAvg);
-        assertEquals(counter.getLoadStd(), setupLoadStd);
+        assertEquals(counter.getLoadAvg(), setupLoadAvg, delta);
+        assertEquals(counter.getLoadStd(), setupLoadStd, delta);
     }
 
     @Test
@@ -1219,8 +1220,8 @@ public class TransferShedderTest {
             var res = transferShedder.findBundlesForUnloading(ctx, Map.of(), 
Map.of());
             assertTrue(res.isEmpty());
             
assertEquals(counter.getBreakdownCounters().get(Skip).get(HitCount).get(), i + 
1);
-            assertEquals(counter.getLoadAvg(), setupLoadAvg);
-            assertEquals(counter.getLoadStd(), setupLoadStd);
+            assertEquals(counter.getLoadAvg(), setupLoadAvg, delta);
+            assertEquals(counter.getLoadStd(), setupLoadStd, delta);
         }
         var res = transferShedder.findBundlesForUnloading(ctx, Map.of(), 
Map.of());
         var expected = new HashSet<UnloadDecision>();
@@ -1229,8 +1230,8 @@ public class TransferShedderTest {
         expected.add(new UnloadDecision(new Unload("broker4:8080", bundleD1, 
Optional.of("broker2:8080")),
                 Success, Overloaded));
         assertEquals(res, expected);
-        assertEquals(counter.getLoadAvg(), setupLoadAvg);
-        assertEquals(counter.getLoadStd(), setupLoadStd);
+        assertEquals(counter.getLoadAvg(), setupLoadAvg, delta);
+        assertEquals(counter.getLoadStd(), setupLoadStd, delta);
     }
 
     @Test
@@ -1249,8 +1250,8 @@ public class TransferShedderTest {
         expected.add(new UnloadDecision(new Unload("broker4:8080", bundleD1, 
Optional.of("broker2:8080")),
                 Success, Overloaded));
         assertEquals(res, expected);
-        assertEquals(counter.getLoadAvg(), setupLoadAvg);
-        assertEquals(counter.getLoadStd(), setupLoadStd);
+        assertEquals(counter.getLoadAvg(), setupLoadAvg, delta);
+        assertEquals(counter.getLoadStd(), setupLoadStd, delta);
     }
 
     @Test
@@ -1270,14 +1271,14 @@ public class TransferShedderTest {
         expected.add(new UnloadDecision(new Unload("broker4:8080", bundleD1, 
Optional.of("broker2:8080")),
                 Success, Overloaded));
         assertEquals(res, expected);
-        assertEquals(counter.getLoadAvg(), 2.4240000000000004);
-        assertEquals(counter.getLoadStd(), 3.8633332758124816);
+        assertEquals(counter.getLoadAvg(), 2.4240000000000004, delta);
+        assertEquals(counter.getLoadStd(), 3.8633332758124816, delta);
 
 
         var stats = (TransferShedder.LoadStats)
                 FieldUtils.readDeclaredField(transferShedder, "stats", true);
-        assertEquals(stats.avg(), 2.4240000000000004);
-        assertEquals(stats.std(), 2.781643776903451);
+        assertEquals(stats.avg(), 2.4240000000000004, delta);
+        assertEquals(stats.std(), 2.781643776903451, delta);
     }
 
     @Test
@@ -1309,8 +1310,8 @@ public class TransferShedderTest {
                         new Unload("broker99:8080", 
"my-tenant/my-namespace99/0x00000000_0x0FFFFFFF",
                                 Optional.of("broker83:8080")), Success, 
Underloaded))
         );
-        assertEquals(counter.getLoadAvg(), 0.019900000000000008, 0.00001);
-        assertEquals(counter.getLoadStd(), 0.09850375627355534, 0.00001);
+        assertEquals(counter.getLoadAvg(), 0.019900000000000008, delta);
+        assertEquals(counter.getLoadStd(), 0.09850375627355534, delta);
     }
 
     @Test
@@ -1324,8 +1325,8 @@ public class TransferShedderTest {
                 new Unload("broker98:8080", 
"my-tenant/my-namespace98/0x00000000_0x0FFFFFFF",
                         Optional.of("broker99:8080")), Success, Underloaded));
         assertEquals(res, expected);
-        assertEquals(counter.getLoadAvg(), 0.9704000000000005, 0.00001);
-        assertEquals(counter.getLoadStd(), 0.09652895938523735, 0.00001);
+        assertEquals(counter.getLoadAvg(), 0.9704000000000005, delta);
+        assertEquals(counter.getLoadStd(), 0.09652895938523735, delta);
     }
 
     @Test
@@ -1387,8 +1388,8 @@ public class TransferShedderTest {
         }
         stats.update(loadStore, availableBrokers, Map.of(), conf);
 
-        assertEquals(stats.avg(), 0.9417647058823528);
-        assertEquals(stats.std(), 0.23294117647058868);
+        assertEquals(stats.avg(), 0.9417647058823528, delta);
+        assertEquals(stats.std(), 0.23294117647058868, delta);
     }
 
     @Test
@@ -1405,7 +1406,7 @@ public class TransferShedderTest {
             loadStore.pushAsync("broker" + i + ":8080", getCpuLoad(ctx,  
loads[i], "broker" + i + ":8080"));
         }
         stats.update(loadStore, availableBrokers, Map.of(), conf);
-        assertEquals(stats.avg(), 3.9449999999999994);
-        assertEquals(stats.std(), 0.028722813232795824);
+        assertEquals(stats.avg(), 3.9449999999999994, delta);
+        assertEquals(stats.std(), 0.028722813232795824, delta);
     }
 }

Reply via email to