Github user Ngone51 commented on a diff in the pull request:
https://github.com/apache/spark/pull/19222#discussion_r172037418
--- Diff:
common/unsafe/src/main/java/org/apache/spark/unsafe/memory/OnHeapMemoryBlock.java
---
@@ -0,0 +1,142 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.spark.unsafe.memory;
+
+import org.apache.spark.unsafe.Platform;
+
+/**
+ * A consecutive block of memory with a long array on Java heap.
+ */
+public final class OnHeapMemoryBlock extends MemoryBlock {
+
+ private final long[] array;
+
+ public OnHeapMemoryBlock(long[] obj, long offset, long size) {
+ super(obj, offset, size);
+ this.array = obj;
+ assert(offset - Platform.LONG_ARRAY_OFFSET + size <= obj.length * 8L) :
--- End diff --
Hi, @kiszk. I still doubt about this ```assert```'s correctness. Below is
my understanding, please feel free to point my wrong spot out.
This method ```public OnHeapMemoryBlock(long[] obj, long offset, long
size)``` could be called from three paths:
1. called from ```public OnHeapMemoryBlock(long size)```
In this case, this ```assert``` certainly to be true, and ```offset``` is
equal to ```Platform.LONG_ARRAY_OFFSET```.
2. called directly from other methods
In this case, I think the caller will mostly set ```offset``` to be
```Platform.LONG_ARRAY_OFFSET```. And the ```assert``` is also right, but the
result due to caller's settings.
3. called from ``` public MemoryBlock subBlock(long offset, long size)```
In this case, a sub block can only use the memory which a super block could
use, which is super block's ```size```, rather than ```obj.length * 8L``` (as
we reach agreement before).
So, I think, here, the ```assert``` should be ```(offset -
Platform.LONG_ARRAY_OFFSET + sub block's size <= super block's size)```. More
precisely, we should ```assert(offset >= Platform.LONG_ARRAY_OFFSET)```.
---
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]