[Instance plantée] ladomdevv4.orangeab.simplicite.io

Bonjour,
l’instance ladomdevv4.orangeab.simplicite.io ne répond plus.

Il y a un message d’erreur :
2021-01-05 11:00:30,216 ERROR [com.simplicite.util.engine.GrantManager] SIMPLICITE|https://orangeab.simplicite.io:10203||ECOREDB001|system|com.simplicite.util.engine.GrantManager|query||Erreur SQL requête: select l.lov_name, c.lov_code, c.lov_order_by, v.lov_lang, v.lov_value, c.lov_color, c.lov_color_bg, c.lov_icon, c.lov_display from m_list l left outer join m_list_code c on (l.row_id=c.lov_list_id and c.lov_order_by>=0) left outer join m_list_value v on (c.row_id=v.lov_code_id) where l.lov_name=‘RESOURCE_TYPE’ order by l.lov_name asc, c.lov_order_by asc
java.sql.SQLException: Disk full (/var/tmp/#sql_682_0); waiting for someone to free some space…

Pouvez vous régler le problème, merci ?

Cordialement

Ce serveur a eu un file system full, ça peut avoir toute sorte d’effet indésirable…

J’ai fait un arret / upgrade forcé / relance ça à l’air OK:

PS:

@Alistair me dit qu’une autre instance de ce serveur (“usecase”) fait des choses bizarres qui font grossir son répertoire à l’infini, je soupçonne que c’est la cause du file system full sur ce serveur.

Regardez dans votre code s’il n’y aurait pas ici aussi une boucle infinie quelquepart dans votre code (avec des traces logs dans la boucle) sur cette instance.

En tout cas en simplement arrêtant/redémarrant l’instance “usecase” je ne vois rien d’anormal, c’est donc en l’utilisant que ça part en vrille.

Bonjour David,
Je travaille sur l’instance usecase, je me permets de me joindre au post.
Je pense peut être connaitre la raison du probléme, c’est lors de l’import d’un CSV avec un adapter spécifique, j’ai du implémenté les getGrant() dans le hook processValues() qui s’execute à chaque ligne du CSV, j’ai beau essayé d’implémenter ça dans le preProcess mais ça ne marche pas, voici le code : (je vous laisse le choix de déplacer le post si nécessaire)

Voici le code :

package com.simplicite.adapters.Factur_projetDD;

import java.util.*;
import com.simplicite.util.*;
import com.simplicite.util.integration.*;

import com.simplicite.util.tools.*;

import com.simplicite.util.tools.JSONTool;
import org.json.JSONObject;

/**
 * Adapter InvEvtCSVAdapter
 */
public class InvEvtCSVAdapter extends CSVLineBasedAdapter {
	private static final long serialVersionUID = 1L;
	private ObjectDB contratBo ;
	private ObjectDB chefprojetBo ;
	private ObjectDB projetBo ;
	private ObjectDB factureBo ;
	
	// Good practice : use specific exception class
	private static class InvEvtCSVAdapterException extends Exception{
		public InvEvtCSVAdapterException(String message){
			super(message);
		
		}
	}
	
	public String preProcess(){
			// set CSV separator
			setSeparator(';'); 
			contratBo = getGrant().getTmpObject("Contrat");
			chefprojetBo = getGrant().getTmpObject("ChefProjet");
			projetBo = getGrant().getTmpObject("Projet");
			factureBo = getGrant().getTmpObject("Facture");
	
			// to generate a subsequently imported XML, call super.preProcess()
			// doing so will add a starting <simplicite> tag
			return null;
		}
		
	@Override
	public String processValues(long lineNumber, String[] values){	
		// Good practice: handle errors with exceptions		
		
		
		try{
			// add some logs to the .log file (added in the imports supervisor object)
			appendLog("=== Processing line #"+lineNumber+" : "+Arrays.toString(values));
			
		
		if (lineNumber>1)  // skip header
			processWithExceptions(lineNumber, values);
		}
		catch(InvEvtCSVAdapterException e){
			// add some logs to the .err file (added in the imports supervisor object)
			appendError("=== Error with line #"+lineNumber+" : "+Arrays.toString(values));
			appendError(e);

			// change import status to impact the supervisor object
			setStatus(SystemXML.SUPERVISOR_STATUS_IMPORT_ERROR);
		}

		// returned String gets added to a XML subsequently imported.
		// in this case we do not append anything to XML subsequently imported,
		// as we directly create the objects instead
		return null; 
	}


	public void processWithExceptions(long lineNumber, String[] values) throws InvEvtCSVAdapterException{
    
    	synchronized(factureBo){	
	    	synchronized(projetBo){	
		    	synchronized(chefprojetBo){	
					synchronized(contratBo){
						
					try {
					//Create BO Tool for each BO
					BusinessObjectTool contratBot = new BusinessObjectTool(contratBo); // or contratBo.getTool();
					BusinessObjectTool chefprojetBot = new BusinessObjectTool(chefprojetBo);
					BusinessObjectTool projetBot = new BusinessObjectTool(projetBo);
					BusinessObjectTool factureBot = new BusinessObjectTool(factureBo);
				
					//Start Processing 
					
					//Processing for "Projet"
					List<String[]> rs = projetBot.search(new JSONObject()
					.put("numero_projet", values[3]));
				
					if (rs.size() == 1) // 1 found = update
						projetBo.setValues(rs.get(0), true);	
					
					else if (rs.size() == 0) // 0 found => create
						{
						projetBo.resetValues(true); 
						
						//Processing for "contrat"
						rs = contratBot.search(new JSONObject().put("numContrat", values[0]));
					
						if (rs.size() == 1) // 1 found = update
						contratBo.setValues(rs.get(0), true);
						
						else if (rs.size() == 0) // 0 found => create
						contratBo.resetValues(true); //
					
						else // Should never happen if search is done using all functional keys
						throw new Exception(rs.size() + " contact records found");
						
						contratBo.setFieldValue("numContrat", values[0]);
						contratBo.setFieldValue("typeContrat", values[7]);	  
						contratBot.validateAndSave();
						
						//Processing for "ChefProjet"
						rs = chefprojetBot.search(new JSONObject()
						.put("nom", values[6].split(",[ ]*")[0])
						.put("prenom",values[6].split(",[ ]*")[1])
						);
					
						if (rs.size() == 1) // 1 found = update
						chefprojetBo.setValues(rs.get(0), true);	
						
						else if (rs.size() == 0) // 0 found => create
						chefprojetBo.resetValues(true); // 
					
						else // Should never happen if search is done using all functional keys
						throw new Exception(rs.size() + " records found");
						
						chefprojetBo.setFieldValue("nom", values[6].split(",[ ]*")[0]);
						chefprojetBo.setFieldValue("prenom", values[6].split(",[ ]*")[1]);	  
						chefprojetBot.validateAndSave();
						}
					else // Should never happen if search is done using all functional keys
						throw new Exception(rs.size() + " project chief records found");
			
				
					//Create/Update "Projet"
					projetBo.setFieldValue("numero_projet", values[3]);
					projetBo.setFieldValue("orgaProjet", values[2] );	  
					projetBo.setFieldValue("nomProjet", values[4] );
					projetBo.setFieldValue("nomTacheSup", values[5]);
					projetBo.setFieldValue("Projet_Contrat_id", contratBo.getFieldValue("row_id"));
					projetBo.setFieldValue("Projet_ChefProjet_id",chefprojetBo.getFieldValue("row_id") );
					projetBo.setFieldValue("numLigneContrat", values[1] );	  
				
					projetBot.validateAndSave();
					
				
	    			//Create/Update "Facture"
					List<String[]> rs_fac = factureBot.search(new JSONObject()
					.put("numEvt", values[10]));
					
					if (rs_fac.size() == 1) // 1 found = update
					factureBo.setValues(rs_fac.get(0), true);	
						
					else if (rs_fac.size() == 0) // 0 found => create
					factureBo.resetValues(true); // 
					
					else // Should never happen if search is done using all functional keys
					throw new Exception(rs_fac.size() + " invoice records found");
					
			
					
					//Date mapping from DD/MM/YYYY to YYYY/MM/DD
					 
					String dbDate = values[9].split("/")[2] +"-"+ values[9].split("/")[1]+ "-"+ values[9].split("/")[0];
				
					factureBo.setFieldValue("dateFinEvenement", dbDate );
					factureBo.setFieldValue("description", values[11] );
					
					//replace the comma by dot anb delete space from "montantNonFacture"
						
					String montantNonFacture = values[12].replaceAll(",",".");
				  
				
					factureBo.setFieldValue("montantNonFacture", montantNonFacture.replaceAll("\\s+","") );
					
					factureBo.setFieldValue("Facture_Projet_id", projetBo.getFieldValue("row_id") );
				
					
					factureBo.setFieldValue("reportFacturation", values[14] );
					factureBo.setFieldValue("commentaireFacture", values[15] );
					
					//replace the comma by dot anb delete space from "montantAFacturer"
					String montantAFacturer = values[16].replaceAll(",",".");
					   
					
					
					factureBo.setFieldValue("montantAFacturer", montantAFacturer.replaceAll("\\s+","") );
					factureBo.setFieldValue("statutEvtFacture", "REP" );
					
					//Status related to "type contrat" on the first import
					if (rs_fac.size() == 0 && (values[7].equals("Date à date") || values[7].equals("Epuisements de jours")) )
					factureBo.setFieldValue("statutEvtFacture", "FAC" );
					else 
					factureBo.setFieldValue("statutEvtFacture", "AFAC" );
				
					//Status related to "description" on evry import
					if (values[11].equals("pas de base factu") || values[11].equals("reste à facturer"))
					factureBo.setFieldValue("statutEvtFacture", "ATT" );
				
				
					factureBo.setFieldValue("TypeEvent", values[8] );
					factureBo.setFieldValue("numEvt", values[10]);
					
					
					factureBot.validateAndSave();
				
					
						
					
				
					}catch (Exception e) {
					
					}
		    	}
	    	}
	    	}
		}
					
				
			
						
				
	    		
	    	
	    	
	
	}
	

}

Je ne sais pas si c’est lié à la remarque de Sofiane mais l’instance est up pour l’instant.
Merci.

PI on a détecté dans les logs de l’instance “usecase” un truc étrange visiblement lié à la fermeture des websockets au logout depuis chez vous (?), c’est peut être ça aussi qui fait partir cette instance “usecase” en boucle.

A titre conservatoire on a renforcé la robustesse cette partie du code, ce sera poussé sur toutes les versions/branches ce soir.

On va aussi revoir la stratégie par défaut de rolling des logs pour qu’elle ne soit plus (que) quotidienne mais (aussi) liée à la taille du fichier. Comme ça on évitera un file system full à cause des logs

PS: Le sujet sur l’adapter est traité dans un autre post (Import CSV (Adapter) Spécifique - #7 by Sofiane94), on ne le traiterai pas ici.

C’est retombé ladomdevv4.orangeab.simplicite.io/ui est en Erreur 500 (ERR_HTTP500 )
Pouvez vous me dire la cause et redémarrer , merci ?

Non cette instance n’est pas “plantée”, de chez moi elle marche:


Votre erreur 500 doit avoir une autre cause… décrivez moi ce que vous faites

Alors c’est très étrange!
J’ai testé avec FireFox et Chrome avant de poster.
Sur FireFox j’ai l’erreur 500 en message mais pas de code retour HTTP tant que je ne change pas de container (plugin FF)?!
Sur Chrome je n’avais pas d’erreur mais une page blanche en activant les outils de dev c’est passé ?!
J’ai mis en PJ une copie de FF![ErreurFFContainer|690x419]

Dans Chrome je n’ai pas d’extension de ce type. Je ne sais pas si c’est lié mais j’ai une connection VPN que j’ai du réinitialisé cela a été bref.

Donc effectivement cela fonctionne

(upload://6pVV9sAtOWayNAtSF0cCCwiJ822.png)

Je ne vois pas vos copies d’écran.

Un de vos collègues a des pbs avec les websockets (peut être à cause du VPN en question) ce qui faisait tomber dans un cas particulier tordu qui partait en boucle. On a corrigé ce point.

Ici il y a peut être un autre cas aux limites. Je peux éventuellement tenter de forcer une mise à jour pour voir si avec les corrections liés à l’autre point ça résoud le pb dans votre cas à vous…

Sinon pour eviter les pbs liés aux websockets vous pouvez passer le param système utilisateur USE_WEBSOCKET_LOGS à no (il est à yes par défaut pour designer) mais vous n’aurez plus les logs serveur dans la console des dev tools du navigateur

Ca c’est reproduit mais uniquement avec FireFox et cette fois j’ai un retour 500

Page d’erreur legacy… bizarre. Normalement il y a un stacktrace en commentaires HTML dans cette page.

Bon je tente une mise à jour pour voir. Je vous dit quand c’est bon

C’est fait, retestez et dites moi.

Alors je le reproduit systématiquement suite à l’utilisation des imports XML avec un adapteur.

J’ai cette erreur

2021-01-06 18:25:00,081 INFO [com.simplicite.util.engine.CronManager] SIMPLICITE|https://orangeab.simplicite.io:10203||INFO|system|com.simplicite.util.engine.CronManager|run||Evénement: Next cron job: ImportXML at Wed Jan 06 18:30:00 CET 2021
2021-01-06 18:24:53,285 INFO [com.simplicite.util.tools.LicenseTool] SIMPLICITE|https://orangeab.simplicite.io:10203||ICORELI001|system|com.simplicite.util.tools.LicenseTool|isValid||La licence serveur est valide.
2021-01-06 18:24:53,280 INFO [com.simplicite.util.Grant] SIMPLICITE|https://orangeab.simplicite.io:10203||ICORED0001|designer|com.simplicite.util.Grant|init||Info : designer connected, session ID: 8C17FF4A40F79024A3C6F073060FDD4D, timeout: 30 min , user agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36
2021-01-06 18:24:50,850 INFO [com.simplicite.util.Grant] SIMPLICITE|https://orangeab.simplicite.io:10203||ICORED0001|public|com.simplicite.util.Grant|init||Info: public connected, session ID: 64C1B9DFF86643012C37CACCF4B37FC4, timeout: 5 min , user agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36
2021-01-06 18:24:15,306 ERROR [com.simplicite.util.IntegrationDirect] SIMPLICITE|https://orangeab.simplicite.io:10203||ECORED0001|system|com.simplicite.util.IntegrationDirect|importADP||Erreur Problem in XML import thru adapter LadAdapterRepriseSuiviDesIndicateurs
    java.lang.NullPointerException
     at com.simplicite.util.ObjectDB.select(ObjectDB.java:815)
     at com.simplicite.util.ObjectDB.select(ObjectDB.java:852)
     at com.simplicite.objects.System.XMLSupervisor.storeAdapterResult(XMLSupervisor.java:101)
     at com.simplicite.util.engine.Interface.importData(Interface.java:509)
     at com.simplicite.util.engine.Interface.importADP(Interface.java:439)
     at com.simplicite.util.IntegrationDirect.importADP(IntegrationDirect.java:186)
     at com.simplicite.util.Integration.importADP(Integration.java:385)
     at com.simplicite.webapp.servlets.AbstractIOServlet.doPost(AbstractIOServlet.java:473)
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:652)
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:733)
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
     at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
     at com.simplicite.webapp.filters.RewriteFilter.doFilter(RewriteFilter.java:77)
     at com.simplicite.webapp.filters.AbstractFilter.doFilter(AbstractFilter.java:37)
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
     at com.simplicite.webapp.filters.AuthMethodFilter.doFilter(AuthMethodFilter.java:138)
     at com.simplicite.webapp.filters.AbstractFilter.doFilter(AbstractFilter.java:37)
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
     at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:188)
     at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97)
     at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542)
     at com.simplicite.tomcat.valves.APISessionValve.invoke(APISessionValve.java:192)
     at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:143)
     at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
     at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:690)
     at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78)
     at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
     at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:374)
     at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
     at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:888)
     at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1597)
     at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
     at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)
     at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:630)
     at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
     at java.base/java.lang.Thread.run(Thread.java:832)

C’est étrange car cela fonctionnait et que les données sont importés.
Il y a une erreur 405 et si je fais l’import avec chrome j’ai aussi l’erreur… a priori il y a un pb sur l’envoi

J’ai l’impression que cette erreur (visiblement un NPE lié à du code specifique) n’a rien à voir avec ce dont nous parlions précédement, car je pensais qu’on parlait d’une erreur à la connexion…

Est ce que le code spécifique en question a des try/catch (Throwable e) pour trapper ses propres exceptions ? Si non il faut en ajouter.

Quand vous dites “import XML” vous voulez dire sur la UI ou via un appel curl sur I/O ?

Oui ces différents de l’erreur précédente.
C’est un import XML depuis l’UI. Je ne vois pas trop pourquoi un NPE lors d’un import XML mettrait l’ui en erreur 500 ensuite ?!

De plus pour retrouver l’UI je suis obligé de vider le cache du navigateur.

Un NPE ou une autre erreur “bas niveau” dans un traitement déclenché depuis la UI peut très bien, s’il n’est pas trappé, finir par remonter en erreur HTTP 500 ou autre avec des effet inattendus.

Comme toujours il faut comprendre le pb d’origine qui se cache derrière le symptôme visible. D’où ma question sur le try/catch dans votre code.

Faites un test avec un autre adapter pour savoir si ce pb est lié à cet adapter specifique ou s’il est plus général, en attendant je regarde dans le code ce qui pourrait induire cette stacktrace.

A la relecture du code d’appel de l’adapter une erreur bas niveau (comme un NPE) qui se produirait dans le code spécifique de l’adapter n’est pas toujours bien catchée = à un endroit on fait un catch (Exception e) qui devrait être plutôt un catch (Throwable e). On va faire la modif.