prevent NPE in worker thread when shutdown
[voldemort/jeffpc.git] / build.xml
blob76c8e8d9f86296dbad24b9d1e2ee506b1b9652d1
1 <?xml version="1.0"?>
3 <project name="voldemort" basedir="." default="all">
4   <property file="build.properties" />
6   <property name="name" value="voldemort" />
7   <property name="display.name" value="Voldemort" />
8   <property name="author" value="Jay Kreps, Roshan Sumbaly, Alex Feinberg, Bhupesh Bansal, Lei Gao, Chinmay Soman, Vinoth Chandar, Zhongjie Wu" />
9   <property environment="env" />
11   <path id="main-classpath">
12     <fileset dir="${lib.dir}">
13       <include name="*.jar" />
14     </fileset>
15     <pathelement path="${classes.dir}" />
16   </path>
18   <!-- set the build number based on environment variable, otherwise blank -->
19   <property environment="env" description="System environment variables (including those set by Hudson)"/>
20   <condition property="curr.release.snapshot" value="${curr.release}-snapshot-${env.BUILD_NUMBER}" else="${curr.release}">
21        <and>
22           <isset property="env.BUILD_NUMBER" />
23           <not>
24               <equals arg1="" arg2="${env.BUILD_NUMBER}" trim="yes"/>
25           </not>
26        </and>
27   </condition>
29   <path id="contrib-classpath">
30     <pathelement path="${resources.dir}" />
31     <fileset dir="${dist.dir}">
32       <include name="${name}-${curr.release}.jar" />
33     </fileset>
34     <fileset dir="${contrib.root.dir}">
35       <include name="**/*.jar" />
36     </fileset>
37     <path refid="test-classpath" />
38   </path>
40   <path id="test-classpath">
41     <pathelement path="${resources.dir}" />
42     <pathelement path="${env.VOLD_TEST_JARS}" />
43     <path refid="main-classpath" />
44     <pathelement path="${testclasses.dir}" />
45   </path>
47   <path id="contrib-test-classpath">
48     <path refid="main-classpath" />
49     <path refid="contrib-classpath" />
50     <fileset dir="${dist.dir}">
51       <include name="${name}-contrib-${curr.release}.jar" />
52     </fileset>
53     <pathelement path="${testclasses.dir}" />
54   </path>
56   <macrodef name="replace-dir">
57     <attribute name="dir" />
58     <sequential>
59       <delete dir="@{dir}" />
60       <mkdir dir="@{dir}" />
61     </sequential>
62   </macrodef>
64   <target name="all" depends="clean, jar, test, contrib-jar, srcjar" description="Build all artifacts." />
66   <target name="clean" description="Delete generated files.">
67     <delete dir="${dist.dir}" />
68     <replace-dir dir="${javadoc.dir}" />
69   </target>
71   <target name="build" description="Compile main source tree java files">
72     <replace-dir dir="${classes.dir}" />
73     <!-- copy non-java files to classes dir to load from classpath -->
74     <copy todir="${classes.dir}">
75       <fileset dir="${java.dir}">
76         <exclude name="**/*.java" />
77         <exclude name="**/*.html" />
78         <exclude name="**/log4j.properties" />
79       </fileset>
80     </copy>
81     <replace-dir dir="META-INF" />
82         <echo message="creating manifest"/>
83     <manifest file="META-INF/MANIFEST.MF">   
84       <attribute name="Voldemort-Implementation-Version" value="${curr.release}" />
85       <attribute name="Implementation-Title" value="Voldemort" />
86       <attribute name="Implementation-Version" value="${curr.release}" />
87       <attribute name="Implementation-Vendor" value="LinkedIn" />
88     </manifest>
89     <!-- place to put log4j.properties -->
90     <replace-dir dir="${resources.dir}"/>
91     <copy file="${java.dir}/log4j.properties" todir="${resources.dir}"/>
92     <javac destdir="${classes.dir}" target="${javac.version}" source="${javac.version}" debug="true" deprecation="false" failonerror="true" includeantruntime="false">
93       <src path="${java.dir}" />
94       <classpath refid="main-classpath" />
95     </javac>
96   </target>
98   <target name="buildtest" description="Compile test classes">
99     <replace-dir dir="${testclasses.dir}" />
100     <copy todir="${testclasses.dir}">
101       <fileset dir="${commontestsrc.dir}">
102         <exclude name="**/*.java" />
103         <exclude name="**/*.html" />
104       </fileset>
105     </copy>
106     <copy todir="${testclasses.dir}">
107       <fileset dir="${unittestsrc.dir}">
108         <exclude name="**/*.java" />
109         <exclude name="**/*.html" />
110       </fileset>
111     </copy>
112     <javac destdir="${testclasses.dir}" target="${javac.version}" source="${javac.version}" debug="true" deprecation="false" failonerror="true" includeantruntime="false">
113       <src path="${unittestsrc.dir}" />
114       <src path="${inttestsrc.dir}" />
115       <src path="${commontestsrc.dir}" />
116       <src path="${longtestsrc.dir}" />
117       <classpath refid="main-classpath" />
118     </javac>
119   </target>
121   <target name="test" depends="build, buildtest" description="Build test jar file">
122     <jar destfile="${dist.dir}/${name}-test-${curr.release}.jar">
123       <fileset dir="${testclasses.dir}" />
124     </jar>
125   </target>
127   <!--
128     Use protoc version 2.3.0 to recompile by hand:
129       https://code.google.com/p/protobuf/downloads/detail?name=protobuf-2.3.0.tar.gz&can=2&q=
131     Below, '<DASH/>' means '-'. This was done to nest double-dashes within xml comment.
133   <target name="protobuff" description="Generate source files from .proto files">
134     <pathconvert property="proto.sources" pathsep=" ">
135       <path id="proto-files">
136         <fileset dir="${protobuff.dir}" />
137       </path>
138     </pathconvert>
140     <property name="proto.path" location="${protobuff.dir}"/>
141     <property name="javaout.path" location="${java.dir}"/>
142     <property name="pythonout.path" location="${python.proto.dir}"/>
143     <exec executable="protoc" failonerror="true">
144       <arg value="<DASH/><DASH/>proto_path=${proto.path}"/>
145       <arg value=""<DASH/><DASH/>java_out=${javaout.path}"/>
146       <arg value=""<DASH/><DASH/>python_out=${pythonout.path}"/>
147       <arg line="${proto.sources}"/>
148     </exec>
149   </target>
150   -->
152   <target name="jar" depends="build" description="Build server jar file">
153     <jar destfile="${dist.dir}/${name}-${curr.release}.jar"  manifest="META-INF/MANIFEST.MF">
154       <fileset dir="${classes.dir}">
155         <include name="**/*.*" />
156       </fileset>
157       <!-- include xsds -->
158       <fileset dir="${java.dir}">
159         <include name="**/*.xsd" />
160       </fileset>
161         
162         <fileset dir=".">
163                         <include name="META-INF/MANIFEST.MF" />
164       </fileset>
165     </jar>
166   </target>
168   <target name="srcjar" description="Build source jar file">
169     <mkdir dir="${dist.dir}" />
170     <jar destfile="${dist.dir}/${name}-${curr.release}-src.jar">
171       <fileset dir="${java.dir}">
172         <include name="**/*.java" />
173       </fileset>
174     </jar>
175   </target>
177   <target name="alljar" depends="build, contrib-build" description="Build a jar file that includes all contrib code.">
178     <jar destfile="${dist.dir}/${name}-${curr.release}-all.jar">
179       <fileset dir="${classes.dir}">
180         <include name="**/*.*" />
181       </fileset>
182       <fileset dir="${contrib.classes.dir}">
183         <include name="**/*.*" />
184       </fileset>
185       <!-- include xsds -->
186       <fileset dir="${java.dir}">
187         <include name="**/*.xsd" />
188       </fileset>
189     </jar>
190   </target>
192   <target name="war" depends="build" description="Build server war file">
193     <war destfile="${dist.dir}/${name}.war" webxml="web.xml" basedir="${classes.dir}">
194       <classes dir="${classes.dir}"/>
195       <lib dir="${lib.dir}">
196         <exclude name="${lib.dir}/servlet-api*.jar"/>
197         <exclude name="${lib.dir}/src/**"/>
198       </lib>
199     </war>
200   </target>
202   <target name="contrib-build" depends="build, buildtest" description="Compile contrib packages (java and test) ">
203     <replace-dir dir="${contrib.classes.dir}" />
204     <javac destdir="${contrib.classes.dir}" target="${javac.version}" source="${javac.version}" debug="true" deprecation="false" failonerror="true" includeantruntime="false">
205       <src path="${contrib.root.dir}" />
206       <src path="${contrib.root.dir}" />
207       <classpath refid="main-classpath" />
208       <classpath refid="contrib-classpath" />
209     </javac>
210     <copy todir="${contrib.classes.dir}">
211       <fileset dir="${contrib.root.dir}/ec2-testing/resources" />
212     </copy>
213   </target>
215   <target name="contrib-jar" depends="contrib-build" description="Build contrib jar file">
216     <jar destfile="${dist.dir}/${name}-contrib-${curr.release}.jar">
217       <fileset dir="${contrib.classes.dir}">
218         <include name="**/*.*" />
219       </fileset>
220     </jar>
221   </target>
223   <target name="contrib-srcjar" description="Build contrib source jar file">
224     <mkdir dir="${dist.dir}" />
225     <jar destfile="${dist.dir}/${name}-contrib-${curr.release}-src.jar">
226       <fileset dir="${contrib.root.dir}/**/java">
227         <include name="**/*.java" />
228       </fileset>
229     </jar>
230   </target>
232   <target name="contrib-junit" depends="contrib-jar" description="Run contrib junit tests except EC2 and Krati tests.">
233     <replace-dir dir="${contribtestreport.dir}" />
234     <replace-dir dir="${contribtesthtml.dir}" />
235     <junit printsummary="yes" maxmemory="2048m" showoutput="true" failureProperty="test.failure">
236       <classpath refid="contrib-test-classpath" />
237       <formatter type="xml" />
238       <batchtest fork="yes" todir="${contribtestreport.dir}">
239         <fileset dir="${contrib.classes.dir}">
240           <include name="**/*Test.class" />
241           <exclude name="**/*PerformanceTest.class" />
242           <exclude name="**/*RemoteTest.class" />
243           <exclude name="**/Ec2*Test.class" />
244           <exclude name="**/Krati*Test.class" />
245         </fileset>
246       </batchtest>
247     </junit>
248     <junitreport todir="${contribtesthtml.dir}">
249       <fileset dir="${contribtestreport.dir}">
250         <include name="TEST-*.xml" />
251       </fileset>
252       <report todir="${contribtesthtml.dir}" format="frames" />
253     </junitreport>
254   </target>
256   <target name="ec2testing-junit" depends="all" description="Run EC2 testing contrib junit tests.">
257     <copy todir="${testclasses.dir}">
258       <fileset dir="${contrib.root.dir}/ec2-testing/resources" />
259     </copy>
260     <replace-dir dir="${contribtestreport.dir}" />
261     <replace-dir dir="${contribtesthtml.dir}" />
262     <junit printsummary="yes" maxmemory="2048m" showoutput="true" failureProperty="test.failure">
263       <syspropertyset>
264         <propertyref prefix="ec2" />
265       </syspropertyset>
266       <classpath refid="contrib-test-classpath" />
267       <formatter type="xml" />
268       <batchtest fork="yes" todir="${contribtestreport.dir}">
269         <fileset dir="${contrib.classes.dir}">
270           <include name="**/Ec2SmokeTest.class" />
271         </fileset>
272       </batchtest>
273     </junit>
274     <junitreport todir="${contribtesthtml.dir}">
275       <fileset dir="${contribtestreport.dir}">
276         <include name="TEST-*.xml" />
277       </fileset>
278       <report todir="${contribtesthtml.dir}" format="frames" />
279     </junitreport>
280   </target>
282   <target name="ec2testing-gossip" depends="contrib-jar" description="Run gossip tests on EC2.">
283     <copy todir="${testclasses.dir}">
284       <fileset dir="${contrib.root.dir}/ec2-testing/resources" />
285     </copy>
286     <replace-dir dir="${contribtestreport.dir}" />
287     <replace-dir dir="${contribtesthtml.dir}" />
288     <junit printsummary="yes" maxmemory="2048m" showoutput="true" failureProperty="test.failure">
289       <syspropertyset>
290         <propertyref prefix="ec2" />
291         <propertyref  prefix="log4j" />
292         <propertyref  prefix="gossip" />
293       </syspropertyset>
294       <classpath refid="contrib-test-classpath" />
295       <formatter type="xml" />
296       <batchtest fork="yes" todir="${contribtestreport.dir}">
297         <fileset dir="${contrib.classes.dir}">
298           <include name="**/Ec2GossipTest.class" />
299         </fileset>
300       </batchtest>
301     </junit>
302     <junitreport todir="${contribtesthtml.dir}">
303       <fileset dir="${contribtestreport.dir}">
304         <include name="TEST-*.xml" />
305       </fileset>
306       <report todir="${contribtesthtml.dir}" format="frames" />
307     </junitreport>
308   </target>
310   <target name="ec2testing-rebalancing" depends="contrib-jar" description="Run rebalancing tests on EC2.">
311     <copy todir="${testclasses.dir}">
312       <fileset dir="${contrib.root.dir}/ec2-testing/resources" />
313     </copy>
314     <replace-dir dir="${contribtestreport.dir}" />
315     <replace-dir dir="${contribtesthtml.dir}" />
316     <junit printsummary="yes" maxmemory="2048m" showoutput="true" failureProperty="test.failure">
317       <syspropertyset>
318         <propertyref prefix="ec2" />
319         <propertyref  prefix="log4j" />
320         <propertyref  prefix="rebalancing" />
321       </syspropertyset>
322       <classpath refid="contrib-test-classpath" />
323       <formatter type="xml" />
324       <batchtest fork="yes" todir="${contribtestreport.dir}">
325         <fileset dir="${contrib.classes.dir}">
326           <include name="**/Ec2RebalancingTest.class" />
327         </fileset>
328       </batchtest>
329     </junit>
330     <junitreport todir="${contribtesthtml.dir}">
331       <fileset dir="${contribtestreport.dir}">
332         <include name="TEST-*.xml" />
333       </fileset>
334       <report todir="${contribtesthtml.dir}" format="frames" />
335     </junitreport>
336   </target>
338   <macrodef name="create-release-artifacts">
339     <attribute name="version" />
340     <sequential>
341     <antcall target="all"/>
342     <zip destfile="${dist.dir}/${name}-@{version}.zip">
343       <zipfileset dir="." prefix="voldemort-@{version}" filemode="755" includes="bin/*"/>
344       <zipfileset dir="." prefix="voldemort-@{version}" includes="**">
345         <exclude name="${dist.dir}/*classes/"/>
346         <exclude name="bin/*"/>
347         <exclude name=".git*/**"/>
348       </zipfileset>
349     </zip>
350     <tar destfile="${dist.dir}/${name}-@{version}.tar.gz" compression="gzip" longfile="gnu">
351       <tarfileset dir="." prefix="voldemort-@{version}" filemode="755" includes="bin/*"/>
352       <tarfileset dir="." prefix="voldemort-@{version}" includes="**">
353         <exclude name="${dist.dir}/*classes/"/>
354         <exclude name="${dist.dir}/*.zip"/>
355         <exclude name="bin/*"/>
356         <exclude name=".git*/**"/>
357       </tarfileset>
358     </tar>
359     </sequential>
360   </macrodef>
362   <target name="snapshot"  description="Create a release-snapshot zip file with everything pre-built.">
363     <create-release-artifacts version="${curr.release.snapshot}" />
364   </target>
366   <target name="release" description="Create a release zip file with everything pre-built.">
367     <create-release-artifacts version="${curr.release}" />
368   </target>
370   <target name="hadoop-benchmark-jar" depends="build, contrib-build"
371     description="Build a jar file that includes all contrib code plus the necessary jars for running the hadoop benchmark.">
372     <jar destfile="${dist.dir}/hadoop-benchmark.jar">
373       <fileset dir="${classes.dir}">
374         <include name="**/*.*" />
375       </fileset>
376       <fileset dir="${contrib.classes.dir}">
377         <include name="**/*.*" />
378       </fileset>
379       <!-- include xsds -->
380       <fileset dir="${java.dir}">
381         <include name="**/*.xsd" />
382       </fileset>
383       <fileset dir="">
384         <include name="lib/jdom*.jar"/>
385         <include name="lib/google-collect*.jar"/>
386         <include name="lib/commons-lang*.jar"/>
387       </fileset>
388     </jar>
389   </target>
391   <target name="junit" depends="build, buildtest" description="Run junit tests.">
392     <replace-dir dir="${testreport.dir}" />
393     <replace-dir dir="${testhtml.dir}" />
394     <junit printsummary="yes" showoutput="true" maxmemory="2048m" timeout="1200000">
395       <classpath refid="test-classpath" />
396       <formatter type="xml" />
397       <batchtest fork="yes" todir="${testreport.dir}">
398         <fileset dir="${unittestsrc.dir}">
399           <include name="**/*Test.java" />
400           <exclude name="**/Abstract*.java" />
401         </fileset>
402       </batchtest>
403     </junit>
404     <junitreport todir="${testhtml.dir}">
405       <fileset dir="${testreport.dir}">
406         <include name="TEST-*.xml" />
407       </fileset>
408       <report todir="${testhtml.dir}" format="frames" />
409     </junitreport>
410   </target>
412   <target name="junit-long" depends="build, buildtest, junit" description="Run long junit tests that uses larger data sets than normal junit tests.">
413     <replace-dir dir="${longtestreport.dir}" />
414     <replace-dir dir="${longtesthtml.dir}" />
415     <junit printsummary="yes" showoutput="true" maxmemory="2048m" fork="yes" timeout="5400000">
416       <classpath refid="test-classpath" />
417       <formatter type="xml" />
418       <batchtest todir="${longtestreport.dir}">
419         <fileset dir="${longtestsrc.dir}">
420           <include name="**/*Test.java" />
421         </fileset>
422       </batchtest>
423     </junit>
424     <junitreport todir="${longtesthtml.dir}">
425       <fileset dir="${longtestreport.dir}">
426         <include name="TEST-*.xml" />
427       </fileset>
428       <report todir="${longtesthtml.dir}" format="frames" />
429     </junitreport>
430   </target>
432   <target name="junit-rebalance" depends="build, buildtest" description="Run junit tests only for rebalance.">
433     <replace-dir dir="${testreport.dir}" />
434     <replace-dir dir="${testhtml.dir}" />
435     <junit printsummary="yes" showoutput="true" maxmemory="2048m" timeout="1200000">
436       <classpath refid="test-classpath" />
437       <formatter type="xml" />
438       <batchtest fork="yes" todir="${testreport.dir}">
439         <fileset dir="${unittestsrc.dir}">
440           <include name="**/*Rebalance*Test.java" />
441           <exclude name="**/Abstract*.java" />
442         </fileset>
443       </batchtest>
444     </junit>
445     <junitreport todir="${testhtml.dir}">
446       <fileset dir="${testreport.dir}">
447         <include name="TEST-*.xml" />
448       </fileset>
449       <report todir="${testhtml.dir}" format="frames" />
450     </junitreport>
451   </target>
453   <target name="junit-long-rebalance" depends="build, buildtest, junit-rebalance" description="Run long junit rebalance tests that uses larger data sets than normal junit tests.">
454     <replace-dir dir="${longtestreport.dir}" />
455     <replace-dir dir="${longtesthtml.dir}" />
456     <junit printsummary="yes" showoutput="true" maxmemory="2048m" fork="yes" timeout="5400000">
457       <classpath refid="test-classpath" />
458       <formatter type="xml" />
459       <batchtest todir="${longtestreport.dir}">
460         <fileset dir="${longtestsrc.dir}">
461           <include name="**/*Rebalance*Test.java" />
462         </fileset>
463       </batchtest>
464     </junit>
465     <junitreport todir="${longtesthtml.dir}">
466       <fileset dir="${longtestreport.dir}">
467         <include name="TEST-*.xml" />
468       </fileset>
469       <report todir="${longtesthtml.dir}" format="frames" />
470     </junitreport>
471   </target>
473   <target name="junit-test" depends="build, buildtest, contrib-jar" description="Run single junit test for class ClassName with -Dtest.name=[ClassName]  (Note: Use the class name, not the file name with the .java extension)">
474     <replace-dir dir="${singletestreport.dir}" />
475     <replace-dir dir="${singletesthtml.dir}" />
476     <junit printsummary="on" showoutput="true" maxmemory="4096m">
477       <classpath refid="contrib-test-classpath" />
478       <classpath path="${log4j.properties.dir}" />
479       <formatter type="plain" />
480       <formatter type="xml" />
481       <test name="${test.name}"  todir="${singletestreport.dir}"/>
482     </junit>
483     <junitreport todir="${singletesthtml.dir}">
484       <fileset dir="${singletestreport.dir}">
485         <include name="TEST-*.xml" />
486       </fileset>
487       <report todir="${singletesthtml.dir}" format="frames" />
488     </junitreport>
489   </target>
491   <target name="junit-all" depends="junit-long, contrib-junit" description="Run All junit tests including contrib.">
492   </target>
494   <macrodef name="make-javadocs">
495     <attribute name="dir" />
496     <attribute name="packagenames" />
497     <attribute name="javadir" />
498     <sequential>
499       <replace-dir dir="@{dir}" />
500       <javadoc sourcepath="@{javadir}" destdir="@{dir}" windowtitle="${display.name}" source="${javac.version}" author="true" version="true" use="true" packagenames="@{packagenames}">
501         <doctitle>${display.name}</doctitle>
502         <bottom>${author}</bottom>
503         <classpath refid="main-classpath" />
504       </javadoc>
505     </sequential>
506   </macrodef>
508   <target name="docs" description="Create complete Javadoc documentation">
509     <make-javadocs dir="${javadoc.dir}/all" packagenames="*" javadir="${java.dir}"/>
510     <make-javadocs dir="${javadoc.dir}/client" packagenames="voldemort.versioning.*, voldemort.client.*,voldemort.serialization.*" javadir="${java.dir}"/>
511   </target>
513   <target name="redeploy" depends="war, deploy">
514   </target>
516   <taskdef file="tomcat-tasks.properties">
517     <classpath>
518       <path location="${lib.dir}/catalina-ant.jar" />
519     </classpath>
520   </taskdef>
522   <target name="list" description="List Tomcat applications">
523     <list url="${tomcat.manager.url}" username="${tomcat.manager.username}" password="${tomcat.manager.password}" />
524   </target>
526   <target name="deploy" description="Deploy application" depends="war">
527     <deploy url="${tomcat.manager.url}" username="${tomcat.manager.username}" password="${tomcat.manager.password}" path="${tomcat.context}" update="true" war="file:${dist.dir}/${name}.war" />
528   </target>
530   <target name="undeploy" description="Undeploy application">
531     <undeploy url="${tomcat.manager.url}"
532                  username="${tomcat.manager.username}"
533                  password="${tomcat.manager.password}"
534                  path="${tomcat.context}"/>
535   </target>
537 </project>