[JBossCache] - Re: Buddy Replication and data consistency
by bstansberry@jboss.com
If you do a put with a local option, it won't replicate to anyone, so the node that did the replication will be out of sync with the buddies.
As to multiple nodes simultaneously doing a put on the same node, here's what happens. I'm assuming the node already exists.
Assume no tx running. The data in question is stored on server0 and it's buddy group.
1) You do a put() on server 1. Simultaneously a put() on server0.
2) DataGravitatorInterceptor.1 and DataGravitatorInterceptor.2 both see the node doesn't exist; fetches the node's data from across the cluster.
3) DataGravitatorInterceptor.1 and .2 take the data and do a put (not local). This replicates the data to its buddies. No tx, so no lock is held on the node. At this point there are three copies of the data -- the server0 group's, the server1 group's and the server2 group's.
4) DataGravitatorInterceptor.1 and .2 send a cleanup call to the cluster. Any copy of the data not associated with the sending server's buddy group is removed.
5) The original puts go through.
The end result here will very much depend on how things get interleaved. With REPL_SYNC you could end up with a TimeoutException in Step 4 as server1 and server2 tell each other to remove the data and deadlock. Or server1 completes steps 3-5 and then server 2 executes steps 3-5, in which case server 2's change wins. Or both complete step 3, then server 1 completes step 4 (so the server 0 and server 2 copies are gone), then server 2 completes step 4 (so the server 1 copy is gone). Then the both complete step 5, resulting in 2 sets of data, each of which only has the key/value pair included in the put.
Now, if there is a tx in place:
The put() in step 3 is done in a tx, so a write lock will be held on the node on each server until the tx commits. The put will not replicate until the tx commits.
The removes in step 4 will also not be broadcast until the tx commits.
The put in step 5 will not be replicated until the tx commits.
The fact that the WL from step 3 is held should make steps 3-5 atomic. If it's REPL_SYNC, you have two servers trying to write to the same node, so it's possible when the tx tries to commit you'll get a TimeoutExceptio due to a lock conflict. With REPL_ASYNC, the later tx will win; the step 5 put from the earlier tx will be lost.
But.. while writing this I'm pretty sure I've spotted a bug in the tx case. The step 4 cleanup call gets bundled together with the other tx changes and therefore only gets replicated to the server's buddy's, not to the whole cluster.
View the original post : http://www.jboss.com/index.html?module=bb&op=viewtopic&p=3994763#3994763
Reply to the post : http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=3994763
19 years, 4 months
[JBoss Seam] - Seam 1.1.0.GA with IceFaces 1.5.1 - updating existing entity
by scotttam
Seam 1.1.0.GA
Icefaces 1.5.1
JBoss-AS 4.0.5.GA
MySQL 5.0.27
I created a basic Seam application following the instructions in the Seam documentation. I have 2 simple tables in a MySQL database for testing. I ran the following commands to create the basic application:
seam setup
seam new-project
seam generate-entities
After importing into Eclipse, deploying and starting the AS, the generated application works as expected. I can see the list of existing entities, create new ones and edit existing ones.
Now, I want to integrate with Icefaces. So, I followed the documentation from the Icefaces site:
http://support.icesoft.com/jive/servlet/KbServlet/download/623-102-847/Se...
When I redeploy, the list and creating a new entity works but selecting an existing item for update is not working. When I choose the Select link, it brings me to a page where all the fields are either 0 or empty, acting as if the id for the entity object does not exist.
Here's my web.xml:
| <?xml version="1.0" ?>
|
| <web-app version="2.5"
| xmlns="http://java.sun.com/xml/ns/javaee"
| xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
| xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
|
| <context-param>
| <param-name>javax.faces.CONFIG_FILES</param-name>
| <param-value>/WEB-INF/navigation.xml</param-value>
| </context-param>
|
| <listener>
| <listener-class>org.jboss.seam.servlet.SeamListener</listener-class>
| </listener>
|
| <listener>
| <listener-class>org.apache.myfaces.webapp.StartupServletContextListener</listener-class>
| </listener>
|
| <context-param>
| <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
| <param-value>client</param-value>
| </context-param>
|
| <context-param>
| <param-name>facelets.DEVELOPMENT</param-name>
| <param-value>true</param-value>
| </context-param>
|
| <context-param>
| <param-name>javax.faces.DEFAULT_SUFFIX</param-name>
| <param-value>.xhtml</param-value>
| </context-param>
|
| <context-param>
| <param-name>com.icesoft.faces.actionURLSuffix</param-name>
| <param-value>.seam</param-value>
| </context-param>
|
| <context-param>
| <param-name>com.icesoft.faces.synchronousUpdate</param-name>
| <param-value>true</param-value>
| </context-param>
|
| <context-param>
| <param-name>com.icesoft.faces.doJSFStateManagement</param-name>
| <param-value>true</param-value>
| </context-param>
|
| <filter>
| <filter-name>Seam Exception Filter</filter-name>
| <filter-class>org.jboss.seam.servlet.SeamExceptionFilter</filter-class>
| </filter>
|
| <filter-mapping>
| <filter-name>Seam Exception Filter</filter-name>
| <url-pattern>/*</url-pattern>
| </filter-mapping>
|
| <servlet>
| <servlet-name>Faces Servlet</servlet-name>
| <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
| <load-on-startup>1</load-on-startup>
| </servlet>
|
| <!-- ICEFACES -->
| <servlet>
| <servlet-name>Blocking Servlet</servlet-name>
| <servlet-class>com.icesoft.faces.webapp.xmlhttp.BlockingServlet</servlet-class>
| <load-on-startup> 1 </load-on-startup>
| </servlet>
|
| <servlet>
| <servlet-name>Persistent Faces Servlet</servlet-name>
| <servlet-class>com.icesoft.faces.webapp.xmlhttp.PersistentFacesServlet</servlet-class>
| <load-on-startup>1</load-on-startup>
| </servlet>
|
| <servlet-mapping>
| <servlet-name>Persistent Faces Servlet</servlet-name>
| <url-pattern>/xmlhttp/*</url-pattern>
| </servlet-mapping>
|
| <servlet-mapping>
| <servlet-name>Persistent Faces Servlet</servlet-name>
| <url-pattern>/xmlhttp/*</url-pattern>
| </servlet-mapping>
|
| <servlet-mapping>
| <servlet-name>Persistent Faces Servlet</servlet-name>
| <url-pattern>*.iface</url-pattern>
| </servlet-mapping>
|
| <!-- Blocking Servlet Mapping -->
| <servlet-mapping>
| <servlet-name>Blocking Servlet</servlet-name>
| <url-pattern>/block/*</url-pattern>
| </servlet-mapping>
| <servlet-mapping>
| <servlet-name>Persistent Faces Servlet</servlet-name>
| <url-pattern>*.seam</url-pattern>
| </servlet-mapping>
| </web-app>
|
faces-config.xml
| <?xml version='1.0' encoding='UTF-8'?>
| <!DOCTYPE faces-config PUBLIC
| "-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.1//EN"
| "http://java.sun.com/dtd/web-facesconfig_1_1.dtd">
|
| <faces-config>
| <application>
| <message-bundle>messages</message-bundle>
| <view-handler>com.icesoft.faces.facelets.D2DSeamFaceletViewHandler</view-handler>
| </application>
|
| <managed-bean>
| <managed-bean-name>highlight</managed-bean-name>
| <managed-bean-class>com.icesoft.faces.context.effects.Highlight</managed-bean-class>
| <managed-bean-scope>application</managed-bean-scope>
| </managed-bean>
|
| <managed-bean>
| <managed-bean-name>timeZoneBean</managed-bean-name>
| <managed-bean-class>com.test.par.TimeZoneBean</managed-bean-class>
| <managed-bean-scope>session</managed-bean-scope>
| </managed-bean>
|
| <!-- Seam transaction management -->
| <lifecycle>
| <phase-listener>org.jboss.seam.jsf.TransactionalSeamPhaseListener</phase-listener>
| </lifecycle>
|
| <!-- No Seam transaction management -->
| <!--
| <lifecycle>
| <phase-listener>org.jboss.seam.jsf.SeamPhaseListener</phase-listener>
| </lifecycle>
| -->
| </faces-config>
|
I also updated the build.xml to include the icefaces jars and replacing the facelets jar with the icefaces one:
| <?xml version="1.0"?>
|
| <project name="myproject" default="deploy" basedir=".">
|
| <!-- Give user a chance to override without editing this file or typing -D -->
| <property file="${basedir}/build.properties" />
|
| <!-- set global properties for this build -->
| <property name="project.name" value="myproject"/>
| <property name="dist.dir" value="dist" />
| <property name="src.java.dir" value="src" />
| <property name="lib.dir" value="lib" />
| <property name="ear.dir" value="exploded-archives/${project.name}.ear" />
| <property name="jar.dir" value="exploded-archives/${project.name}.jar" />
| <property name="war.dir" value="exploded-archives/${project.name}.war" />
| <property name="test.dir" value="build/test" />
| <property name="embedded-ejb3.dir" value="${basedir}/embedded-ejb/conf" />
| <property name="deploy.dir" value="${jboss.home}/server/default/deploy" />
| <property name="ear.deploy.dir" value="${deploy.dir}/${project.name}.ear" />
| <property name="jar.deploy.dir" value="${ear.deploy.dir}/${project.name}.jar" />
| <property name="war.deploy.dir" value="${ear.deploy.dir}/${project.name}.war" />
| <property name="testng.jar" value="${basedir}/lib/testng-4.5.1-jdk15.jar" />
| <property name="javac.debug" value="true" />
| <property name="javac.deprecation" value="false" />
|
| <fileset id="lib" dir="${lib.dir}">
| <include name="*.jar" />
| </fileset>
|
| <path id="build.classpath">
| <fileset refid="lib" />
| </path>
|
| <target name="init" description="Initialize the build">
| <mkdir dir="${jar.dir}" />
| <mkdir dir="${ear.dir}" />
| <mkdir dir="${war.dir}" />
| <mkdir dir="${dist.dir}" />
| </target>
|
| <target name="compile" depends="init"
| description="Compile the Java source code"
| unless="eclipse.running">
| <javac classpathref="build.classpath"
| destdir="${jar.dir}"
| debug="${javac.debug}"
| deprecation="${javac.deprecation}"
| nowarn="on">
| <src path="${src.java.dir}" />
| </javac>
| </target>
|
| <target name="jar" depends="compile"
| description="Build the distribution .jar file">
| <copy todir="${jar.dir}">
| <fileset dir="${basedir}/resources">
| <include name="seam.properties" />
| <include name="import.sql" />
| </fileset>
| </copy>
| <copy todir="${jar.dir}/META-INF">
| <fileset dir="${basedir}/resources/META-INF">
| <include name="ejb-jar.xml" />
| <include name="persistence.xml" />
| </fileset>
| </copy>
| </target>
|
| <target name="war" depends="compile"
| description="Build the distribution .war file">
| <copy todir="${war.dir}">
| <fileset dir="${basedir}/view" />
| </copy>
| <copy todir="${war.dir}/WEB-INF">
| <fileset dir="${basedir}/resources/WEB-INF">
| <include name="*.*"/>
| <include name="classes/**/*.*"/>
| <exclude name="classes/**/*.class"/>
| </fileset>
| <filterset>
| <filter token="jndiPattern" value="${project.name}/#{ejbName}/local" />
| <filter token="embeddedEjb" value="false" />
| </filterset>
| </copy>
| <copy todir="${war.dir}/WEB-INF">
| <fileset dir="${basedir}/resources/WEB-INF">
| <include name="lib/*.*"/>
| <include name="classes/**/*.class"/>
| </fileset>
| </copy>
| <copy todir="${war.dir}/WEB-INF/lib">
| <fileset dir="${lib.dir}">
| <include name="icefaces.jar" />
| <include name="icefaces-comps.jar" />
| <include name="icefaces-facelets.jar" />
| <include name="el-api.jar" />
| <include name="el-ri.jar" />
| <include name="jboss-seam-debug.jar" />
| <include name="jboss-seam-ui.jar" />
| </fileset>
| </copy>
| <copy todir="${war.dir}/WEB-INF/classes">
| <fileset dir="${basedir}/resources">
| <include name="messages*.properties"/>
| </fileset>
| </copy>
| </target>
|
| <target name="ear" description="Build the EAR">
| <copy todir="${ear.dir}">
| <fileset dir="${basedir}/resources">
| <include name="*jpdl.xml" />
| <include name="hibernate.cfg.xml" />
| <include name="jbpm.cfg.xml" />
| </fileset>
| <fileset dir="${lib.dir}">
| <include name="jboss-seam.jar" />
| <include name="jbpm*.jar" />
| <include name="el-*.jar" />
| </fileset>
| </copy>
| <copy todir="${ear.dir}/META-INF">
| <fileset dir="${basedir}/resources/META-INF">
| <include name="application.xml" />
| <include name="jboss-app.xml" />
| </fileset>
| </copy>
| </target>
|
| <target name="archive" depends="jar,war,ear"
| description="Package the archives">
| <jar jarfile="${dist.dir}/${project.name}.jar" basedir="${jar.dir}"/>
| <jar jarfile="${dist.dir}/${project.name}.war" basedir="${war.dir}"/>
| <jar jarfile="${dist.dir}/${project.name}.ear">
| <fileset dir="${ear.dir}"/>
| <fileset dir="${dist.dir}">
| <include name="${project.name}.jar"/>
| <include name="${project.name}.war"/>
| </fileset>
| </jar>
| </target>
|
| <target name="datasource">
| <fail unless="jboss.home">jboss.home not set</fail>
| <copy todir="${deploy.dir}">
| <fileset dir="${basedir}/resources">
| <include name="${project.name}-ds.xml" />
| </fileset>
| </copy>
| </target>
|
| <target name="explode" depends="jar,war,ear,datasource"
| description="Deploy the exploded archive">
| <fail unless="jboss.home">jboss.home not set</fail>
|
| <mkdir dir="${jar.deploy.dir}"/>
| <mkdir dir="${war.deploy.dir}"/>
|
| <copy todir="${jar.deploy.dir}">
| <fileset dir="${jar.dir}"/>
| </copy>
| <copy todir="${war.deploy.dir}">
| <fileset dir="${war.dir}"/>
| </copy>
| <copy todir="${ear.deploy.dir}">
| <fileset dir="${ear.dir}"/>
| </copy>
| </target>
|
| <target name="unexplode" description="Undeploy the exploded archive">
| <delete failonerror="no">
| <fileset dir="${ear.deploy.dir}">
| <exclude name="**/*.jar"/>
| </fileset>
| </delete>
| <delete file="${deploy.dir}/${project.name}-ds.xml" failonerror="no"/>
| <delete dir="${ear.deploy.dir}" failonerror="no"/>
| </target>
|
| <target name="restart" depends="explode" description="Restart the exploded archive">
| <touch file="${ear.deploy.dir}/META-INF/application.xml"/>
| </target>
|
| <target name="deploy" depends="archive,datasource" description="Deploy to JBoss AS">
| <fail unless="jboss.home">jboss.home not set</fail>
| <copy todir="${deploy.dir}" file="${dist.dir}/${project.name}.ear" />
| </target>
|
| <target name="undeploy" description="Undeploy the example from JBoss">
| <delete file="${deploy.dir}/${project.name}.ear" />
| <delete file="${deploy.dir}/${project.name}-ds.xml" />
| </target>
|
| <target name="clean" description="Cleans up the build directory">
| <delete dir="${dist.dir}" />
| <delete dir="${test.dir}" />
| <delete dir="${ear.dir}" />
| <delete dir="${war.dir}" />
| <delete>
| <fileset dir="${jar.dir}">
| <exclude name="**/*.class" if="eclipse.running"/>
| </fileset>
| </delete>
| </target>
|
| <target name="test" depends="jar,war,ear" description="Run the tests">
|
| <taskdef resource="testngtasks" classpath="${testng.jar}" />
| <copy todir="${test.dir}">
| <fileset dir="${basedir}/resources" />
| <fileset dir="${jar.dir}" />
| </copy>
|
| <copy todir="${test.dir}/WEB-INF">
| <fileset dir="${war.dir}/WEB-INF">
| <exclude name="**/*.jar" />
| </fileset>
| </copy>
|
| <copy todir="${test.dir}" flatten="true">
| <fileset dir="${src.java.dir}">
| <include name="**/*Test.xml" />
| </fileset>
| </copy>
|
| <testng outputdir="${basedir}/testng-report">
| <classpath path="${test.dir}" />
| <classpath path="${embedded-ejb3.dir}" />
| <classpath refid="build.classpath" />
| <xmlfileset dir="${test.dir}" includes="*Test.xml" />
| </testng>
|
| </target>
|
| </project>
|
Any ideas?
View the original post : http://www.jboss.com/index.html?module=bb&op=viewtopic&p=3994761#3994761
Reply to the post : http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=3994761
19 years, 4 months