[
https://issues.apache.org/jira/browse/TRINIDAD-1245?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Matthias Weßendorf resolved TRINIDAD-1245.
------------------------------------------
Resolution: Fixed
Fix Version/s: 1.2.10-core
Assignee: Matthias Weßendorf
> High Availability Testing Support
> ---------------------------------
>
> Key: TRINIDAD-1245
> URL: https://issues.apache.org/jira/browse/TRINIDAD-1245
> Project: MyFaces Trinidad
> Issue Type: New Feature
> Components: Archetype
> Affects Versions: 1.2.9-core
> Environment: All
> Reporter: Blake Sullivan
> Assignee: Matthias Weßendorf
> Priority: Minor
> Fix For: 1.2.10-core
>
> Attachments: Trin1245_1_2_TRUNK.patch
>
> Original Estimate: 168h
> Remaining Estimate: 168h
>
> Most Servlet Engines support fail over for high availability by replicating
> changes the the Session state to other servers. This requires that all of
> the state and substate in the Session be Serializable. If the state is not
> Serializable, the failover will fail with a SerializationException and most
> likely the Session attribute key for which Serialization failed. This poses
> several problems for framework and application developers:
> 1) An actual high-availability configuration should not be necessary to test
> that the framework and application is using Session state correctly
> 2) The Servlet specification requires that an exception be thrown immediately
> when adding setting a non Serializable attribute on the Session when the
> Servlet engine is running in high-availibility mode. This enables the
> offending code to be quickly identified for simple case, but this requires:
> a) That the server be running in such a mode, which may be a pain to configure
> b) Some Servlet engines don't implement this feature
> 3) Knowing the offending key in the Session state is not very useful if the
> value of the key is an extremely complicated structure. In particular,
> determining precisely which attribute value on which component in the
> component state structure used in Trinidad state saving is a nightmare.
> The proposal is to address the problems by:
> 1) Making it possible to run Trinidad in a mode where unserializable state
> content and sets on Session attributes are detected
> 2) When a state Serialization failure is detected, more detailed failure
> information regarding the component and attribute key and value that failed
> can be determined by rerunning with additional, but slower settings
> In order to decrease runtime overhead, the proposal is that a System property:
> org.apache.myfaces.trinidad.CHECK_STATE_SERIALIZATION
> is used to control this behavior as this allows the behavior to be determined
> a class load time.
> The behavior is controlled by passing a comma-delimited set of
> case-insensitive values on the system property:
> NONE--no state serialization checks are performed (the default)
> ALL--perform all available tests (unless NONE is also specified, in which
> case NONE takes precedence)
> SESSION-Wrap the Session Map returned by the ExternalContext to test that
> only Serializable objects are placed in the Session Map, throwing a
> CastCastException if the Object is not Serializable
> TREE--aggressively attempt to serialize the component state during state
> saving and throw an exception if serialization fails
> COMPONENT--aggressively attempt to serialize each component subtree's state
> during state saving in order to identify the problem component (slow)
> PROPERTY--aggessively attempt to serialize each property value during state
> saving in order to identify the problem property (slow)
> For high availability testing, the tester would initially start off
> validating the Session and JSF state is Serializable by setting the system
> property to:
> -Dorg.apache.myfaces.trinidad.CHECK_STATE_SERIALIZATION=session,tree
> If a JSF state serialization is detected, the test is rerun with the
> component and property flags enabled:
> -Dorg.apache.myfaces.trinidad.CHECK_STATE_SERIALIZATION=all
> Programmatic access to these flags would be on the StateUtils class:
> /**
> * Returns <code>true</code> if components should be checked for
> * serializability when when generating the view's state object.
> * <p>
> * By default component state serialization checking is off. It can be
> * enabled by setting the system property
> * <code>org.apache.myfaces.trinidad.CHECK_STATE_SERIALIZATION</code>
> * to <code>all</code> or, more rarely, adding <code>component</code> to the
> * comma-separated list of serialization checks to perform.
> * <p>
> * As property serialization checking is expensive, it is usually
> * only enabled after component tree serialization checking has detected
> * a problem. In addition, since component serialization checking only
> * detects the problem component, it is usually combined with
> * property state serialization checking either by specifying
> <code>all</code>.
> * @return
> * @see #checkComponentTreeStateSerialization
> */
> public static boolean checkComponentStateSerialization(FacesContext context)
>
> /**
> * Returns <code>true</code> if the component tree should be checked for
> * serializability when when generating the view's state object.
> * <p>
> * By default component tree state serialization checking is off. It can be
> * enabled by setting the system property
> * <code>org.apache.myfaces.trinidad.CHECK_STATE_SERIALIZATION</code>
> * to <code>all</code> or, more commonly, adding <code>tree</code> to the
> * comma-separated list of serialization checks to perform.
> * <p>
> * Because unserializable objects defeat fail-over, it is important to
> * check for serializability when testing applications. While component
> * tree state serializability checking isn't cheap, it is much faster to
> * initially only enable checking of the component tree and then switch
> * to <code>all</code> testing to determine the problem component and
> * property when the component tree testing determines a problem.
> * @return
> * @see #checkComponentStateSerialization
> */
> public static boolean checkComponentTreeStateSerialization(FacesContext
> context)
>
> /**
> * Returns <code>true</code> if Object written to the SessionMap should be
> checked for
> * Serializability when <code>put</code> is called.
> * <p>
> * Configuring this property allows this aspect of high-availability to be
> tested without
> * configuring the server to run in high-availability mode.
> * <p>
> * By default session serialization checking is off. It can be
> * enabled by setting the system property
> * <code>org.apache.myfaces.trinidad.CHECK_STATE_SERIALIZATION</code>
> * to <code>all</code> or, more commonly, adding <code>session</code> to the
> * comma-separated list of serialization checks to perform.
> * @return
> * @see #checkComponentStateSerialization
> * @see #checkComponentTreeStateSerialization
> */
> public static boolean checkSessionSerialization(ExternalContext extContext)
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.