[infinispan-dev] Using marshaller internally in MarshalledValue and Marshalling reentrancy

Manik Surtani manik at jboss.org
Thu Jun 4 08:03:34 EDT 2009


On 4 Jun 2009, at 12:08, Galder Zamarreno wrote:

> Hi,
>
> I'm trying to move MarshalledValue to use an injected Marshaller  
> rather than relying on standard serialization and this is causing me  
> a small problem:
>
> One of the trade offs when making JBoss Marshalling marshaller/ 
> unmarshaller a thread local in JBoss Marshaller is reentrancy.
>
> When marshalling a MarshalledValue, we call start() on the  
> marshaller and then we'd call marshallerValue.getRaw(). The most  
> reasonable implementation using an injected marshaller would call:
>
> raw = marshaller.objectToBuffer(instance).getBuf();
>
> By calling oTB again, you're calling start on the marshaller below  
> and since this is a thread local, this is exactly the same instance  
> and you get issues.
>
> I don't think JBoss Marshalling marshaller/unmarshaller are meant to  
> be reentrant and this is not my intention.
>
> A second option would be to simply create a new marshaller in  
> MarshalledValue.getRaw() but this means some initialisation that  
> involves reflection, so this is no good.
>
> The third option, an my preferred one, would be to add a boolean  
> parameter to Marshaller.startObjectOutput() called cached. Based on  
> this parameter, you could either get the marshaller from the thread  
> local or if false, get a new one from the factory. This would get  
> around the issue and makes the API more flexible coping with  
> reentrant marshalling while for the rest of cases, taking advantage  
> of the performance gains from using thread locals. The code in  
> marshallerValue.getRaw() would then look like this:
>
> ExposedByteArrayOutputStream baos = new  
> ExposedByteArrayOutputStream(128);
> ObjectOutput out = marshaller.startObjectOutput(baos, false);
> try {
>  marshaller.objectToObjectStream(instance);
> } finally {
>  marshaller.finishObjectOutput(out);
> }
> raw = baos.getRawBuffer();
>
> Of course, I would document this accordingly in the API so that  
> cached is only set to false if reentrant marshalling could happen.

Option 3 makes sense to me.  Will need to be clearly documented and  
unit tested though.

Cheers
Manik

>
>
> Thoughts?
> -- 
> Galder Zamarreño
> Sr. Software Maintenance Engineer
> JBoss, a division of Red Hat
> _______________________________________________
> infinispan-dev mailing list
> infinispan-dev at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/infinispan-dev

--
Manik Surtani
manik at jboss.org
Lead, Infinispan
Lead, JBoss Cache
http://www.infinispan.org
http://www.jbosscache.org








More information about the infinispan-dev mailing list