From 0f467e02b706c4145f21fd01457075491b8286f1 Mon Sep 17 00:00:00 2001 From: Loredana Liccardo Date: Fri, 21 Nov 2014 11:31:56 +0000 Subject: [PATCH] bug fixed for ehcache. The operation of the cache-diskstore pair seems not operate in a correct way when retrieving a big object composed of many data. When a big object is retrieved, some data, previously stored, have been corrupted. In order to solve the problem, a safe procedure has been implemented that, once recovered the data from cache, checks if the data are corrupt. If yes, they need to be recovered again git-svn-id: https://svn.d4science.research-infrastructures.eu/gcube/trunk/portlets/user/databases-manager-portlet@101672 82a268e6-3cf1-43bd-a215-b396298e98cf --- .../SubmitQueryResultWithFileFromServlet.java | 1 - .../server/GWTdbManagerServiceImpl.java | 220 +++++++++++++++++- 2 files changed, 213 insertions(+), 8 deletions(-) diff --git a/src/main/java/org/gcube/portlets/user/databasesmanager/client/datamodel/SubmitQueryResultWithFileFromServlet.java b/src/main/java/org/gcube/portlets/user/databasesmanager/client/datamodel/SubmitQueryResultWithFileFromServlet.java index c2b1a90..0b92b53 100644 --- a/src/main/java/org/gcube/portlets/user/databasesmanager/client/datamodel/SubmitQueryResultWithFileFromServlet.java +++ b/src/main/java/org/gcube/portlets/user/databasesmanager/client/datamodel/SubmitQueryResultWithFileFromServlet.java @@ -11,7 +11,6 @@ public class SubmitQueryResultWithFileFromServlet extends BaseModelData private List attributes; private String convertedQuery; - private String fileName; private String urlFile; diff --git a/src/main/java/org/gcube/portlets/user/databasesmanager/server/GWTdbManagerServiceImpl.java b/src/main/java/org/gcube/portlets/user/databasesmanager/server/GWTdbManagerServiceImpl.java index fc06002..33b1250 100644 --- a/src/main/java/org/gcube/portlets/user/databasesmanager/server/GWTdbManagerServiceImpl.java +++ b/src/main/java/org/gcube/portlets/user/databasesmanager/server/GWTdbManagerServiceImpl.java @@ -74,11 +74,14 @@ import org.gcube.portlets.user.databasesmanager.shared.SessionExpiredException; import org.gcube.portlets.user.databasesmanager.shared.StatisticalManagerException; import org.gcube.portlets.user.uriresolvermanager.UriResolverManager; +import com.extjs.gxt.ui.client.data.BaseModelData; import com.extjs.gxt.ui.client.data.BasePagingLoadResult; import com.extjs.gxt.ui.client.data.PagingLoadConfig; import com.extjs.gxt.ui.client.data.PagingLoadResult; import com.google.gwt.user.server.rpc.RemoteServiceServlet; import com.thoughtworks.xstream.XStream; + +import org.apache.bcel.generic.NEWARRAY; import org.apache.log4j.Logger; public class GWTdbManagerServiceImpl extends RemoteServiceServlet implements @@ -1403,7 +1406,7 @@ public class GWTdbManagerServiceImpl extends RemoteServiceServlet implements } if (value != null) { result = (List) value; - logger.trace("dbmanager-> ** Data get from cache"); + logger.trace("dbmanager-> Data recovered from cache"); updateListSubmitQueryResult(UID, result); // data = parseCVSString(result, listAttributes); @@ -1427,7 +1430,7 @@ public class GWTdbManagerServiceImpl extends RemoteServiceServlet implements //get the result bound to session result = getSubmitQueryResult(UID); - logger.trace("dbmanager-> ** Data get from ASL session"); + logger.trace("dbmanager-> Data recovered from ASL session"); // logger.error("dbmanager-> Error in server while loading data. variable value null"); // throw new Exception("Error in server while loading data."); @@ -1907,7 +1910,7 @@ public class GWTdbManagerServiceImpl extends RemoteServiceServlet implements StatisticalManagerException e = new StatisticalManagerException( smResource.description()); // e.printStackTrace(); - // logger.error("dbmanager-> ", e); + logger.error("dbmanager-> Exception generated from the Statistical Manager: ", e); throw e; } } @@ -1960,6 +1963,7 @@ public class GWTdbManagerServiceImpl extends RemoteServiceServlet implements // logger.info("dbmanager-> **FILE URL " + fileRes.url()); // logger.info("dbmanager-> **FILE MIMETYPE " + fileRes.mimeType()); + //TODO *** TO REMOVE ScopeProvider.instance.set(scope); UriResolverManager resolver = new UriResolverManager("SMP"); Map params = new HashMap(); @@ -2145,17 +2149,219 @@ public class GWTdbManagerServiceImpl extends RemoteServiceServlet implements private synchronized net.sf.ehcache.Element getDataFromCache(String key) throws Exception{ net.sf.ehcache.Element data = null; - + boolean safe=true; if(cacheManager.cacheExists("DBCache")){ logger.info("dbmanager-> disk store path for cache: " + cacheManager.getDiskStorePath() +". Cache Status: "+DBCache.getStatus().toString()); if (DBCache.getStatus().toString().equals(Status.STATUS_ALIVE.toString())){ data = DBCache.get(key); if (data!=null){ logger.trace("dbmanager-> element with key: " + key +" is in cache"); + safe=isSafe(data.getObjectValue()); + logger.info("dbmanager-> Safe procedure Status: " + safe); } } } - return data; + + + if(safe){ + return data; + } else{ + return null; + } +// return data; + } + + //method that checks if data retrieved from cache are not corrupted.This fixes an ehcache bug if a big object is moved in the heap. + private boolean isSafe(Object obj) throws Exception{ + boolean safe=true; + logger.info("dbmanager-> Starting the safe procedure on data..."); + + if(obj instanceof SubmitQueryResultWithFileFromServlet){ + logger.info("dbmanager-> object is a SubmitQueryResultWithFileFromServlet"); + SubmitQueryResultWithFileFromServlet elem = new SubmitQueryResultWithFileFromServlet(); + elem = (SubmitQueryResultWithFileFromServlet)obj; + + try{ + if ((elem.getProperties()!=null)&&(elem.getProperties().size()==0)){ + safe=false; + logger.trace("dbmanager-> data not safe"); +// System.out.println("status variable safe: " + safe); + } + }catch (NullPointerException e) { + // TODO: handle exception + logger.error("dbmanager-> ", e); + safe=false; + logger.trace("dbmanager-> data not safe"); + } +// if ((elem.getProperties()!=null)&&(elem.getProperties().size()==0)){ +// safe=false; +// logger.trace("data not safe"); +//// System.out.println("status variable safe: " + safe); +// } +// else{ + if(safe==true){ + //check attributes + List attributes = new ArrayList(); + attributes = elem.getListOutput(); + if(attributes.size()!=0){ + + checkAttributes: for(int i=0;i attributes data not safe"); +// System.out.println("status variable safe: " + safe); + break checkAttributes; + } + } + + } + + //check converted query + if(elem.getConvertedQuery()==null){ + safe=false; + logger.trace("dbmanager-> converted query not safe"); +// System.out.println("status variable safe: " + safe); + }else if(elem.getUrlFile()==null){ + //check url file + safe=false; + logger.trace("dbmanager-> file url not safe"); +// System.out.println("status variable safe: " + safe); + } + } +// } + }else if(obj instanceof SamplingResultWithFileFromServlet){ + logger.info("dbmanager-> object is a SamplingResultWithFileFromServlet"); + SamplingResultWithFileFromServlet elem = new SamplingResultWithFileFromServlet(); + elem = (SamplingResultWithFileFromServlet)obj; + + try{ + if((elem.getProperties()!=null)&&(elem.getProperties().size()==0)){ + safe=false; + logger.trace("dbmanager-> data not safe"); + // System.out.println("status variable safe: " + safe); + } + }catch (NullPointerException e) { + // TODO: handle exception + logger.error("dbmanager-> ", e); + safe=false; + logger.trace("dbmanager-> data not safe"); + } +// else{ + + if (safe==true){ + //check output + List output = new ArrayList(); + output = elem.getListOutput(); + if(output.size()!=0){ + checkOutput: for(int i=0;i output not safe"); +// System.out.println("status variable safe: " + safe); + break checkOutput; + } + }catch (NullPointerException e) { + // TODO: handle exception + logger.error("dbmanager-> ", e); + safe=false; + logger.trace("dbmanager-> output not safe"); +// System.out.println("status variable safe: " + safe); + break checkOutput; + } + + } + + } + + //check file name + if(elem.getFileName()==null){ + safe=false; + logger.trace("dbmanager-> file name not safe"); +// System.out.println("status variable safe: " + safe); + } + } +// } + + }else if(obj instanceof ArrayList){ + try{ + + List list = new ArrayList(); + list = (ArrayList)obj; +// System.out.println("size: " + list.size()); + checkResult: for (int i = 0; i < list.size(); i++) { + try{ + if ((list.get(i).getProperties()!=null)&&(list.get(i).getProperties().size()==0)){ + safe = false; + logger.trace("dbmanager-> data not safe"); +// System.out.println("status variable safe: " + safe); + break checkResult; + }; + }catch (NullPointerException e1) { + // TODO: handle exception + logger.error("dbmanager-> ", e1); + safe = false; + logger.trace("dbmanager-> data not safe"); +// System.out.println("status variable safe: " + safe); + break checkResult; + } + + } + logger.info("dbmanager-> object is a list"); + }catch (java.lang.ClassCastException e) { + List list = new ArrayList(); + list = (ArrayList)obj; +// System.out.println("size: " + list.size()); + checkFileModel: for (int i = 0; i < list.size(); i++) { + try{ + if ((list.get(i).getProperties()!=null)&&(list.get(i).getProperties().size()==0)){ + safe = false; + logger.trace("dbmanager-> data not safe"); +// System.out.println("status variable safe: " + safe); + break checkFileModel; + }; + }catch (NullPointerException excp) { + // TODO: handle exception + logger.error("dbmanager-> ", excp); + safe = false; + logger.trace("dbmanager-> data not safe"); +// System.out.println("status variable safe: " + safe); + break checkFileModel; + } + + } + logger.info("dbmanager-> object is a list"); + } + + }else if(obj instanceof LinkedHashMap){ + logger.info("dbmanager-> object is a LinkedHashMap"); + LinkedHashMap map = new LinkedHashMap(); + map = (LinkedHashMap)obj; +// System.out.println("size: " + map.size()); + Set keys = map.keySet(); + Object[] array = keys.toArray(); + + checkHashMap: for (int i=0;i data not safe"); +// System.out.println("status variable safe: " + safe); + break checkHashMap; + } + }catch (NullPointerException e) { + // TODO: handle exception + logger.error("dbmanager-> ", e); + safe = false; + logger.trace("dbmanager-> data not safe"); +// System.out.println("status variable safe: " + safe); + break checkHashMap; + } + } + } + + logger.info("dbmanager-> Safe procedure finished."); + return safe; } // clear the cache on the user request @@ -2814,7 +3020,7 @@ public class GWTdbManagerServiceImpl extends RemoteServiceServlet implements // logger.info("value: " + // mapValues.get(String.valueOf(i))); // logger.info("key: " + - // mapKeys.get(String.valueOf(i))); +// System.out.println(mapKeys.get(String.valueOf(i))); outputParameters.put(mapKeys.get(String.valueOf(i)), obj); } @@ -2835,7 +3041,7 @@ public class GWTdbManagerServiceImpl extends RemoteServiceServlet implements Object[] array = keys.toArray(); for (int i=0;i *** " + outputParameters + logger.trace("dbmanager-> *** " + outputParameters .get(array[i].toString()) .getName()); }