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 List<String> attributes;
|
||||||
private String convertedQuery;
|
private String convertedQuery;
|
||||||
private String fileName;
|
|
||||||
private String urlFile;
|
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.databasesmanager.shared.StatisticalManagerException;
|
||||||
import org.gcube.portlets.user.uriresolvermanager.UriResolverManager;
|
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.BasePagingLoadResult;
|
||||||
import com.extjs.gxt.ui.client.data.PagingLoadConfig;
|
import com.extjs.gxt.ui.client.data.PagingLoadConfig;
|
||||||
import com.extjs.gxt.ui.client.data.PagingLoadResult;
|
import com.extjs.gxt.ui.client.data.PagingLoadResult;
|
||||||
import com.google.gwt.user.server.rpc.RemoteServiceServlet;
|
import com.google.gwt.user.server.rpc.RemoteServiceServlet;
|
||||||
import com.thoughtworks.xstream.XStream;
|
import com.thoughtworks.xstream.XStream;
|
||||||
|
|
||||||
|
import org.apache.bcel.generic.NEWARRAY;
|
||||||
import org.apache.log4j.Logger;
|
import org.apache.log4j.Logger;
|
||||||
|
|
||||||
public class GWTdbManagerServiceImpl extends RemoteServiceServlet implements
|
public class GWTdbManagerServiceImpl extends RemoteServiceServlet implements
|
||||||
|
@ -1403,7 +1406,7 @@ public class GWTdbManagerServiceImpl extends RemoteServiceServlet implements
|
||||||
}
|
}
|
||||||
if (value != null) {
|
if (value != null) {
|
||||||
result = (List<Result>) value;
|
result = (List<Result>) value;
|
||||||
logger.trace("dbmanager-> ** Data get from cache");
|
logger.trace("dbmanager-> Data recovered from cache");
|
||||||
updateListSubmitQueryResult(UID, result);
|
updateListSubmitQueryResult(UID, result);
|
||||||
|
|
||||||
// data = parseCVSString(result, listAttributes);
|
// data = parseCVSString(result, listAttributes);
|
||||||
|
@ -1427,7 +1430,7 @@ public class GWTdbManagerServiceImpl extends RemoteServiceServlet implements
|
||||||
|
|
||||||
//get the result bound to session
|
//get the result bound to session
|
||||||
result = getSubmitQueryResult(UID);
|
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");
|
// logger.error("dbmanager-> Error in server while loading data. variable value null");
|
||||||
// throw new Exception("Error in server while loading data.");
|
// throw new Exception("Error in server while loading data.");
|
||||||
|
@ -1907,7 +1910,7 @@ public class GWTdbManagerServiceImpl extends RemoteServiceServlet implements
|
||||||
StatisticalManagerException e = new StatisticalManagerException(
|
StatisticalManagerException e = new StatisticalManagerException(
|
||||||
smResource.description());
|
smResource.description());
|
||||||
// e.printStackTrace();
|
// e.printStackTrace();
|
||||||
// logger.error("dbmanager-> ", e);
|
logger.error("dbmanager-> Exception generated from the Statistical Manager: ", e);
|
||||||
throw e;
|
throw e;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1960,6 +1963,7 @@ public class GWTdbManagerServiceImpl extends RemoteServiceServlet implements
|
||||||
// logger.info("dbmanager-> **FILE URL " + fileRes.url());
|
// logger.info("dbmanager-> **FILE URL " + fileRes.url());
|
||||||
// logger.info("dbmanager-> **FILE MIMETYPE " + fileRes.mimeType());
|
// logger.info("dbmanager-> **FILE MIMETYPE " + fileRes.mimeType());
|
||||||
|
|
||||||
|
//TODO *** TO REMOVE
|
||||||
ScopeProvider.instance.set(scope);
|
ScopeProvider.instance.set(scope);
|
||||||
UriResolverManager resolver = new UriResolverManager("SMP");
|
UriResolverManager resolver = new UriResolverManager("SMP");
|
||||||
Map<String, String> params = new HashMap<String, String>();
|
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{
|
private synchronized net.sf.ehcache.Element getDataFromCache(String key) throws Exception{
|
||||||
net.sf.ehcache.Element data = null;
|
net.sf.ehcache.Element data = null;
|
||||||
|
boolean safe=true;
|
||||||
if(cacheManager.cacheExists("DBCache")){
|
if(cacheManager.cacheExists("DBCache")){
|
||||||
logger.info("dbmanager-> disk store path for cache: " + cacheManager.getDiskStorePath() +". Cache Status: "+DBCache.getStatus().toString());
|
logger.info("dbmanager-> disk store path for cache: " + cacheManager.getDiskStorePath() +". Cache Status: "+DBCache.getStatus().toString());
|
||||||
if (DBCache.getStatus().toString().equals(Status.STATUS_ALIVE.toString())){
|
if (DBCache.getStatus().toString().equals(Status.STATUS_ALIVE.toString())){
|
||||||
data = DBCache.get(key);
|
data = DBCache.get(key);
|
||||||
if (data!=null){
|
if (data!=null){
|
||||||
logger.trace("dbmanager-> element with key: " + key +" is in cache");
|
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
|
// clear the cache on the user request
|
||||||
|
@ -2814,7 +3020,7 @@ public class GWTdbManagerServiceImpl extends RemoteServiceServlet implements
|
||||||
// logger.info("value: " +
|
// logger.info("value: " +
|
||||||
// mapValues.get(String.valueOf(i)));
|
// mapValues.get(String.valueOf(i)));
|
||||||
// logger.info("key: " +
|
// logger.info("key: " +
|
||||||
// mapKeys.get(String.valueOf(i)));
|
// System.out.println(mapKeys.get(String.valueOf(i)));
|
||||||
outputParameters.put(mapKeys.get(String.valueOf(i)), obj);
|
outputParameters.put(mapKeys.get(String.valueOf(i)), obj);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2835,7 +3041,7 @@ public class GWTdbManagerServiceImpl extends RemoteServiceServlet implements
|
||||||
Object[] array = keys.toArray();
|
Object[] array = keys.toArray();
|
||||||
|
|
||||||
for (int i=0;i<outputParameters.size();i++){
|
for (int i=0;i<outputParameters.size();i++){
|
||||||
logger.info("dbmanager-> *** " + outputParameters
|
logger.trace("dbmanager-> *** " + outputParameters
|
||||||
.get(array[i].toString())
|
.get(array[i].toString())
|
||||||
.getName());
|
.getName());
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue