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
This commit is contained in:
Loredana Liccardo 2014-11-21 11:31:56 +00:00
parent aec88a2b18
commit 0f467e02b7
2 changed files with 213 additions and 8 deletions

View File

@ -11,7 +11,6 @@ public class SubmitQueryResultWithFileFromServlet extends BaseModelData
private List<String> attributes;
private String convertedQuery;
private String fileName;
private String urlFile;

View File

@ -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<Result>) 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<String, String> params = new HashMap<String, String>();
@ -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<String> attributes = new ArrayList<String>();
attributes = elem.getListOutput();
if(attributes.size()!=0){
checkAttributes: for(int i=0;i<attributes.size();i++){
if(attributes.get(i)==null){
safe=false;
logger.trace("dbmanager-> 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<Result> output = new ArrayList<Result>();
output = elem.getListOutput();
if(output.size()!=0){
checkOutput: for(int i=0;i<output.size();i++){
try{
if((output.get(i).getProperties()!=null)&&(output.get(i).getProperties().size()==0)){
safe=false;
logger.trace("dbmanager-> 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<Result> list = new ArrayList<Result>();
list = (ArrayList<Result>)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<Result>");
}catch (java.lang.ClassCastException e) {
List<FileModel> list = new ArrayList<FileModel>();
list = (ArrayList<FileModel>)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<FileModel>");
}
}else if(obj instanceof LinkedHashMap){
logger.info("dbmanager-> object is a LinkedHashMap");
LinkedHashMap<String, FileModel> map = new LinkedHashMap<String, FileModel>();
map = (LinkedHashMap<String, FileModel>)obj;
// System.out.println("size: " + map.size());
Set<String> keys = map.keySet();
Object[] array = keys.toArray();
checkHashMap: for (int i=0;i<map.size();i++){
try{
if((map.get(array[i].toString()).getProperties()!=null)&&(map.get(array[i].toString()).getProperties().size()==0)){
safe = false;
logger.trace("dbmanager-> 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.size();i++){
logger.info("dbmanager-> *** " + outputParameters
logger.trace("dbmanager-> *** " + outputParameters
.get(array[i].toString())
.getName());
}