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

xianjin pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-uniffle.git


The following commit(s) were added to refs/heads/master by this push:
     new fa364c15 [Improvement] Refactor getPartitionRange to calculate range 
directly (#447)
fa364c15 is described below

commit fa364c15b4954cdf7e2f49e1e6ec876266d30245
Author: a-li <[email protected]>
AuthorDate: Tue Dec 27 23:39:13 2022 -0800

    [Improvement] Refactor getPartitionRange to calculate range directly (#447)
    
    ### What changes were proposed in this pull request?
     1. Refactor ShuffleStorageUtils.getPartitionRange to calculate range 
directly.
     2. The runtime of the function will be O(1) as opposed to O(n) in the 
original implementation.
    
    ### Why are the changes needed?
    fix #443
    The current implementation of ShuffleStorageUtils.getPartitionRange is O(n) 
which is not performant and can be done in O(1) by directly computing it using 
the partitionId.
    
    ### Does this PR introduce _any_ user-facing change?
    No
    
    ### How was this patch tested?
    existing UTs + new UTs
---
 .../uniffle/storage/util/ShuffleStorageUtils.java  | 15 +++----
 .../storage/util/ShuffleStorageUtilsTest.java      | 47 ++++++++++++++++++++++
 2 files changed, 53 insertions(+), 9 deletions(-)

diff --git 
a/storage/src/main/java/org/apache/uniffle/storage/util/ShuffleStorageUtils.java
 
b/storage/src/main/java/org/apache/uniffle/storage/util/ShuffleStorageUtils.java
index 71cca83c..a34daf76 100644
--- 
a/storage/src/main/java/org/apache/uniffle/storage/util/ShuffleStorageUtils.java
+++ 
b/storage/src/main/java/org/apache/uniffle/storage/util/ShuffleStorageUtils.java
@@ -167,15 +167,12 @@ public class ShuffleStorageUtils {
 
   public static int[] getPartitionRange(int partitionId, int 
partitionNumPerRange, int partitionNum) {
     int[] range = null;
-    int prNum = partitionNum % partitionNumPerRange == 0
-        ? partitionNum / partitionNumPerRange : partitionNum / 
partitionNumPerRange + 1;
-    for (int i = 0; i < prNum; i++) {
-      int start = i * partitionNumPerRange;
-      int end = (i + 1) * partitionNumPerRange - 1;
-      if (partitionId >= start && partitionId <= end) {
-        range = new int[]{start, end};
-        break;
-      }
+    int prNum = partitionId / partitionNumPerRange;
+    if (partitionId < 0 || partitionId >= partitionNum) {
+      LOG.warn("Invalid partitionId. partitionId:{} ,partitionNumPerRange: {}, 
partitionNum: {}",
+              partitionId, partitionNumPerRange, partitionNum);
+    } else {
+      range = new int[]{partitionNumPerRange * prNum, partitionNumPerRange * 
(prNum + 1) - 1};
     }
     return range;
   }
diff --git 
a/storage/src/test/java/org/apache/uniffle/storage/util/ShuffleStorageUtilsTest.java
 
b/storage/src/test/java/org/apache/uniffle/storage/util/ShuffleStorageUtilsTest.java
index 0a2a3d0c..da9f0689 100644
--- 
a/storage/src/test/java/org/apache/uniffle/storage/util/ShuffleStorageUtilsTest.java
+++ 
b/storage/src/test/java/org/apache/uniffle/storage/util/ShuffleStorageUtilsTest.java
@@ -251,6 +251,8 @@ public class ShuffleStorageUtilsTest {
     int[] range = ShuffleStorageUtils.getPartitionRange(0, 1, 5);
     assertEquals(0, range[0]);
     assertEquals(0, range[1]);
+    range = ShuffleStorageUtils.getPartitionRange(5, 1, 5);
+    assertEquals(null, range);
     range = ShuffleStorageUtils.getPartitionRange(0, 2, 5);
     assertEquals(0, range[0]);
     assertEquals(1, range[1]);
@@ -266,5 +268,50 @@ public class ShuffleStorageUtilsTest {
     range = ShuffleStorageUtils.getPartitionRange(2, 3, 5);
     assertEquals(0, range[0]);
     assertEquals(2, range[1]);
+    range = ShuffleStorageUtils.getPartitionRange(-1, 3, 5);
+    assertEquals(null, range);
+    range = ShuffleStorageUtils.getPartitionRange(1, 3, 0);
+    assertEquals(null, range);
+    range = ShuffleStorageUtils.getPartitionRange(4, 2, 3);
+    assertEquals(null, range);
+    range = ShuffleStorageUtils.getPartitionRange(4, 2, 5);
+    assertEquals(4, range[0]);
+    assertEquals(5, range[1]);
+    range = ShuffleStorageUtils.getPartitionRange(3, 2, 2);
+    assertEquals(null, range);
+    range = ShuffleStorageUtils.getPartitionRange(0, 2, 2);
+    assertEquals(0, range[0]);
+    assertEquals(1, range[1]);
+    range = ShuffleStorageUtils.getPartitionRange(3, 2, 4);
+    assertEquals(2, range[0]);
+    assertEquals(3, range[1]);
+    range = ShuffleStorageUtils.getPartitionRange(4, 3, 5);
+    assertEquals(3, range[0]);
+    assertEquals(5, range[1]);
+    range = ShuffleStorageUtils.getPartitionRange(5, 3, 5);
+    assertEquals(null, range);
+    range = ShuffleStorageUtils.getPartitionRange(0, 3, 5);
+    assertEquals(0, range[0]);
+    assertEquals(2, range[1]);
+    range = ShuffleStorageUtils.getPartitionRange(9, 3, 11);
+    assertEquals(9, range[0]);
+    assertEquals(11, range[1]);
+    range = ShuffleStorageUtils.getPartitionRange(9, 3, 12);
+    assertEquals(9, range[0]);
+    assertEquals(11, range[1]);
+    range = ShuffleStorageUtils.getPartitionRange(0, 7, 12);
+    assertEquals(0, range[0]);
+    assertEquals(6, range[1]);
+    range = ShuffleStorageUtils.getPartitionRange(3, 7, 12);
+    assertEquals(0, range[0]);
+    assertEquals(6, range[1]);
+    range = ShuffleStorageUtils.getPartitionRange(7, 7, 12);
+    assertEquals(7, range[0]);
+    assertEquals(13, range[1]);
+    range = ShuffleStorageUtils.getPartitionRange(8, 7, 12);
+    assertEquals(7, range[0]);
+    assertEquals(13, range[1]);
+    range = ShuffleStorageUtils.getPartitionRange(12, 7, 12);
+    assertEquals(null, range);
   }
 }

Reply via email to