You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by sb...@apache.org on 2015/06/30 12:52:11 UTC
[50/50] [abbrv] incubator-ignite git commit: IGNITE-950: optimization
improvements
IGNITE-950: optimization improvements
Project: http://git-wip-us.apache.org/repos/asf/incubator-ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-ignite/commit/048d7115
Tree: http://git-wip-us.apache.org/repos/asf/incubator-ignite/tree/048d7115
Diff: http://git-wip-us.apache.org/repos/asf/incubator-ignite/diff/048d7115
Branch: refs/heads/ignite-950
Commit: 048d7115199df3e37e76c4e684008f4ac3fe5b48
Parents: 55c7c9f
Author: Denis Magda <dm...@gridgain.com>
Authored: Tue Jun 30 13:50:59 2015 +0300
Committer: Denis Magda <dm...@gridgain.com>
Committed: Tue Jun 30 13:50:59 2015 +0300
----------------------------------------------------------------------
.../OptimizedMarshallerIndexingHandler.java | 6 ++
.../optimized/OptimizedObjectOutputStream.java | 108 +++++++++++++++----
2 files changed, 96 insertions(+), 18 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/048d7115/modules/core/src/main/java/org/apache/ignite/marshaller/optimized/OptimizedMarshallerIndexingHandler.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/marshaller/optimized/OptimizedMarshallerIndexingHandler.java b/modules/core/src/main/java/org/apache/ignite/marshaller/optimized/OptimizedMarshallerIndexingHandler.java
index b8f8ad4..b48ce21 100644
--- a/modules/core/src/main/java/org/apache/ignite/marshaller/optimized/OptimizedMarshallerIndexingHandler.java
+++ b/modules/core/src/main/java/org/apache/ignite/marshaller/optimized/OptimizedMarshallerIndexingHandler.java
@@ -132,6 +132,9 @@ public class OptimizedMarshallerIndexingHandler {
* @throws IgniteCheckedException In case of error.
*/
public boolean enableFieldsIndexingForClass(Class<?> cls) throws IgniteCheckedException {
+ if (!isFieldsIndexingSupported())
+ return false;
+
if (metaHandler == null)
return false;
@@ -179,6 +182,9 @@ public class OptimizedMarshallerIndexingHandler {
* @return {@code true} if fields indexing is enabled.
*/
public boolean fieldsIndexingEnabledForClass(Class<?> cls) {
+ if (!isFieldsIndexingSupported())
+ return false;
+
if (metaHandler == null)
return false;
http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/048d7115/modules/core/src/main/java/org/apache/ignite/marshaller/optimized/OptimizedObjectOutputStream.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/marshaller/optimized/OptimizedObjectOutputStream.java b/modules/core/src/main/java/org/apache/ignite/marshaller/optimized/OptimizedObjectOutputStream.java
index b4be275..a23d529 100644
--- a/modules/core/src/main/java/org/apache/ignite/marshaller/optimized/OptimizedObjectOutputStream.java
+++ b/modules/core/src/main/java/org/apache/ignite/marshaller/optimized/OptimizedObjectOutputStream.java
@@ -24,10 +24,12 @@ import org.apache.ignite.internal.util.typedef.*;
import org.apache.ignite.lang.*;
import org.apache.ignite.marshaller.*;
import org.jetbrains.annotations.*;
+import sun.misc.*;
import java.io.*;
import java.lang.reflect.*;
import java.util.*;
+import java.util.Queue;
import java.util.concurrent.*;
import static org.apache.ignite.marshaller.optimized.OptimizedMarshallerUtils.*;
@@ -44,6 +46,19 @@ public class OptimizedObjectOutputStream extends ObjectOutputStream implements O
);
/** */
+ private static final int MAX_FOOTERS_POOL_SIZE = 6;
+
+ /** Unsafe. */
+ private static final Unsafe UNSAFE = GridUnsafe.unsafe();
+
+ /** */
+ private static final long byteArrOff = UNSAFE.arrayBaseOffset(byte[].class);
+
+ /** */
+ private static final long longArrOff = UNSAFE.arrayBaseOffset(long[].class);
+
+
+ /** */
private final GridDataOutput out;
/** */
@@ -79,6 +94,9 @@ public class OptimizedObjectOutputStream extends ObjectOutputStream implements O
/** */
private Stack<Footer> marshalAwareFooters;
+ /** */
+ private Queue<Footer> footersPool;
+
/**
* @param out Output.
* @throws IOException In case of error.
@@ -327,11 +345,11 @@ public class OptimizedObjectOutputStream extends ObjectOutputStream implements O
* @throws IOException In case of error.
*/
void writeMarshalAware(Object obj) throws IOException {
- if (!idxHandler.isFieldsIndexingSupported())
+ if (idxHandler == null || !idxHandler.isFieldsIndexingSupported())
throw new IOException("Failed to marshal OptimizedMarshalAware object. Optimized marshaller protocol " +
"version must be no less then OptimizedMarshallerProtocolVersion.VER_1_1.");
- Footer footer = new Footer();
+ Footer footer = getFooter();
if (marshalAwareFooters == null)
marshalAwareFooters = new Stack<>();
@@ -345,9 +363,6 @@ public class OptimizedObjectOutputStream extends ObjectOutputStream implements O
footer.write();
marshalAwareFooters.pop();
-
- if (marshalAwareFooters.empty())
- marshalAwareFooters = null;
}
/**
@@ -363,14 +378,13 @@ public class OptimizedObjectOutputStream extends ObjectOutputStream implements O
throws IOException {
Footer footer = null;
- if (idxHandler.isFieldsIndexingSupported()) {
- boolean hasFooter = fields.fieldsIndexingSupported() &&
- idxHandler.fieldsIndexingEnabledForClass(obj.getClass());
+ if (idxHandler != null && idxHandler.isFieldsIndexingSupported()) {
+ boolean hasFooter = fields.fieldsIndexingSupported();
out.writeBoolean(hasFooter);
if (hasFooter)
- footer = new Footer();
+ footer = getFooter();
}
for (int i = 0; i < mtds.size(); i++) {
@@ -916,7 +930,7 @@ public class OptimizedObjectOutputStream extends ObjectOutputStream implements O
curObj = null;
curFields = null;
curPut = null;
- marshalAwareFooters = null;
+ curFooter = null;
}
/** {@inheritDoc} */
@@ -930,6 +944,30 @@ public class OptimizedObjectOutputStream extends ObjectOutputStream implements O
}
/**
+ * Gets footer.
+ *
+ * @return Footer.
+ */
+ private Footer getFooter() {
+ Footer footer;
+
+ if (footersPool == null) {
+ footersPool = new LinkedList<>();
+
+ for (int i = 0; i < MAX_FOOTERS_POOL_SIZE; i++)
+ footersPool.add(new Footer());
+ }
+
+ footer = footersPool.poll();
+
+ if (footer == null)
+ footer = new Footer();
+
+ return footer;
+ }
+
+
+ /**
* Writes field's type to an OutputStream during field serialization.
*
* @param type Field type.
@@ -1195,18 +1233,29 @@ public class OptimizedObjectOutputStream extends ObjectOutputStream implements O
*/
private class Footer {
/** */
- private ArrayList<Long> data = new ArrayList<>();
+ private static final int DEFAULT_FOOTER_SIZE = 15;
+
+ /** */
+ private long[] data = new long[DEFAULT_FOOTER_SIZE];
+
+ /** */
+ private int size;
/** */
private boolean hasHandles;
+
/**
* Adds offset of a field that must be placed next to the footer.
*
* @param off Field offset.
*/
public void addNextFieldOff(int off) {
- data.add((long)(off & ~FOOTER_BODY_IS_HANDLE_MASK));
+ ensureCapacity();
+
+ data[size] = ((long)(off & ~FOOTER_BODY_IS_HANDLE_MASK));
+
+ size++;
}
/**
@@ -1216,9 +1265,13 @@ public class OptimizedObjectOutputStream extends ObjectOutputStream implements O
* @param handleLength Handle length.
*/
public void addNextHandleField(int handleOff, int handleLength) {
+ ensureCapacity();
+
hasHandles = true;
- data.add(((long)handleLength << 32) | (handleOff | FOOTER_BODY_IS_HANDLE_MASK));
+ data[size] = (((long)handleLength << 32) | (handleOff | FOOTER_BODY_IS_HANDLE_MASK));
+
+ size++;
}
/**
@@ -1232,23 +1285,42 @@ public class OptimizedObjectOutputStream extends ObjectOutputStream implements O
else {
// +5 - 2 bytes for footer len at the beginning, 2 bytes for footer len at the end, 1 byte for handles
// indicator flag.
- short footerLen = (short)(data.size() * (hasHandles ? 8 : 4) + 5);
+ short footerLen = (short)(size * (hasHandles ? 8 : 4) + 5);
writeShort(footerLen);
if (hasHandles) {
- for (long body : data)
- writeLong(body);
+ for (int i = 0; i < size; i++)
+ writeLong(data[i]);
}
else {
- for (long body : data)
- writeInt((int)body);
+ for (int i = 0; i < size; i++)
+ writeInt((int)data[i]);
}
writeByte(hasHandles ? 1 : 0);
writeShort(footerLen);
}
+
+ size = 0;
+ hasHandles = false;
+
+ if (footersPool.size() < MAX_FOOTERS_POOL_SIZE)
+ footersPool.add(this);
+ }
+
+ /**
+ * Checks capacity.
+ */
+ private void ensureCapacity() {
+ if (size + 1 >= data.length) {
+ long[] newData = new long[data.length + 15];
+
+ UNSAFE.copyMemory(data, longArrOff, newData, byteArrOff, data.length << 3);
+
+ data = newData;
+ }
}
}
}