Wierd problem in linux 2.4.18-bf2.4, Java Blackdown-1.4.2-rc1

Achilleus Mantzios achill at matrix.gatewaynet.com
Fri Jun 24 14:04:57 GMT 2005


O Achilleus Mantzios έγραψε στις Jun 24, 2005 :

> Ok its linux a problem, but i think it would be interesting to you.
> 
> 1st off, this problem does not occur in FreeBSD 5.4-STABLE,
> with java 1.4.2p7. (Kudos to FreeBSD java team!!!)
> 
> The situation is as follows:
> 
> >From a jsp i call 
> 
> 	java.lang.Process proc = 
> 		Runtime.getRuntime().exec("/usr/local/sbin/uucico_command");
> 	proc.waitFor();
> 
> /usr/local/sbin/uucico_command has as follows:
> ------------------------------------------------------------
> #!/bin/sh
> /bin/rm -f /var/lock/LCK..ttyS*
> /usr/local/var/lib/pgsql/dbmirror/AsyncMirrorWithSpecialTables.pl 
> /usr/local/var/lib/pgsql/dbmirror/OFFICE.conf
> /usr/local/sbin/gpsavg
> epochsecs=`date +'%s'`
> pushd /usr/local/var/XML_TO_OFFICE/
> tar cfj As_AND_Ds_$epochsecs.tar.bz2 A*.xml D*.xml
> \rm -f A*.xml D*.xml
> popd
> /usr/bin/bzip2 /usr/local/var/XML_TO_OFFICE/*
> export PGUSER=postgres
> export PGPASSWORD=""
> vessel_name=`/usr/local/pgsql/bin/psql -A -q -t -h localhost dynacom -c 
> "select replace(lower(name),' ','_') from vessels limit 1"`
> VESSEL_NAME=`/usr/local/pgsql/bin/psql -A -q -t -h localhost dynacom -c 
> "select replace(name,' ','_') from vessels limit 1"`
> uucp -r /usr/local/var/XML_TO_OFFICE/*.bz2 
> uucphub\!/usr/local/var/XML_FROM_VESSELS/$VESSEL_NAME/.
> /bin/rm -fr /usr/local/var/XML_TO_OFFICE/*
> /bin/rm -fr /var/spool/uucppublic/outbound > /dev/null 2>&1
> /bin/rm -fr /var/spool/uucppublic/inbound > /dev/null 2>&1
> outbound=`/usr/bin/wc -c /var/spool/uucp/uucphub/D./* 2>/dev/null | tail 
> -1 | awk '{print $1}'`
> outbound=${outbound:=0}
> echo $outbound > /var/spool/uucppublic/outbound 2>/dev/null
> uucp -r -g 0 /var/spool/uucppublic/outbound 
> uucphub\!/var/spool/uucppublic/$vessel_name.inbound
> \rm -fr /var/spool/uucp/.Status/uucphub
> uucp_acct_id=`/usr/local/sbin/dyna_psql $outbound 2>/dev/null`
> /usr/local/sbin/dyna_log_uucp_acct_update $uucp_acct_id
> uucico -x 4 -f -s uucphub
> uucpsc=`/bin/cat /var/spool/uucp/.Status/uucphub | /usr/bin/awk '{print 
> $1}'`
> uucpsc=${uucpsc:=99}
> #logger -p uucp.info "NOTICE!!! acctid="$uucp_acct_id "uucpsc="$uucpsc
> /usr/local/j2sdk1.4.2/bin/java -cp 
> "/usr/local/jboss-3.0.3/server/default/SMA_UUCP.jar:/usr/local/pgsql/share/java/postgresql.jar:/usr/local/jboss-3.0.3/client/log4j.jar" 
> com.gatewaynet.uucp.LogUUCPAcct $uucp_acct_id $uucpsc
> /usr/local/j2sdk1.4.2/bin/java -cp 
> "/usr/local/jboss-3.0.3/server/default/SMA_UUCP.jar:/usr/local/pgsql/share/java/postgresql.jar:/usr/local/jboss-3.0.3/client/log4j.jar:/usr/local/jboss-3.0.3/server/default/lib/activation.jar:/usr/local/jboss-3.0.3/server/default/lib/mail.jar" 
> com.gatewaynet.uucp.SendCollected
> pushd /usr/local/var/XML_FROM_OFFICE/
> for ASDS in As_AND_Ds*.tar.bz2; do tar xfj $ASDS; rm -f $ASDS; done
> popd
> /usr/bin/bunzip2 /usr/local/var/XML_FROM_OFFICE/*.bz2
> ############################################
> ### The command below is the problematic one
> ############################################
> /usr/local/jboss-3.0.3/server/default/readoff
> /etc/cron.daily/compstatus &
> ------------------------------------------------------------
> 
> now the problematic /usr/local/jboss-3.0.3/server/default/readoff has as 
> follows
> ------------------------------------------------------------
> #!/bin/sh
> export 
> CLASSPATH="/usr/local/jboss-3.0.3/server/default/SMA_PER.jar:/usr/local/jboss-3.0.3/server/default/xerces.jar:/usr/local/jboss-3.0.3/client/jbossall-client.jar:/usr/local/jboss-3.0.3/client/log4j.jar:/usr/local/pgsql/share/java/postgresql.jar"
> 
> /usr/local/j2sdk1.4.2/bin/java 
> -Djavax.xml.parsers.DocumentBuilderFactory=org.apache.xerces.jaxp.DocumentBuilderFactoryImpl 
> com.gatewaynet.periodic.ReadXmlFromOffice
> ------------------------------------------------------------
> 
> whereas ReadXmlFromOffice.java has as follows:
> ------------------------------------------------------------
> /*
>  * Created on 19 Μαρ 2004, 11:55:47 πμ
>  *
>  */
> package com.gatewaynet.periodic;
> 
> import java.io.File;
> import java.io.FileOutputStream;
> import java.io.PrintStream;
> import java.sql.PreparedStatement;
> import java.util.Arrays;
> import java.util.Comparator;
> 
> import org.w3c.dom.Node;
> 
> 
> /**
>  * @author achill4
>  *
>  * To change the template for this generated type comment go to
>  * Window>Preferences>Java>Code Generation>Code and Comments
>  */
> 
> public class ReadXmlFromOffice {
> 
> 	private static String XMLFROMDIR = 
> "/usr/local/var/XML_FROM_OFFICE";
> 	private static String XMLTODIR = "/usr/local/var/XML_TO_OFFICE";
> 	
> 	private static String FILEDIR = 
> "/usr/local/var/FILES_FROM_OFFICE";
> 	
> 	static private org.apache.log4j.Logger logger = 
> org.apache.log4j.Logger.getLogger("dynacom.RXML");
> 
> 	/**
> 	 * 
> 	 */
> 	public ReadXmlFromOffice() {
> 		super();
> 		// TODO Auto-generated constructor stub
> 	}
> 
> 	public static void main(String[] args) {
> 		java.sql.Connection con=null;
> 		try {
> 			javax.naming.InitialContext ic = new 
> javax.naming.InitialContext();
> 			Class.forName("org.postgresql.Driver");
> 			con = 
> java.sql.DriverManager.getConnection("jdbc:postgresql://localhost/dynacom","postgres","");
> 			con.setAutoCommit(false);
> 
> 			PreparedStatement vslidst = 
> con.prepareStatement("select id from vessels limit 1");
> 			java.sql.ResultSet vslidrs = 
> vslidst.executeQuery();
> 			if (!vslidrs.next()) throw new Exception("No 
> vessel in database. Contact IT DEPT.");
> 			int thisvesselvslid = vslidrs.getInt(1);
> 			vslidrs.close();
> 			vslidst.close();
> 			con.commit();
> 			
> 			javax.xml.parsers.DocumentBuilderFactory 
> builderFactory =javax.xml.parsers.DocumentBuilderFactory.newInstance();
> 			builderFactory.setValidating(false);
> 			
> 			javax.xml.parsers.DocumentBuilder builder 
> =builderFactory.newDocumentBuilder();
> 			builder.setErrorHandler(new 
> com.gatewaynet.web.util.xml.MyErrorHandler());
> 
> 			File xmldir = new File(XMLFROMDIR);
> 			File[] xmlfiles = xmldir.listFiles();
> 			Arrays.sort(xmlfiles,new DirComparator());
> 			String[] xerrors = new String[xmlfiles.length];
> 			String lastdone=null;
> 			int numxerrors=0;
> 			int xmli;
> 			for (xmli = 0; xmli < xmlfiles.length; xmli++) {
> 				File xmlfile = xmlfiles[xmli];
> 				try {
> 					String xmlfilename 
> =xmlfile.getName(); 
> 					if (!xmlfilename.endsWith(".xml") 
> && !xmlfilename.endsWith(".XML")) continue;
> 					org.w3c.dom.Document document = 
> builder.parse(xmlfile);
> 					org.w3c.dom.Element rootel = 
> document.getDocumentElement();
> 					org.w3c.dom.NamedNodeMap attrs = 
> rootel.getAttributes();
> 					String xidstr=null;
> 					String vslidstr=null;
> 					org.w3c.dom.Attr attr;
> 					attr = (org.w3c.dom.Attr) 
> attrs.getNamedItem("xid");
> 					xidstr = attr.getValue();
> 					attr = (org.w3c.dom.Attr) 
> attrs.getNamedItem("vslid");
> 					vslidstr = attr.getValue();					
> 
> 					org.w3c.dom.Node curnd;
> 	
> 					org.w3c.dom.NodeList nodes = 
> rootel.getChildNodes();
> 	
> 					String appname=null;
> 					String apptbl_tmp=null;
> 					String gao=null;
> 					String idstr=null;
> 					String SQL=null;
> 					String comment=null;
> 					
> 					String filename=null;
> 					String file_base64=null;
> 					
> 					String unixcommand=null;
> 
> 					for (int i = 0; i < 
> nodes.getLength(); i++) {
> 						curnd = nodes.item(i);
> 						if (curnd.getNodeType() == 
> org.w3c.dom.Node.ELEMENT_NODE) {
> 							if 
> (((org.w3c.dom.Element) curnd).getTagName().equals("appname"))
> 								appname =  
> ((org.w3c.dom.Text) curnd.getFirstChild()).getData();
> 								
> 							if 
> (((org.w3c.dom.Element) curnd).getTagName().equals("apptbl_tmp"))
> 								apptbl_tmp 
> =  ((org.w3c.dom.Text) curnd.getFirstChild()).getData();
> 							
> 							if 
> (((org.w3c.dom.Element) curnd).getTagName().equals("id"))
> 								idstr =  
> ((org.w3c.dom.Text) curnd.getFirstChild()).getData();
> 															
> 							if 
> (((org.w3c.dom.Element) curnd).getTagName().equals("gao"))
> 								gao =  
> ((org.w3c.dom.Text) curnd.getFirstChild()).getData();
> 	
> 							if 
> (((org.w3c.dom.Element) curnd).getTagName().equals("sql")) {
> 								Node 
> sqlnode = curnd.getFirstChild();
> 								if 
> (sqlnode != null) SQL = ((org.w3c.dom.CDATASection) 
> curnd.getFirstChild()).getData();
> 							}
> 								
> 							if 
> (((org.w3c.dom.Element) curnd).getTagName().equals("comment")) {
> 								Node 
> commentnode = curnd.getFirstChild();
> 								if 
> (commentnode != null) comment =  ((org.w3c.dom.Text) 
> curnd.getFirstChild()).getData();
> 							}
> 							/**
> 							 *  file transfer 
> kai unix commands
> 							 */
> 							if 
> (((org.w3c.dom.Element) curnd).getTagName().equals("filename")) {
> 								Node 
> filenamenode = curnd.getFirstChild();
> 								if 
> (filenamenode != null) filename =  ((org.w3c.dom.Text) 
> curnd.getFirstChild()).getData();
> 							}
> 							
> 							if 
> (((org.w3c.dom.Element) curnd).getTagName().equals("filecontent")) {
> 								Node 
> filecontentnode = curnd.getFirstChild();
> 								if 
> (filecontentnode != null) file_base64 = ((org.w3c.dom.CDATASection) 
> curnd.getFirstChild()).getData();
> 							}
> 							
> 							if 
> (((org.w3c.dom.Element) curnd).getTagName().equals("unixcommand")) {
> 								Node 
> unixcommandnode = curnd.getFirstChild();
> 								if 
> (unixcommandnode != null) unixcommand = ((org.w3c.dom.CDATASection) 
> curnd.getFirstChild()).getData();
> 							}
> 
> 							
> 						}	
> 					}
> 										
> 					if (xidstr == null) throw new 
> Exception("xid is null");
> 					int xid = 
> Integer.parseInt(xidstr);
> 					if (vslidstr == null) throw new 
> Exception("vslid is null");
> 					int vslid = 
> Integer.parseInt(vslidstr);
> 					
> 					if (gao == null) throw new 
> Exception("gao is null");
> 					if (vslid != thisvesselvslid && 
> !gao.equals("FLTRAN") && !gao.equals("UNXCOM")) throw new Exception("This 
> Transaction is for Another Vessel. Contact IT DEPT.");
> 					
> 					logger.info("Processing file 
> "+xmlfilename);
> 					
> 					if (gao.equals("ACKNOW")) {
> 						PreparedStatement st = 
> con.prepareStatement("update xadmin set state='ARC' where xid=?");
> 						st.setInt(1,xid);
> 						int rc = 
> st.executeUpdate();
> 						if (rc != 1) throw new 
> Exception("Error updating xadmin to ARC.");
> 						st.close();
> 					}
> 					else if (gao.equals("CANCEL")) {
> 						PreparedStatement st = 
> con.prepareStatement("update xadmin set state='CAN',comment=? where 
> xid=?");
> 						st.setString(1,comment);
> 						st.setInt(2,xid);
> 						int rc = 
> st.executeUpdate();
> 						if (rc != 1) throw new 
> Exception("Error updating xadmin to ARC.");
> 						st.close();
> 					}
> 					else if (gao.equals("REPLIC")) {
> 						logger.info("IN REPLIC for 
> file "+xmlfilename);
> 						// EDW MAS ENDIAFEREI MONO 
> TO SQL.
> 						java.sql.Statement st2 = 
> con.createStatement();
> 						logger.info("IN REPLIC 
> after createStatement for file "+xmlfilename);
> 						if (SQL != null) 
> st2.execute(SQL);
> 						logger.info("IN REPLIC 
> after execute for file "+xmlfilename);
> 						st2.close();
> 					}
> 					else if (gao.equals("FLTRAN")) {
> 						if (filename == null) 
> throw new Exception("File name in file transfer cannot be null. Contact IT 
> DEPT.");
> 						if (file_base64 == null) 
> throw new Exception("File content in file transfer cannot be null. Contact 
> IT DEPT.");
> 						byte[] filecontent = 
> Base64.decode(file_base64.toCharArray());
> 						File outfile = new 
> File(FILEDIR+"/"+filename);
> 						FileOutputStream fout = 
> new FileOutputStream(outfile);
> 						fout.write(filecontent);
> 						fout.close();	
> 					}
> 					else if (gao.equals("UNXCOM")) {
> 						if (unixcommand == null) 
> throw new Exception("Command in unix command cannot be null. Contact IT 
> DEPT.");
> 						// PROSOXH SE 
> size(unixcommands)/1024 > (getconf ARG_MAX)
> 						Process proc = 
> Runtime.getRuntime().exec(new String[] {"sh","-c",unixcommand});
> 						
> 						FileOutputStream fout = 
> new FileOutputStream(new 
> File(XMLTODIR+"/"+xmlfile.getName().replaceAll(".xml","")+".out"));
> 						
> 						PrintStream out = new 
> PrintStream(fout);
> 						
> 						java.io.InputStream 
> procout = proc.getInputStream();
> 						
> 						
> out.println("==============");
> 						out.println("Output (if 
> any)");
> 						
> out.println("==============");
> 						
> 						int c;
> 						while ((c=procout.read()) 
> >=0) {
> 							out.write(c);
> 							
> //System.out.write(c);
> 							
> //System.out.flush();
> 						}
> 						
> 						java.io.InputStream 
> procerr = proc.getErrorStream();
> 						
> 						
> out.println("==============");
> 						out.println("Error (if 
> any)");
> 						
> out.println("===============");
> 						
> 						while ((c=procerr.read()) 
> >=0) {
> 							out.write(c);
> 							
> //System.out.write(c);
> 							
> //System.out.flush();
> 						}
> 						
> 					}
> 					else throw new Exception("GAO 
> "+gao+" not supported. CONTACT IT DEPT.");
> 					
> 					con.commit();
> 					boolean isdeled = 
> xmlfile.delete();
> 					if (!isdeled) throw new 
> Exception("Error deleting file. Xaction Aborted.");
> 					System.out.println("OK with file 
> "+xmlfile.getName());
> 					
> 					lastdone=xmlfile.getName();
> 					 
> 				}
> 				catch (Exception xmle) {
> 					System.out.println("Error : 
> "+xmle.getMessage()+": with file "+xmlfile.getName());
> 					logger.error("Error : 
> "+xmle.getMessage()+": with file "+xmlfile.getName());
> 					//xmle.printStackTrace();
> 					con.rollback();
> 					
> 					
> xerrors[numxerrors++]="--------------------------"+"Error with 
> "+xmlfile.getName()+"--------------------------\n"+
> 					
> xmle.getMessage()+"\n"+"---------------------------------------------------------------------";
> 					xmlfile.delete();
> 				}
> 			} // end for
> 			if (lastdone != null) {
> 				FileOutputStream fout = new 
> FileOutputStream(new File(XMLTODIR+"/lastdone.mon"));
> 				PrintStream out = new PrintStream(fout);						
> 				out.println("Last XML was "+lastdone);
> 			}
> 			if (numxerrors!=0) {
> 				FileOutputStream fout = new 
> FileOutputStream(new File(XMLTODIR+"/xerror.mon"));
> 				PrintStream out = new PrintStream(fout);						
> 				int run;
> 				for (run=0;run<numxerrors;run++) {
> 					out.println(xerrors[run]);
> 				}
> 				
> 			}
> 		}
> 		catch (Exception pce) {
> 			System.out.println("A General XML Error Occured: 
> "+pce.getMessage());
> 			logger.error("A General XML Error Occured: 
> "+pce.getMessage());
> 		}
> 		finally {
> 			if (con != null) try {con.close();} 
> catch(Exception fe){}
> 		}
> 	}
> 	
> }
> 
> class DirComparator implements Comparator {
> 	public DirComparator () {
> 	}
> 	
> 	public int compare(Object obj, Object obj1) {
>         File f = (File) obj;
>         File f1 = (File) obj1;
>         String str = f.getName();
>         String str1 = f1.getName();
>         int i,i1;
>         //System.out.println("str="+str);
>         //System.out.println("str1="+str1);
>         if (str.charAt(0) < str1.charAt(0)) return -1;
>         else if (str.charAt(0) > str1.charAt(0)) return 1;
>         try {
>         	i = Integer.parseInt(str.substring(1,str.indexOf('.')));
>         	//System.out.println("i="+i);
>         }
>         catch (Exception e) {
>         	return 1;
>         }
>         try {
>         	i1 = 
> Integer.parseInt(str1.substring(1,str1.indexOf('.')));
>         	//System.out.println("i1="+i1);
>         }
>         catch (Exception e) {
>         	return -1;
>         }
>         if (i < i1 ) return -1;
>         else if (i==i1) return 0;
>         else return 1;
>     }
>     
>     public boolean equals(Object obj) {
>         return false;
>     }
> }
>  
> ------------------------------------------------------------
> 
> 
> Now the really wierd problem.
> 
> When the /usr/local/jboss-3.0.3/server/default/readoff is run from
> the shell it has never stalled, behaved strange or failed.
> 
> Also when the /usr/local/sbin/uucico_command is run from the shell
> it has never failed, or *caused* 
> /usr/local/jboss-3.0.3/server/default/readoff to stall.
> 
> BUT, when i run /usr/local/sbin/uucico_command from the JSP,
> then i experience a stall of the 
> /usr/local/jboss-3.0.3/server/default/readoff script,
> and only if there are many (where many varies from 
> run to run, but generally more than lets say 10) xml files
> to be processed in /usr/local/var/XML_FROM_OFFICE/.
> 
> The java program in readoff processes *some* XML files, and then stalls
> for no apparent reason.
> 
> The solution was to replace 
> the last 2 lines
> 
> /usr/local/jboss-3.0.3/server/default/readoff
> /etc/cron.daily/compstatus &
> 
> with
> 
> echo /usr/local/bin/afteruucico | at now
> 
> where /usr/local/bin/afteruucico is just
> 
> #!/bin/sh
> /usr/local/jboss-3.0.3/server/default/readoff
> /etc/cron.daily/compstatus
> 
> In other words,
> i have a JSP calling a script, which calls another script which
> executes a java program.
> 
> The java programm does some processing and then sleeps for
> no reason without finishing, without spitting out any Exceptions.
> 
> When i magically "jump out" of the initial java environment (jboss/JSP),
> with the *at* command, then the readoff script and its ReadXmlFromOffice
> java programm all work fine.
> 
> Any thoughts would be great.
> 
> I checked ulimit,etc, with no apparent clue.
> 
> This problem kinda haunted me last night, and i just
> wanna kill it, instead of pretending i found a workaround.
> 
> The only "excuse" i can think of, is that it runs in Linux,
> which i am not extremely familiar with.
> 
> If you need more feedback, or if any ambitious volunteer
> wants to hunt this down, i am happy to help.
> 
> P.S.
> 
> The jboss dir in FreeBSD, is a morningly tbz from the linux
> machine, so no tricks there.
> 
> 

Problem track,

the same happens if instead of 
/usr/local/jboss-3.0.3/server/default/readoff
command ANY command produces fairly enuf large ammount
of stdout,stderr.
For instance if the bunzip command just before readoff
produces large stderr (of the type "bunzip2: Output file foo already 
exists."), then bunzip2 stalls as well.



-- 
-Achilleus



More information about the freebsd-java mailing list