This is the synchronous replication mode configuration that we recommend.
Besides the change in cache mode from REPL_ASYNC to REPL_SYNC, we have also commented out
<!--FC max_credits="10000000" down_thread="false" up_thread="false" min_threshold="0.20"/-->
For heavy duty JBossCache synchronous replication mode, flow control (FC) may cause deadlocks due to the fact the the up() call (request) will also invoke the down() call (response), and the down() call may get blocked due to insufficient credits. Which means new credits will not be accepted because we're stuck in the up() call.
We recommend not using FC for sync repl, because sync repl incurs the network round trip and therefore is much slower than async repl. The RTT is a natural 'throttle' if you so wish.
Once we have the Multiplexer from JGroups (2.4), we can simply define 2 stacks in stacks.xml, e.g. "sync_repl" and "async_repl" and refer to the right one from tc5-cluster-service, depending on cache mode.
Once we have the threadless stack, and async messages, we can add FC back in because FC credit replenishment messages will be tagged as 'async', and therefore delivered out-of-band, so we won't run into the flow control hang issue.
<?xml version="1.0" encoding="UTF-8"?> <!-- ===================================================================== --> <!-- --> <!-- Customized TreeCache Service Configuration for Tomcat 5 Clustering --> <!-- --> <!-- ===================================================================== --> <server> <!-- ==================================================================== --> <!-- Defines TreeCache configuration --> <!-- ==================================================================== --> <mbean code="org.jboss.cache.TreeCache" name="jboss.cache:service=TomcatClusteringCache"> <depends>jboss:service=Naming</depends> <depends>jboss:service=TransactionManager</depends> <!-- Configure the TransactionManager --> <attribute name="TransactionManagerLookupClass">org.jboss.cache.JBossTransactionManagerLookup</attribute> <!-- Isolation level : SERIALIZABLE REPEATABLE_READ (default) READ_COMMITTED READ_UNCOMMITTED NONE --> <attribute name="IsolationLevel">REPEATABLE_READ</attribute> <!-- Valid modes are LOCAL, REPL_ASYNC and REPL_SYNC --> <attribute name="CacheMode">REPL_SYNC</attribute> <!-- Name of cluster. Needs to be the same for all clusters, in order to find each other --> <attribute name="ClusterName">Tomcat-Cluster</attribute> <!-- JGroups protocol stack properties. Can also be a URL, e.g. file:/home/bela/default.xml <attribute name="ClusterProperties"></attribute> --> <attribute name="ClusterConfig"> <config> <UDP mcast_addr="${jboss.partition.udpGroup:230.1.2.7}" mcast_port="45589" ucast_recv_buf_size="20000000" ucast_send_buf_size="640000" mcast_recv_buf_size="25000000" mcast_send_buf_size="640000" loopback="false" max_bundle_size="64000" max_bundle_timeout="30" use_incoming_packet_handler="false" use_outgoing_packet_handler="false" ip_ttl="2" down_thread="false" up_thread="false" enable_bundling="false"></UDP> <PING timeout="2000" down_thread="false" up_thread="false" num_initial_members="3"></PING> <MERGE2 max_interval="100000" down_thread="false" up_thread="false" min_interval="20000"></MERGE2> <FD_SOCK down_thread="false" up_thread="false"></FD_SOCK> <VERIFY_SUSPECT timeout="1500" up_thread="false" down_thread="false"></VERIFY_SUSPECT> <pbcast.NAKACK max_xmit_size="55000" use_mcast_xmit="false" gc_lag="50" retransmit_timeout="100,200,300,600,1200,2400,4800" down_thread="false" up_thread="false" discard_delivered_msgs="true"></pbcast> <UNICAST timeout="300,600,1200,2400,3600" down_thread="false" up_thread="false"></UNICAST> <pbcast.STABLE stability_delay="1000" desired_avg_gossip="50000" down_thread="false" up_thread="false" max_bytes="400000"></pbcast> <pbcast.GMS print_local_addr="true" join_timeout="3000" down_thread="false" up_thread="false" join_retry_timeout="2000" shun="true"></pbcast> <!-- Not needed if running synchronous mode under high load --> <!--FC max_credits="10000000" down_thread="false" up_thread="false" min_threshold="0.20"/--> <FRAG2 frag_size="55000" down_thread="false" up_thread="false"></FRAG2> <pbcast.STATE_TRANSFER down_thread="false" up_thread="false"></pbcast> </config> </attribute> <!-- Max number of milliseconds to wait for a lock acquisition --> <attribute name="LockAcquisitionTimeout">15000</attribute> </mbean> </server>
Referenced by:
Comments