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:
parent
aec88a2b18
commit
0f467e02b7
|
@ -11,7 +11,6 @@ public class SubmitQueryResultWithFileFromServlet extends BaseModelData
|
|||
|
||||
private List<String> attributes;
|
||||
private String convertedQuery;
|
||||
private String fileName;
|
||||
private String urlFile;
|
||||
|
||||
|
||||
|
|
|
@ -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());
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue