[infinispan-dev] Improved Marshaller

Galder Zamarreno galder.zamarreno at redhat.com
Tue May 19 13:00:39 EDT 2009


Manik Surtani wrote:
> I just checked the following in trunk.
> 
> Galder, you may want to do something similar for your JBMAR prototype.
> 
> The changes are around InternalCacheEntry and now InternalCacheValue.
> 
> Previously, the marshaller stored an InternalCacheEntry as [key, value, 
> canExpire, created, lifespan, lastUsed, maxIdle], setting either of the 
> last 4 elements to -1 if they are unused.  In a system mainly comprising 
> of mortal values, this is wasteful since each of the last 2 values - 
> which would be unused - are longs and still written to.
> 
> So this change identifies the InternalCacheEntry and writes just what is 
> needed, hence the use of specific magic numbers for each of the 
> InternalCacheEntry implementations.  Using a different magic number for 
> each entry type allows me to trim what is written.
> 
> Same approach used for InternalCacheValue.
> 
> Yes, even more ugly switch statements - and this is why we need JBMAR to 
> clean this up - if and when it can match performance and compactness of 
> the resulting byte array.  :-)

This has been done now.

> 
> Cheers
> Manik
> 
> 
> Begin forwarded message:
> 
>> From: infinispan-commits at lists.jboss.org
>> Date: 8 May 2009 12:37:23 BST
>> To: infinispan-commits at lists.jboss.org
>> Subject: [infinispan-commits] Infinispan SVN: r234 - 
>> trunk/core/src/main/java/org/infinispan/marshall.
>> Reply-To: infinispan-commits at lists.jboss.org
>>
>> Author: manik.surtani at jboss.com
>> Date: 2009-05-08 07:37:23 -0400 (Fri, 08 May 2009)
>> New Revision: 234
>>
>> Modified:
>>   trunk/core/src/main/java/org/infinispan/marshall/MarshallerImpl.java
>> Log:
>> Improved marshaller
>>
>> Modified: 
>> trunk/core/src/main/java/org/infinispan/marshall/MarshallerImpl.java
>> ===================================================================
>> --- 
>> trunk/core/src/main/java/org/infinispan/marshall/MarshallerImpl.java    
>> 2009-05-08 11:36:59 UTC (rev 233)
>> +++ 
>> trunk/core/src/main/java/org/infinispan/marshall/MarshallerImpl.java    
>> 2009-05-08 11:37:23 UTC (rev 234)
>> @@ -26,8 +26,13 @@
>> import org.infinispan.commands.RemoteCommandFactory;
>> import org.infinispan.commands.ReplicableCommand;
>> import org.infinispan.commands.write.WriteCommand;
>> +import org.infinispan.container.entries.ImmortalCacheEntry;
>> import org.infinispan.container.entries.InternalCacheEntry;
>> +import org.infinispan.container.entries.InternalCacheValue;
>> import org.infinispan.container.entries.InternalEntryFactory;
>> +import org.infinispan.container.entries.MortalCacheEntry;
>> +import org.infinispan.container.entries.TransientCacheEntry;
>> +import org.infinispan.container.entries.TransientMortalCacheEntry;
>> import org.infinispan.io.ByteBuffer;
>> import org.infinispan.io.ExposedByteArrayOutputStream;
>> import org.infinispan.remoting.responses.ExceptionResponse;
>> @@ -94,14 +99,23 @@
>>    protected static final int MAGICNUMBER_SINGLETON_LIST = 23;
>>    protected static final int MAGICNUMBER_COMMAND = 24;
>>    protected static final int MAGICNUMBER_TRANSACTION_LOG = 25;
>> -   protected static final int MAGICNUMBER_INTERNAL_CACHED_ENTRY = 26;
>>
>> +   // --- cache entries and values ---
>> +   protected static final int MAGICNUMBER_ICE_IMMORTAL = 26;
>> +   protected static final int MAGICNUMBER_ICE_MORTAL = 27;
>> +   protected static final int MAGICNUMBER_ICE_TRANSIENT = 28;
>> +   protected static final int MAGICNUMBER_ICE_TRANSIENT_MORTAL = 29;
>> +   protected static final int MAGICNUMBER_ICV_IMMORTAL = 30;
>> +   protected static final int MAGICNUMBER_ICV_MORTAL = 31;
>> +   protected static final int MAGICNUMBER_ICV_TRANSIENT = 32;
>> +   protected static final int MAGICNUMBER_ICV_TRANSIENT_MORTAL = 33;
>> +
>>    // ---- responses
>> -   protected static final int MAGICNUMBER_REQUEST_IGNORED_RESPONSE = 27;
>> -   protected static final int MAGICNUMBER_EXTENDED_RESPONSE = 28;
>> -   protected static final int MAGICNUMBER_EXCEPTION_RESPONSE = 29;
>> -   protected static final int MAGICNUMBER_SUCCESSFUL_RESPONSE = 30;
>> -   protected static final int MAGICNUMBER_UNSUCCESSFUL_RESPONSE = 31;
>> +   protected static final int MAGICNUMBER_REQUEST_IGNORED_RESPONSE = 34;
>> +   protected static final int MAGICNUMBER_EXTENDED_RESPONSE = 35;
>> +   protected static final int MAGICNUMBER_EXCEPTION_RESPONSE = 36;
>> +   protected static final int MAGICNUMBER_SUCCESSFUL_RESPONSE = 37;
>> +   protected static final int MAGICNUMBER_UNSUCCESSFUL_RESPONSE = 38;
>>
>>    protected static final int MAGICNUMBER_NULL = 99;
>>    protected static final int MAGICNUMBER_SERIALIZABLE = 100;
>> @@ -173,19 +187,9 @@
>>          } else if (o instanceof Response) {
>>             marshallResponse((Response) o, out, refMap);
>>          } else if (o instanceof InternalCacheEntry) {
>> -            out.writeByte(MAGICNUMBER_INTERNAL_CACHED_ENTRY);
>> -            InternalCacheEntry ice = (InternalCacheEntry) o;
>> -            marshallObject(ice.getKey(), out, refMap);
>> -            marshallObject(ice.getValue(), out, refMap);
>> -            if (ice.canExpire()) {
>> -               out.writeBoolean(true);
>> -               writeUnsignedLong(out, ice.getCreated());
>> -               out.writeLong(ice.getLifespan()); // could be negative 
>> so should not use unsigned longs
>> -               writeUnsignedLong(out, ice.getLastUsed());
>> -               out.writeLong(ice.getMaxIdle()); // could be negative 
>> so should not use unsigned longs
>> -            } else {
>> -               out.writeBoolean(false);
>> -            }
>> +            marshallInternalCacheEntry((InternalCacheEntry) o, out, 
>> refMap);
>> +         } else if (o instanceof InternalCacheValue) {
>> +            marshallInternalCacheValue((InternalCacheValue) o, out, 
>> refMap);
>>          } else if (o.getClass().equals(ArrayList.class)) {
>>             out.writeByte(MAGICNUMBER_ARRAY_LIST);
>>             marshallCollection((Collection) o, out, refMap);
>> @@ -252,7 +256,65 @@
>>       }
>>    }
>>
>> +   private void marshallInternalCacheEntry(InternalCacheEntry ice, 
>> ObjectOutput out, Map<Object, Integer> refMap) throws IOException {
>> +      if (ice.getClass().equals(ImmortalCacheEntry.class)) {
>> +         out.writeByte(MAGICNUMBER_ICE_IMMORTAL);
>> +         marshallObject(ice.getKey(), out, refMap);
>> +         marshallObject(ice.getValue(), out, refMap);
>>
>> +      } else if (ice.getClass().equals(MortalCacheEntry.class)) {
>> +         out.writeByte(MAGICNUMBER_ICE_MORTAL);
>> +         marshallObject(ice.getKey(), out, refMap);
>> +         marshallObject(ice.getValue(), out, refMap);
>> +         writeUnsignedLong(out, ice.getCreated());
>> +         out.writeLong(ice.getLifespan()); // could be negative so 
>> should not use unsigned longs
>> +
>> +      } else if (ice.getClass().equals(TransientCacheEntry.class)) {
>> +         out.writeByte(MAGICNUMBER_ICE_TRANSIENT);
>> +         marshallObject(ice.getKey(), out, refMap);
>> +         marshallObject(ice.getValue(), out, refMap);
>> +         writeUnsignedLong(out, ice.getLastUsed());
>> +         out.writeLong(ice.getMaxIdle()); // could be negative so 
>> should not use unsigned longs
>> +
>> +      } else if 
>> (ice.getClass().equals(TransientMortalCacheEntry.class)) {
>> +         out.writeByte(MAGICNUMBER_ICE_TRANSIENT_MORTAL);
>> +         marshallObject(ice.getKey(), out, refMap);
>> +         marshallObject(ice.getValue(), out, refMap);
>> +         writeUnsignedLong(out, ice.getCreated());
>> +         out.writeLong(ice.getLifespan()); // could be negative so 
>> should not use unsigned longs
>> +         writeUnsignedLong(out, ice.getLastUsed());
>> +         out.writeLong(ice.getMaxIdle()); // could be negative so 
>> should not use unsigned longs
>> +      }
>> +   }
>> +
>> +   private void marshallInternalCacheValue(InternalCacheValue icv, 
>> ObjectOutput out, Map<Object, Integer> refMap) throws IOException {
>> +      if (icv.getClass().equals(ImmortalCacheEntry.class)) {
>> +         out.writeByte(MAGICNUMBER_ICV_IMMORTAL);
>> +         marshallObject(icv.getValue(), out, refMap);
>> +
>> +      } else if (icv.getClass().equals(MortalCacheEntry.class)) {
>> +         out.writeByte(MAGICNUMBER_ICV_MORTAL);
>> +         marshallObject(icv.getValue(), out, refMap);
>> +         writeUnsignedLong(out, icv.getCreated());
>> +         out.writeLong(icv.getLifespan()); // could be negative so 
>> should not use unsigned longs
>> +
>> +      } else if (icv.getClass().equals(TransientCacheEntry.class)) {
>> +         out.writeByte(MAGICNUMBER_ICV_TRANSIENT);
>> +         marshallObject(icv.getValue(), out, refMap);
>> +         writeUnsignedLong(out, icv.getLastUsed());
>> +         out.writeLong(icv.getMaxIdle()); // could be negative so 
>> should not use unsigned longs
>> +
>> +      } else if 
>> (icv.getClass().equals(TransientMortalCacheEntry.class)) {
>> +         out.writeByte(MAGICNUMBER_ICV_TRANSIENT_MORTAL);
>> +         marshallObject(icv.getValue(), out, refMap);
>> +         writeUnsignedLong(out, icv.getCreated());
>> +         out.writeLong(icv.getLifespan()); // could be negative so 
>> should not use unsigned longs
>> +         writeUnsignedLong(out, icv.getLastUsed());
>> +         out.writeLong(icv.getMaxIdle()); // could be negative so 
>> should not use unsigned longs
>> +      }
>> +   }
>> +
>> +
>>    protected void marshallString(String s, ObjectOutput out) throws 
>> IOException {
>>       //StringUtil.saveString(out, s);
>>       out.writeObject(s);
>> @@ -385,19 +447,16 @@
>>             MarshalledValue mv = new MarshalledValue();
>>             mv.readExternal(in);
>>             return mv;
>> -         case MAGICNUMBER_INTERNAL_CACHED_ENTRY:
>> -            Object k = unmarshallObject(in, refMap);
>> -            Object v = unmarshallObject(in, refMap);
>> -            boolean canExpire = in.readBoolean();
>> -            if (canExpire) {
>> -               long created = readUnsignedLong(in);
>> -               long lifespan = in.readLong(); // could be negative so 
>> should not use unsigned longs
>> -               long lastUsed = readUnsignedLong(in);
>> -               long maxIdle = in.readLong(); // could be negative so 
>> should not use unsigned longs
>> -               return InternalEntryFactory.create(k, v, created, 
>> lifespan, lastUsed, maxIdle);
>> -            } else {
>> -               return InternalEntryFactory.create(k, v);
>> -            }
>> +         case MAGICNUMBER_ICE_IMMORTAL:
>> +         case MAGICNUMBER_ICE_MORTAL:
>> +         case MAGICNUMBER_ICE_TRANSIENT:
>> +         case MAGICNUMBER_ICE_TRANSIENT_MORTAL:
>> +            return unmarshallInternalCacheEntry(magicNumber, in, 
>> refMap);
>> +         case MAGICNUMBER_ICV_IMMORTAL:
>> +         case MAGICNUMBER_ICV_MORTAL:
>> +         case MAGICNUMBER_ICV_TRANSIENT:
>> +         case MAGICNUMBER_ICV_TRANSIENT_MORTAL:
>> +            return unmarshallInternalCacheValue(magicNumber, in, 
>> refMap);
>>          case MAGICNUMBER_REQUEST_IGNORED_RESPONSE:
>>          case MAGICNUMBER_EXTENDED_RESPONSE:
>>          case MAGICNUMBER_EXCEPTION_RESPONSE:
>> @@ -465,6 +524,49 @@
>>       throw new IOException("Unknown magic number " + magicNumber);
>>    }
>>
>> +   private InternalCacheEntry unmarshallInternalCacheEntry(byte 
>> magic, ObjectInput in, UnmarshalledReferences refMap) throws 
>> IOException, ClassNotFoundException {
>> +      Object k = unmarshallObject(in, refMap);
>> +      Object v = unmarshallObject(in, refMap);
>> +      switch (magic) {
>> +         case MAGICNUMBER_ICE_IMMORTAL:
>> +            return InternalEntryFactory.create(k, v);
>> +         case MAGICNUMBER_ICE_MORTAL:
>> +            return InternalEntryFactory.create(k, v,
>> +                                               readUnsignedLong(in), 
>> (Long) unmarshallObject(in, refMap),
>> +                                               -1, -1);
>> +         case MAGICNUMBER_ICE_TRANSIENT:
>> +            return InternalEntryFactory.create(k, v,
>> +                                               -1, -1,
>> +                                               readUnsignedLong(in), 
>> (Long) unmarshallObject(in, refMap));
>> +         case MAGICNUMBER_ICE_TRANSIENT_MORTAL:
>> +            return InternalEntryFactory.create(k, v,
>> +                                               readUnsignedLong(in), 
>> (Long) unmarshallObject(in, refMap),
>> +                                               readUnsignedLong(in), 
>> (Long) unmarshallObject(in, refMap));
>> +      }
>> +      throw new IllegalArgumentException("Unknown magic number " + 
>> magic);
>> +   }
>> +
>> +   private InternalCacheValue unmarshallInternalCacheValue(byte 
>> magic, ObjectInput in, UnmarshalledReferences refMap) throws 
>> IOException, ClassNotFoundException {
>> +      Object v = unmarshallObject(in, refMap);
>> +      switch (magic) {
>> +         case MAGICNUMBER_ICE_IMMORTAL:
>> +            return InternalEntryFactory.createValue(v);
>> +         case MAGICNUMBER_ICE_MORTAL:
>> +            return InternalEntryFactory.createValue(v,
>> +                                                    
>> readUnsignedLong(in), (Long) unmarshallObject(in, refMap),
>> +                                                    -1, -1);
>> +         case MAGICNUMBER_ICE_TRANSIENT:
>> +            return InternalEntryFactory.createValue(v,
>> +                                                    -1, -1,
>> +                                                    
>> readUnsignedLong(in), (Long) unmarshallObject(in, refMap));
>> +         case MAGICNUMBER_ICE_TRANSIENT_MORTAL:
>> +            return InternalEntryFactory.createValue(v,
>> +                                                    
>> readUnsignedLong(in), (Long) unmarshallObject(in, refMap),
>> +                                                    
>> readUnsignedLong(in), (Long) unmarshallObject(in, refMap));
>> +      }
>> +      throw new IllegalArgumentException("Unknown magic number " + 
>> magic);
>> +   }
>> +
>>    private FastCopyHashMap unmarshallFastCopyHashMap(ObjectInput in, 
>> UnmarshalledReferences refMap) throws IOException, 
>> ClassNotFoundException {
>>       FastCopyHashMap map = new FastCopyHashMap();
>>       populateFromStream(in, refMap, map);
>>
>> _______________________________________________
>> infinispan-commits mailing list
>> infinispan-commits at lists.jboss.org
>> https://lists.jboss.org/mailman/listinfo/infinispan-commits
> 
> -- 
> Manik Surtani
> manik at jboss.org
> Lead, Infinispan
> Lead, JBoss Cache
> http://www.infinispan.org
> http://www.jbosscache.org
> 
> 
> 
> 
> 
> 
> ------------------------------------------------------------------------
> 
> _______________________________________________
> infinispan-dev mailing list
> infinispan-dev at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/infinispan-dev

-- 
Galder Zamarreño
Sr. Software Maintenance Engineer
JBoss, a division of Red Hat



More information about the infinispan-dev mailing list