SammyVimes commented on a change in pull request #559:
URL: https://github.com/apache/ignite-3/pull/559#discussion_r786542377



##########
File path: 
modules/network/src/main/java/org/apache/ignite/internal/network/serialization/ClassDescriptor.java
##########
@@ -59,6 +65,20 @@
      */
     private final boolean isFinal;
 
+    /** Total number of bytes needed to store all primitive fields. */
+    private final int primitiveFieldsDataSize;
+    /** Total number of object (i.e. non-primitive) fields. */

Review comment:
       ```suggestion
       /** Total number of object's non-primitive fields. */
   ```

##########
File path: 
modules/network/src/main/java/org/apache/ignite/internal/network/serialization/ClassDescriptor.java
##########
@@ -59,6 +65,20 @@
      */
     private final boolean isFinal;
 
+    /** Total number of bytes needed to store all primitive fields. */
+    private final int primitiveFieldsDataSize;
+    /** Total number of object (i.e. non-primitive) fields. */
+    private final int objectFieldsCount;
+
+    private Map<String, FieldDescriptor> fieldsByName;
+    /**
+     * Offsets into primitive fields data (which has size {@link 
#primitiveFieldsDataSize}).
+     * These are different from the offsets used in the context of {@link 
sun.misc.Unsafe}.

Review comment:
       Why are they different? Needs elaboration

##########
File path: 
modules/network/src/main/java/org/apache/ignite/internal/network/serialization/ClassDescriptor.java
##########
@@ -59,6 +65,20 @@
      */
     private final boolean isFinal;
 
+    /** Total number of bytes needed to store all primitive fields. */
+    private final int primitiveFieldsDataSize;
+    /** Total number of object (i.e. non-primitive) fields. */
+    private final int objectFieldsCount;
+
+    private Map<String, FieldDescriptor> fieldsByName;
+    /**
+     * Offsets into primitive fields data (which has size {@link 
#primitiveFieldsDataSize}).
+     * These are different from the offsets used in the context of {@link 
sun.misc.Unsafe}.
+     */
+    private Object2IntMap<String> primitiveFieldDataOffsets;
+    /** Indices of non-primitive (i.e. object) fields in the object fields 
array. */

Review comment:
       ```suggestion
       /** Indices of non-primitive fields in the object fields array. */
   ```

##########
File path: 
modules/network/src/main/java/org/apache/ignite/internal/network/serialization/Primitives.java
##########
@@ -0,0 +1,52 @@
+/*
+ * 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.ignite.internal.network.serialization;
+
+/**
+ * Utils to work with primitives.
+ */
+public class Primitives {
+    /**
+     * Returns number of bytes a value of the given primtive type takes (1 for 
byte, 8 for long and so on).
+     *
+     * @param clazz primitive type
+     * @return number of bytes
+     * @throws IllegalArgumentException if the passed type is not primitive
+     */
+    public static int widthInBytes(Class<?> clazz) {
+        if (clazz == byte.class) {
+            return Byte.BYTES;
+        } else if (clazz == short.class) {
+            return Short.BYTES;
+        } else if (clazz == int.class) {
+            return Integer.BYTES;

Review comment:
       I'm just curious if this won't work for varints

##########
File path: 
modules/network/src/main/java/org/apache/ignite/internal/network/serialization/ClassDescriptor.java
##########
@@ -305,4 +336,115 @@ public String toString() {
     public boolean describesSameClass(ClassDescriptor other) {
         return other.clazz() == clazz();
     }
+
+    /**
+     * Returns total number of bytes needed to store all primitive fields.
+     *
+     * @return total number of bytes needed to store all primitive fields
+     */
+    public int primitiveFieldsDataSize() {
+        return primitiveFieldsDataSize;
+    }
+
+    /**
+     * Returns total number of object (i.e. non-primitive) fields.
+     *
+     * @return total number of object (i.e. non-primitive) fields
+     */
+    public int objectFieldsCount() {
+        return objectFieldsCount;
+    }
+
+    /**
+     * Return offset into primitive fields data (which has size {@link 
#primitiveFieldsDataSize()}).
+     * These are different from the offsets used in the context of {@link 
sun.misc.Unsafe}.
+     *
+     * @param fieldName    primitive field name
+     * @param requiredType field type
+     * @return offset into primitive fields data
+     */
+    public int primitiveFieldDataOffset(String fieldName, Class<?> 
requiredType) {
+        assert requiredType.isPrimitive();
+
+        if (fieldsByName == null) {
+            fieldsByName = fieldsByNameMap(fields);
+        }
+
+        FieldDescriptor fieldDesc = fieldsByName.get(fieldName);
+        if (fieldDesc == null) {
+            throw new IllegalStateException("Did not find a field with name " 
+ fieldName);
+        }
+        if (fieldDesc.clazz() != requiredType) {
+            throw new IllegalStateException("Field " + fieldName + " has type 
" + fieldDesc.clazz()
+                    + ", but it was used as " + requiredType);
+        }
+
+        if (primitiveFieldDataOffsets == null) {

Review comment:
       Is it lazy initialization? I think it's another optimization point, we 
should do eagerly all the initialization eagerly

##########
File path: 
modules/network/src/main/java/org/apache/ignite/internal/network/serialization/ClassDescriptor.java
##########
@@ -305,4 +336,115 @@ public String toString() {
     public boolean describesSameClass(ClassDescriptor other) {
         return other.clazz() == clazz();
     }
+
+    /**
+     * Returns total number of bytes needed to store all primitive fields.
+     *
+     * @return total number of bytes needed to store all primitive fields
+     */
+    public int primitiveFieldsDataSize() {
+        return primitiveFieldsDataSize;
+    }
+
+    /**
+     * Returns total number of object (i.e. non-primitive) fields.
+     *
+     * @return total number of object (i.e. non-primitive) fields
+     */
+    public int objectFieldsCount() {
+        return objectFieldsCount;
+    }
+
+    /**
+     * Return offset into primitive fields data (which has size {@link 
#primitiveFieldsDataSize()}).
+     * These are different from the offsets used in the context of {@link 
sun.misc.Unsafe}.
+     *
+     * @param fieldName    primitive field name
+     * @param requiredType field type
+     * @return offset into primitive fields data
+     */
+    public int primitiveFieldDataOffset(String fieldName, Class<?> 
requiredType) {
+        assert requiredType.isPrimitive();
+
+        if (fieldsByName == null) {
+            fieldsByName = fieldsByNameMap(fields);
+        }
+
+        FieldDescriptor fieldDesc = fieldsByName.get(fieldName);
+        if (fieldDesc == null) {
+            throw new IllegalStateException("Did not find a field with name " 
+ fieldName);
+        }
+        if (fieldDesc.clazz() != requiredType) {
+            throw new IllegalStateException("Field " + fieldName + " has type 
" + fieldDesc.clazz()
+                    + ", but it was used as " + requiredType);
+        }
+
+        if (primitiveFieldDataOffsets == null) {
+            primitiveFieldDataOffsets = primitiveFieldDataOffsetsMap(fields);
+        }
+
+        assert primitiveFieldDataOffsets.containsKey(fieldName);
+
+        return primitiveFieldDataOffsets.getInt(fieldName);
+    }
+
+    private static Map<String, FieldDescriptor> 
fieldsByNameMap(List<FieldDescriptor> fields) {
+        return fields.stream()
+                .collect(toUnmodifiableMap(FieldDescriptor::name, 
Function.identity()));
+    }
+
+    private static Object2IntMap<String> 
primitiveFieldDataOffsetsMap(List<FieldDescriptor> fields) {
+        Object2IntMap<String> map = new Object2IntOpenHashMap<>();
+
+        int accumulatedOffset = 0;
+        for (FieldDescriptor fieldDesc : fields) {
+            if (fieldDesc.isPrimitive()) {
+                map.put(fieldDesc.name(), accumulatedOffset);
+                accumulatedOffset += 
Primitives.widthInBytes(fieldDesc.clazz());
+            }
+        }
+
+        return map;
+    }
+
+    /**
+     * Returns index of a non-primitive (i.e. object) field in the object 
fields array.
+     *
+     * @param fieldName object field name
+     * @return index of a non-primitive (i.e. object) field in the object 
fields array
+     */
+    public int objectFieldIndex(String fieldName) {
+        if (objectFieldIndices == null) {
+            objectFieldIndices = computeObjectFieldIndices(fields);

Review comment:
       Same thing about lazy initialization




-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


Reply via email to