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/10 15:29:20 UTC
[3/3] incubator-ignite git commit: ignite-950: reworked footer,
added metadata
ignite-950: reworked footer, added metadata
Project: http://git-wip-us.apache.org/repos/asf/incubator-ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-ignite/commit/02faa773
Tree: http://git-wip-us.apache.org/repos/asf/incubator-ignite/tree/02faa773
Diff: http://git-wip-us.apache.org/repos/asf/incubator-ignite/diff/02faa773
Branch: refs/heads/ignite-950
Commit: 02faa773d824a9ba1453e4ee4852182066a5e30e
Parents: d2e247a
Author: Denis Magda <dm...@gridgain.com>
Authored: Wed Jun 10 16:29:04 2015 +0300
Committer: Denis Magda <dm...@gridgain.com>
Committed: Wed Jun 10 16:29:04 2015 +0300
----------------------------------------------------------------------
.../processors/cache/CacheObjectContext.java | 15 +++-
.../IgniteCacheObjectProcessorImpl.java | 2 +
.../optimized/OptimizedClassDescriptor.java | 4 +-
.../optimized/OptimizedMarshallerUtils.java | 14 +--
.../optimized/OptimizedObjectInputStream.java | 91 ++++++++++++++------
.../optimized/OptimizedObjectMetadata.java | 52 +++++++++--
.../optimized/OptimizedObjectOutputStream.java | 10 +--
.../optimized/OptimizedMarshallerSelfTest.java | 8 +-
8 files changed, 138 insertions(+), 58 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/02faa773/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheObjectContext.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheObjectContext.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheObjectContext.java
index e85a04a..cf35177 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheObjectContext.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheObjectContext.java
@@ -45,21 +45,27 @@ public class CacheObjectContext {
/** */
private boolean p2pEnabled;
+ /** */
+ private boolean systemCache;
+
/**
* @param kernalCtx Kernal context.
* @param dfltAffMapper Default affinity mapper.
* @param cpyOnGet Copy on get flag.
* @param storeVal {@code True} if should store unmarshalled value in cache.
+ * @param systemCache Whether the object will be stored in a system cache or not.
*/
public CacheObjectContext(GridKernalContext kernalCtx,
AffinityKeyMapper dfltAffMapper,
boolean cpyOnGet,
- boolean storeVal) {
+ boolean storeVal,
+ boolean systemCache) {
this.kernalCtx = kernalCtx;
this.p2pEnabled = kernalCtx.config().isPeerClassLoadingEnabled();
this.dfltAffMapper = dfltAffMapper;
this.cpyOnGet = cpyOnGet;
this.storeVal = storeVal;
+ this.systemCache = systemCache;
proc = kernalCtx.cacheObjects();
}
@@ -86,6 +92,13 @@ public class CacheObjectContext {
}
/**
+ * @return {@code true} if the object is stored in a system cache.
+ */
+ public boolean systemCache() {
+ return systemCache;
+ }
+
+ /**
* @return Default affinity mapper.
*/
public AffinityKeyMapper defaultAffMapper() {
http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/02faa773/modules/core/src/main/java/org/apache/ignite/internal/processors/cacheobject/IgniteCacheObjectProcessorImpl.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cacheobject/IgniteCacheObjectProcessorImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cacheobject/IgniteCacheObjectProcessorImpl.java
index bf96dd8..2b9e69b 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cacheobject/IgniteCacheObjectProcessorImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cacheobject/IgniteCacheObjectProcessorImpl.java
@@ -17,6 +17,7 @@
package org.apache.ignite.internal.processors.cacheobject;
+import com.sun.javaws.*;
import org.apache.ignite.*;
import org.apache.ignite.cache.*;
import org.apache.ignite.configuration.*;
@@ -262,6 +263,7 @@ public class IgniteCacheObjectProcessorImpl extends GridProcessorAdapter impleme
return new CacheObjectContext(ctx,
ccfg.getAffinityMapper() != null ? ccfg.getAffinityMapper() : new GridCacheDefaultAffinityKeyMapper(),
ccfg.isCopyOnRead() && memMode == ONHEAP_TIERED,
+ GridCacheUtils.isSystemCache(ccfg.getName()),
storeVal);
}
http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/02faa773/modules/core/src/main/java/org/apache/ignite/marshaller/optimized/OptimizedClassDescriptor.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/marshaller/optimized/OptimizedClassDescriptor.java b/modules/core/src/main/java/org/apache/ignite/marshaller/optimized/OptimizedClassDescriptor.java
index 29709fa..ba3dfcf 100644
--- a/modules/core/src/main/java/org/apache/ignite/marshaller/optimized/OptimizedClassDescriptor.java
+++ b/modules/core/src/main/java/org/apache/ignite/marshaller/optimized/OptimizedClassDescriptor.java
@@ -134,7 +134,7 @@ class OptimizedClassDescriptor {
this.clsMap = clsMap;
this.ctx = ctx;
this.mapper = mapper;
- this.metaHandler = this.metaHandler;
+ this.metaHandler = metaHandler;
name = cls.getName();
@@ -492,7 +492,7 @@ class OptimizedClassDescriptor {
for (ClassFields clsFields : this.fields.fields)
for (FieldInfo info : clsFields.fields)
- meta.addMeta(info.id(), (byte)info.type().ordinal());
+ meta.addMeta(info.id(), info.type());
U.debug("putting to cache: " + typeId);
http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/02faa773/modules/core/src/main/java/org/apache/ignite/marshaller/optimized/OptimizedMarshallerUtils.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/marshaller/optimized/OptimizedMarshallerUtils.java b/modules/core/src/main/java/org/apache/ignite/marshaller/optimized/OptimizedMarshallerUtils.java
index 60141ee..bf6a4fa 100644
--- a/modules/core/src/main/java/org/apache/ignite/marshaller/optimized/OptimizedMarshallerUtils.java
+++ b/modules/core/src/main/java/org/apache/ignite/marshaller/optimized/OptimizedMarshallerUtils.java
@@ -149,6 +149,9 @@ class OptimizedMarshallerUtils {
/** */
static final byte FOOTER_LEN_OFF = 4;
+ /** */
+ static final byte VARIABLE_LEN = -1;
+
/** UTF-8 character name. */
static final Charset UTF_8 = Charset.forName("UTF-8");
@@ -221,7 +224,7 @@ class OptimizedMarshallerUtils {
* @param mapper Mapper.
* @return Type ID.
*/
- private static int resolveTypeId(String clsName, OptimizedMarshallerIdMapper mapper) {
+ public static int resolveTypeId(String clsName, OptimizedMarshallerIdMapper mapper) {
int typeId;
if (mapper != null) {
@@ -237,15 +240,6 @@ class OptimizedMarshallerUtils {
}
/**
- * Checks whether a given type supports and should include footer with fields info into the serialized form.
- *
- * @param type Type.
- * @return {@code true} if supported, {@code false} otherwise.
- */
- public static boolean supportsFooter(int type) {
- return type == SERIALIZABLE;
- }
- /**
* @param fieldName Field name.
* @return Field ID.
*/
http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/02faa773/modules/core/src/main/java/org/apache/ignite/marshaller/optimized/OptimizedObjectInputStream.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/marshaller/optimized/OptimizedObjectInputStream.java b/modules/core/src/main/java/org/apache/ignite/marshaller/optimized/OptimizedObjectInputStream.java
index 34fd539..846fb08 100644
--- a/modules/core/src/main/java/org/apache/ignite/marshaller/optimized/OptimizedObjectInputStream.java
+++ b/modules/core/src/main/java/org/apache/ignite/marshaller/optimized/OptimizedObjectInputStream.java
@@ -965,14 +965,16 @@ class OptimizedObjectInputStream extends ObjectInputStream {
int pos = in.position();
// TODO: IGNITE-950, do we need move to start position?
- if (!supportsFooter(in.readByte()))
+ if (in.readByte() != SERIALIZABLE) {
+ in.position(pos);
return false;
+ }
- int off = fieldOffset(fieldName);
+ FieldRange range = fieldRange(fieldName);
in.position(pos);
- return off > 0;
+ return range != null && range.start > 0;
}
/**
@@ -986,15 +988,17 @@ class OptimizedObjectInputStream extends ObjectInputStream {
int pos = in.position();
// TODO: IGNITE-950, do we need move to start position?
- if (!supportsFooter(in.readByte()))
+ if (in.readByte() != SERIALIZABLE) {
+ in.position(pos);
return false;
+ }
- int off = fieldOffset(fieldName);
+ FieldRange range = fieldRange(fieldName);
Object obj = null;
- if (off > 0) {
- in.position(off);
+ if (range != null && range.start > 0) {
+ in.position(range.start);
obj = readObject();
}
@@ -1007,12 +1011,30 @@ class OptimizedObjectInputStream extends ObjectInputStream {
* Returns field offset in the byte stream.
*
* @param fieldName Field name.
- * @return positive offset or -1 if the object doesn't have such a field.
+ * @return positive range or {@code null} if the object doesn't have such a field.
* @throws IOException in case of error.
*/
- private int fieldOffset(String fieldName) throws IOException {
+ private FieldRange fieldRange(String fieldName) throws IOException {
int fieldId = resolveFieldId(fieldName);
+ int typeId = readInt();
+
+ int clsNameLen = 0;
+
+ if (typeId == 0) {
+ int pos = in.position();
+
+ typeId = OptimizedMarshallerUtils.resolveTypeId(readUTF(), mapper);
+
+ clsNameLen = in.position() - pos;
+ }
+
+ OptimizedObjectMetadata meta = metaHandler.metadata(typeId);
+
+ if (meta == null)
+ // TODO: IGNITE-950 add warning!
+ return null;
+
int end = in.size();
in.position(end - FOOTER_LEN_OFF);
@@ -1020,33 +1042,28 @@ class OptimizedObjectInputStream extends ObjectInputStream {
int footerLen = in.readInt();
if (footerLen == EMPTY_FOOTER)
- return -1;
-
- int footerStartOff = end - footerLen;
- in.position(footerStartOff);
+ return null;
- int fieldsDataPos = in.readInt();
+ // 4 - skipping length at the beginning
+ int footerOff = (end - footerLen) + 4;
+ in.position(footerOff);
- int fieldOff = -1;
+ int fieldOff = 0;
- // 8 - size of footer len and object total len fields.
- int bound = end - 8;
+ for (OptimizedObjectMetadata.FieldInfo info : meta.getMeta()) {
+ if (info.id == fieldId) {
+ //object header len: 1 - for type, 4 - for type ID, 2 - for checksum.
+ fieldOff += 1 + 4 + clsNameLen + 2;
- while (footerStartOff < bound) {
- int id = in.readInt();
+ FieldRange range = new FieldRange(fieldOff, info.len == VARIABLE_LEN ? in.readShort() : info.len);
- if (fieldId == id) {
- fieldOff = fieldsDataPos + in.readInt();
- break;
+ return range;
}
else
- // skip offset and len
- in.skipBytes(8);
-
- footerStartOff += 12;
+ fieldOff += info.len == VARIABLE_LEN ? in.readShort() : info.len;
}
- return fieldOff;
+ return null;
}
/**
@@ -1294,4 +1311,24 @@ class OptimizedObjectInputStream extends ObjectInputStream {
return objs[fieldInfo.getIndex(name)] != null ? (T)objs[fieldInfo.getIndex(name)] : dflt;
}
}
+
+ /**
+ *
+ */
+ private static class FieldRange {
+ /** */
+ private int start;
+
+ /** */
+ private int len;
+
+ /**
+ * @param start Start.
+ * @param len Length.
+ */
+ public FieldRange(int start, int len) {
+ this.start = start;
+ this.len = len;
+ }
+ }
}
http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/02faa773/modules/core/src/main/java/org/apache/ignite/marshaller/optimized/OptimizedObjectMetadata.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/marshaller/optimized/OptimizedObjectMetadata.java b/modules/core/src/main/java/org/apache/ignite/marshaller/optimized/OptimizedObjectMetadata.java
index e156c4c..5b476da 100644
--- a/modules/core/src/main/java/org/apache/ignite/marshaller/optimized/OptimizedObjectMetadata.java
+++ b/modules/core/src/main/java/org/apache/ignite/marshaller/optimized/OptimizedObjectMetadata.java
@@ -17,9 +17,12 @@
package org.apache.ignite.marshaller.optimized;
+import org.apache.ignite.*;
+
import java.io.*;
import java.util.*;
+import static org.apache.ignite.marshaller.optimized.OptimizedFieldType.*;
/**
* Metadata that keeps fields information. Used in conjunction with the footer that is added to some objects during
* marshalling.
@@ -39,11 +42,44 @@ public class OptimizedObjectMetadata implements Externalizable {
* @param fieldId Field ID.
* @param fieldType Field type.
*/
- public void addMeta(int fieldId, byte fieldType) {
+ public void addMeta(int fieldId, OptimizedFieldType fieldType) {
if (fieldsInfo == null)
fieldsInfo = new ArrayList<>();
- fieldsInfo.add(new FieldInfo(fieldId, fieldType));
+ int len = 1;
+
+ switch (fieldType) {
+ case BYTE:
+ case BOOLEAN:
+ len += 1;
+ break;
+
+ case SHORT:
+ case CHAR:
+ len += 2;
+ break;
+
+ case INT:
+ case FLOAT:
+ len += 4;
+ break;
+
+ case LONG:
+ case DOUBLE:
+ len += 8;
+ break;
+
+ case OTHER:
+ len = OptimizedMarshallerUtils.VARIABLE_LEN;
+ break;
+
+ default:
+ throw new IgniteException("Unknown field type: " + fieldType);
+ }
+
+ assert len != 1;
+
+ fieldsInfo.add(new FieldInfo(fieldId, len));
}
/**
@@ -75,7 +111,7 @@ public class OptimizedObjectMetadata implements Externalizable {
for (FieldInfo fieldInfo : fieldsInfo) {
out.writeInt(fieldInfo.id);
- out.writeByte(fieldInfo.type);
+ out.writeInt(fieldInfo.len);
}
}
@@ -86,7 +122,7 @@ public class OptimizedObjectMetadata implements Externalizable {
fieldsInfo = new ArrayList<>(size);
for (int i = 0; i < size; i++)
- fieldsInfo.add(new FieldInfo(in.readInt(), in.readByte()));
+ fieldsInfo.add(new FieldInfo(in.readInt(), in.readInt()));
}
/**
@@ -97,17 +133,17 @@ public class OptimizedObjectMetadata implements Externalizable {
int id;
/** Field type. */
- byte type;
+ int len;
/**
* Constructor.
*
* @param id Field ID.
- * @param type Field type.
+ * @param len Field len.
*/
- public FieldInfo(int id, byte type) {
+ public FieldInfo(int id, int len) {
this.id = id;
- this.type = type;
+ this.len = len;
}
}
}
http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/02faa773/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 288ddef..2ead955 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
@@ -561,7 +561,7 @@ class OptimizedObjectOutputStream extends ObjectOutputStream {
if (t.field() != null) {
int fieldLen = out.size() - size;
- footer.put(t.id(), (byte)t.type().ordinal(), fieldLen);
+ footer.put(t.id(), t.type(), fieldLen);
}
}
}
@@ -819,7 +819,7 @@ class OptimizedObjectOutputStream extends ObjectOutputStream {
int fieldLen = out.size() - size;
- footer.put(t.get1().id(), (byte)t.get1().type().ordinal(), fieldLen);
+ footer.put(t.get1().id(), t.get1().type(), fieldLen);
}
}
@@ -986,12 +986,12 @@ class OptimizedObjectOutputStream extends ObjectOutputStream {
* @param fieldType Field type.
* @param len Total number of bytes occupied by type's value.
*/
- private void put(int fieldId, byte fieldType, int len) {
+ private void put(int fieldId, OptimizedFieldType fieldType, int len) {
if (data == null)
return;
// Considering that field's length will be no longer 2^15 (32 MB)
- if (fieldType == OptimizedFieldType.OTHER.ordinal())
+ if (fieldType == OptimizedFieldType.OTHER)
data.add((short)len);
}
@@ -1011,8 +1011,6 @@ class OptimizedObjectOutputStream extends ObjectOutputStream {
if (data == null)
writeInt(EMPTY_FOOTER);
else {
- int footerStartPos = out.size();
-
//12 - 4 bytes for len at the beginning, 4 bytes for len at the end, 4 bytes for object len.
int footerLen = data.size() * 2 + 12;
http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/02faa773/modules/core/src/test/java/org/apache/ignite/marshaller/optimized/OptimizedMarshallerSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/marshaller/optimized/OptimizedMarshallerSelfTest.java b/modules/core/src/test/java/org/apache/ignite/marshaller/optimized/OptimizedMarshallerSelfTest.java
index d890331..6c78506 100644
--- a/modules/core/src/test/java/org/apache/ignite/marshaller/optimized/OptimizedMarshallerSelfTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/marshaller/optimized/OptimizedMarshallerSelfTest.java
@@ -114,13 +114,13 @@ public class OptimizedMarshallerSelfTest extends GridMarshallerAbstractTest {
* @throws Exception If failed.
*/
public void testFieldUnmarshalling() throws Exception {
- //TestObject2 obj = new TestObject2(5);
+ TestObject2 obj = new TestObject2(5);
- //byte[] data = marshal(obj);
+ byte[] data = marshal(obj);
- //Integer i = ((OptimizedMarshaller)marsh).unmarshal("i", data, Thread.currentThread().getContextClassLoader());
+ Integer i = ((OptimizedMarshaller)marsh).unmarshal("i", data, Thread.currentThread().getContextClassLoader());
- //assertEquals(obj.i, (int)i);
+ assertEquals(obj.i, (int)i);
}
/**