Skip to content

Commit 89fb019

Browse files
committed
Fixes after review.
1 parent e8cdc78 commit 89fb019

2 files changed

Lines changed: 33 additions & 27 deletions

File tree

src/main/java/org/apache/datasketches/common/MemorySegmentStatus.java

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -82,10 +82,7 @@ static boolean isSameResource(final MemorySegment seg1, final MemorySegment seg2
8282
return (seg1.address() == seg2.address()) && (seg1.byteSize() == seg2.byteSize());
8383
}
8484
//both on heap
85-
if (seg1.isReadOnly() || seg2.isReadOnly()) {
86-
throw new IllegalArgumentException("Cannot determine 'isSameBackingMemory(..)' on heap if either MemorySegment is Read-only.");
87-
}
88-
return (seg1.heapBase().orElse(null) == seg2.heapBase().orElse(null));
85+
return seg1 == seg2;
8986
}
9087

9188
}

src/test/java/org/apache/datasketches/theta/UnionImplTest.java

Lines changed: 32 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,8 @@ public void checkGetCurrentAndMaxBytes() {
6060
@Test
6161
public void checkUpdateWithSketch() {
6262
final int k = 16;
63-
final MemorySegment seg = MemorySegment.ofArray(new byte[k*8 + 24]);
64-
final MemorySegment seg2 = MemorySegment.ofArray(new byte[k*8 + 24]);
63+
final MemorySegment seg = MemorySegment.ofArray(new byte[(k*8) + 24]);
64+
final MemorySegment seg2 = MemorySegment.ofArray(new byte[(k*8) + 24]);
6565
final UpdateSketch sketch = Sketches.updateSketchBuilder().setNominalEntries(k).build();
6666
for (int i=0; i<k; i++) { sketch.update(i); }
6767
final CompactSketch sketchInDirectOrd = sketch.compact(true, seg);
@@ -78,7 +78,7 @@ public void checkUpdateWithSketch() {
7878
@Test
7979
public void checkUnorderedAndOrderedMemorySegment() {
8080
final int k = 16;
81-
final MemorySegment seg = MemorySegment.ofArray(new byte[k*8 + 24]);
81+
final MemorySegment seg = MemorySegment.ofArray(new byte[(k*8) + 24]);
8282
final UpdateSketch sketch = Sketches.updateSketchBuilder().setNominalEntries(k).build();
8383
for (int i = 0; i < k; i++) { sketch.update(i); }
8484
final CompactSketch sketchInDirectOrd = sketch.compact(false, seg);
@@ -97,9 +97,9 @@ public void checkUnorderedAndOrderedMemorySegment() {
9797
@Test
9898
public void checkUpdateWithSeg() {
9999
final int k = 16;
100-
final MemorySegment skSeg = MemorySegment.ofArray(new byte[2*k*8 + 24]);
101-
final MemorySegment dirOrdCskSeg = MemorySegment.ofArray(new byte[k*8 + 24]);
102-
final MemorySegment dirUnordCskSeg = MemorySegment.ofArray(new byte[k*8 + 24]);
100+
final MemorySegment skSeg = MemorySegment.ofArray(new byte[(2*k*8) + 24]);
101+
final MemorySegment dirOrdCskSeg = MemorySegment.ofArray(new byte[(k*8) + 24]);
102+
final MemorySegment dirUnordCskSeg = MemorySegment.ofArray(new byte[(k*8) + 24]);
103103
final UpdateSketch udSketch = UpdateSketch.builder().setNominalEntries(k).build(skSeg);
104104
for (int i = 0; i < k; i++) { udSketch.update(i); } //exact
105105
udSketch.compact(true, dirOrdCskSeg);
@@ -114,15 +114,15 @@ public void checkUpdateWithSeg() {
114114

115115
@Test
116116
public void checkUpdateWithSegV4Exact() {
117-
int n = 1000;
118-
UpdateSketch sk = Sketches.updateSketchBuilder().build();
117+
final int n = 1000;
118+
final UpdateSketch sk = Sketches.updateSketchBuilder().build();
119119
for (int i = 0; i < n; i++) {
120120
sk.update(i);
121121
}
122-
CompactSketch cs = sk.compact();
122+
final CompactSketch cs = sk.compact();
123123
assertFalse(cs.isEstimationMode());
124124

125-
byte[] bytes = cs.toByteArrayCompressed();
125+
final byte[] bytes = cs.toByteArrayCompressed();
126126

127127
final Union union = Sketches.setOperationBuilder().buildUnion();
128128
union.union(MemorySegment.ofArray(bytes));
@@ -148,7 +148,7 @@ public void checkFastWrap() {
148148
@Test(expectedExceptions = SketchesArgumentException.class)
149149
public void checkCorruptFamilyException() {
150150
final int k = 16;
151-
final MemorySegment seg = MemorySegment.ofArray(new byte[k*8 + 24]);
151+
final MemorySegment seg = MemorySegment.ofArray(new byte[(k*8) + 24]);
152152
final UpdateSketch sketch = Sketches.updateSketchBuilder().setNominalEntries(k).build();
153153
for (int i=0; i<k; i++) {
154154
sketch.update(i);
@@ -209,27 +209,36 @@ public void checkMoveAndResizeOffHeap() {
209209
final int bytes = Sketches.getMaxUpdateSketchBytes(k);
210210
MemorySegment skWseg, uWseg;
211211
try (Arena arena = Arena.ofConfined()) {
212-
skWseg = arena.allocate(bytes / 2);
212+
skWseg = arena.allocate(bytes / 2); //we never populate the sketch so this size is not relevant
213213
final UpdateSketch sketch = Sketches.updateSketchBuilder().setNominalEntries(k).build(skWseg);
214-
assertTrue(sketch.isSameResource(skWseg)); //of course
214+
//The sketch has not changed, so the sketch's internal segment is what we gave it.
215+
assertTrue(sketch.isSameResource(skWseg));
215216

216-
uWseg = arena.allocate(bytes / 2); //independent of sketch, way too small, forces overflow
217+
//We now do the same with an independent Union
218+
uWseg = arena.allocate(bytes / 2); // way too small, this will forces overflow
217219
final Union union = SetOperation.builder().buildUnion(uWseg); //off-heap union
218-
assertTrue(union.isSameResource(uWseg)); //of course
220+
assertTrue(union.isSameResource(uWseg)); //Union has not changed
219221

220222
for (int i = 0; i < u; i++) { union.update(i); } //populate first union
221-
assertFalse(union.isSameResource(skWseg)); //of course
222-
assertFalse(union.isSameResource(uWseg)); //moved
223+
assertFalse(union.isSameResource(skWseg)); //Sketch and Union segments are totally distinct
224+
//Here the union's segment overflowed and moved to the heap,
225+
// thus, its reference to its segment is not the one we gave it!
226+
assertFalse(union.isSameResource(uWseg)); //moved.
223227

228+
//Here we create a 2nd Union with a heap segment
224229
final MemorySegment uWsegHeap = MemorySegment.ofArray(new byte[bytes / 2]);
225230
final Union union2 = SetOperation.builder().buildUnion(); //on-heap union
231+
//As before, this establishes that the empty union2 has the same segment that we gave it.
232+
assertTrue(union2.isSameResource(uWsegHeap)); //But Copilot complained, so here it is!
233+
234+
//These two asserts are calling the Interface static method directly and establish
235+
// what should be obvious, that these are all different segments.
226236
assertFalse(MemorySegmentStatus.isSameResource(uWseg, uWsegHeap)); //obviously not
227237
assertFalse(MemorySegmentStatus.isSameResource(uWsegHeap, union.getMemorySegment())); //tgt moved
228-
}
238+
} //the off-heap segments will be closed here
229239
assertFalse(skWseg.scope().isAlive()); //closed as part of the same Arena
230240
assertFalse(uWseg.scope().isAlive()); //closed as part of the same Arena
231-
232-
241+
//we don't need to close the heap segment.
233242
}
234243

235244
@Test
@@ -252,7 +261,7 @@ public void checkUnionCompactOrderedSource() {
252261

253262
final int bytes = Sketches.getCompactSketchMaxBytes(lgK);
254263
try (Arena arena = Arena.ofConfined()) {
255-
MemorySegment wseg = arena.allocate(bytes);
264+
final MemorySegment wseg = arena.allocate(bytes);
256265

257266
final CompactSketch csk = sk.compact(true, wseg); //ordered, direct
258267
final Union union = Sketches.setOperationBuilder().buildUnion();
@@ -286,9 +295,9 @@ public void checkDirectUnionSingleItem() {
286295
for (int i = 0; i < num; i++) {
287296
skArr[i] = new UpdateSketchBuilder().build();
288297
}
289-
for (int i = 0; i < num/2; i++) {
298+
for (int i = 0; i < (num/2); i++) {
290299
skArr[i].update(i);
291-
skArr[i + num/2].update(i);
300+
skArr[i + (num/2)].update(i);
292301
skArr[i].update(i + num);
293302
}
294303

0 commit comments

Comments
 (0)