Issue #1384 allow the derived parameters to function even if the database has multiple identical coverages, add cluster locking to grid coverage creation.
Former-commit-id:9cf868a9bb
[formerlyf4c534a556
] [formerly038e87f4b0
] [formerlyd0e8e3b1c3
[formerly038e87f4b0
[formerly e804d35462beea4483d6c0b01f3f61a2576b8098]]] Former-commit-id:d0e8e3b1c3
Former-commit-id: 6989c96b12a5b485bafb9ed6f457aa4f1e7e3ee1 [formerly7f18e0bbee
] Former-commit-id:e23992352e
This commit is contained in:
parent
8681aa0f62
commit
a6b0550c86
3 changed files with 139 additions and 60 deletions
|
@ -79,7 +79,7 @@ import com.raytheon.viz.alerts.observers.ProductAlertObserver;
|
|||
public class CoverageUtils implements IAlertObserver {
|
||||
private static CoverageUtils instance;
|
||||
|
||||
private final Map<String, Set<GridCoverage>> coverageCache = new HashMap<String, Set<GridCoverage>>();
|
||||
private final Map<String, Set<UniqueIdGridCoverageWrapper>> coverageCache = new HashMap<String, Set<UniqueIdGridCoverageWrapper>>();
|
||||
|
||||
private boolean hasPerformedBulkQuery = false;
|
||||
|
||||
|
@ -105,7 +105,8 @@ public class CoverageUtils implements IAlertObserver {
|
|||
*/
|
||||
public Collection<GridCoverage> getCoverages(String datasetId)
|
||||
throws VizException {
|
||||
Collection<GridCoverage> rval = coverageCache.get(datasetId);
|
||||
Collection<UniqueIdGridCoverageWrapper> rval = coverageCache
|
||||
.get(datasetId);
|
||||
|
||||
if (rval == null) {
|
||||
DbQueryRequest query = new DbQueryRequest();
|
||||
|
@ -139,17 +140,21 @@ public class CoverageUtils implements IAlertObserver {
|
|||
String resultId = (String) map
|
||||
.get(GridInfoConstants.DATASET_ID);
|
||||
GridCoverage coverage = requestedLocations.get(locationId);
|
||||
Set<GridCoverage> set = coverageCache.get(resultId);
|
||||
Set<UniqueIdGridCoverageWrapper> set = coverageCache
|
||||
.get(resultId);
|
||||
if (set == null) {
|
||||
set = new HashSet<GridCoverage>();
|
||||
set = new HashSet<UniqueIdGridCoverageWrapper>();
|
||||
coverageCache.put(resultId, set);
|
||||
}
|
||||
set.add(coverage);
|
||||
set.add(new UniqueIdGridCoverageWrapper(coverage));
|
||||
}
|
||||
rval = coverageCache.get(datasetId);
|
||||
}
|
||||
|
||||
return rval;
|
||||
List<GridCoverage> finalSet = new ArrayList<GridCoverage>(rval.size());
|
||||
for (UniqueIdGridCoverageWrapper wrapper : rval) {
|
||||
finalSet.add(wrapper.getGridCoverage());
|
||||
}
|
||||
return finalSet;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -161,12 +166,12 @@ public class CoverageUtils implements IAlertObserver {
|
|||
*/
|
||||
public void setCoverage(String modelName, GridCoverage coverage) {
|
||||
if (modelName != null && coverage != null) {
|
||||
Set<GridCoverage> set = coverageCache.get(modelName);
|
||||
Set<UniqueIdGridCoverageWrapper> set = coverageCache.get(modelName);
|
||||
if (set == null) {
|
||||
set = new HashSet<GridCoverage>();
|
||||
set = new HashSet<UniqueIdGridCoverageWrapper>();
|
||||
coverageCache.put(modelName, set);
|
||||
}
|
||||
set.add(coverage);
|
||||
set.add(new UniqueIdGridCoverageWrapper(coverage));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -326,11 +331,61 @@ public class CoverageUtils implements IAlertObserver {
|
|||
.get(GridConstants.DATASET_ID);
|
||||
GridCoverage coverage = (GridCoverage) alertMessage.decodedAlert
|
||||
.get(GridConstants.LOCATION);
|
||||
Set<GridCoverage> set = coverageCache.get(datasetId);
|
||||
Set<UniqueIdGridCoverageWrapper> set = coverageCache.get(datasetId);
|
||||
if (set != null && coverage != null) {
|
||||
set.add(coverage);
|
||||
set.add(new UniqueIdGridCoverageWrapper(coverage));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// This class exists so that two coverages that are otherwise equal can be
|
||||
// stored together in a set if they have different IDs.
|
||||
private static class UniqueIdGridCoverageWrapper {
|
||||
private final GridCoverage gridCoverage;
|
||||
|
||||
public UniqueIdGridCoverageWrapper(GridCoverage gridCoverage) {
|
||||
super();
|
||||
this.gridCoverage = gridCoverage;
|
||||
}
|
||||
|
||||
public GridCoverage getGridCoverage() {
|
||||
return gridCoverage;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
final int prime = 31;
|
||||
int result = 1;
|
||||
result = prime * result
|
||||
+ ((gridCoverage == null) ? 0 : gridCoverage.hashCode());
|
||||
result = prime
|
||||
* result
|
||||
+ ((gridCoverage.getId() == null) ? 0 : gridCoverage
|
||||
.getId().hashCode());
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object obj) {
|
||||
if (this == obj)
|
||||
return true;
|
||||
if (obj == null)
|
||||
return false;
|
||||
if (getClass() != obj.getClass())
|
||||
return false;
|
||||
UniqueIdGridCoverageWrapper other = (UniqueIdGridCoverageWrapper) obj;
|
||||
if (gridCoverage == null) {
|
||||
if (other.gridCoverage != null)
|
||||
return false;
|
||||
} else if (!gridCoverage.equals(other.gridCoverage)) {
|
||||
return false;
|
||||
} else if (!gridCoverage.getId().equals(
|
||||
other.getGridCoverage().getId())) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -21,3 +21,4 @@ Import-Package: com.raytheon.edex.db.dao,
|
|||
org.hibernate.criterion,
|
||||
org.springframework.orm.hibernate3.support
|
||||
Export-Package: com.raytheon.uf.edex.gridcoverage
|
||||
Require-Bundle: com.raytheon.uf.edex.database
|
||||
|
|
|
@ -31,6 +31,9 @@ import com.raytheon.uf.common.gridcoverage.request.GetGridCoverageRequest;
|
|||
import com.raytheon.uf.common.serialization.comm.IRequestHandler;
|
||||
import com.raytheon.uf.common.status.IUFStatusHandler;
|
||||
import com.raytheon.uf.common.status.UFStatus;
|
||||
import com.raytheon.uf.edex.database.cluster.ClusterLockUtils;
|
||||
import com.raytheon.uf.edex.database.cluster.ClusterLockUtils.LockState;
|
||||
import com.raytheon.uf.edex.database.cluster.ClusterTask;
|
||||
import com.raytheon.uf.edex.database.dao.CoreDao;
|
||||
import com.raytheon.uf.edex.database.dao.DaoConfig;
|
||||
|
||||
|
@ -78,55 +81,25 @@ public class GetGridCoverageHandler implements
|
|||
sess = dao.getSessionFactory().openSession();
|
||||
trans = sess.beginTransaction();
|
||||
|
||||
Criteria crit = sess.createCriteria(coverage.getClass());
|
||||
|
||||
crit.add(Restrictions.eq("nx", coverage.getNx()));
|
||||
crit.add(Restrictions.eq("ny", coverage.getNx()));
|
||||
crit.add(Restrictions.between("dx", coverage.getDx()
|
||||
- GridCoverage.SPATIAL_TOLERANCE, coverage.getDx()
|
||||
+ GridCoverage.SPATIAL_TOLERANCE));
|
||||
crit.add(Restrictions.between("dy", coverage.getDy()
|
||||
- GridCoverage.SPATIAL_TOLERANCE, coverage.getDy()
|
||||
+ GridCoverage.SPATIAL_TOLERANCE));
|
||||
crit.add(Restrictions.between("la1", coverage.getLa1()
|
||||
- GridCoverage.SPATIAL_TOLERANCE, coverage.getLa1()
|
||||
+ GridCoverage.SPATIAL_TOLERANCE));
|
||||
crit.add(Restrictions.between("lo1", coverage.getLo1()
|
||||
- GridCoverage.SPATIAL_TOLERANCE, coverage.getLo1()
|
||||
+ GridCoverage.SPATIAL_TOLERANCE));
|
||||
List<?> vals = crit.list();
|
||||
for (Object val : vals) {
|
||||
if (((GridCoverage) val).spatialEquals(coverage)) {
|
||||
rval = (GridCoverage) val;
|
||||
}
|
||||
}
|
||||
if (rval == null
|
||||
&& (Math.abs(coverage.getLo1()) > 179 || Math.abs(coverage
|
||||
.getLa1()) > 89)) {
|
||||
// if we got here nothing matches, try a query with no la1, and
|
||||
// lo1 in case there are world wrap issues.
|
||||
crit = sess.createCriteria(coverage.getClass());
|
||||
|
||||
crit.add(Restrictions.eq("nx", coverage.getNx()));
|
||||
crit.add(Restrictions.eq("ny", coverage.getNx()));
|
||||
crit.add(Restrictions.between("dx", coverage.getDx()
|
||||
- GridCoverage.SPATIAL_TOLERANCE, coverage.getDx()
|
||||
+ GridCoverage.SPATIAL_TOLERANCE));
|
||||
crit.add(Restrictions.between("dy", coverage.getDy()
|
||||
- GridCoverage.SPATIAL_TOLERANCE, coverage.getDy()
|
||||
+ GridCoverage.SPATIAL_TOLERANCE));
|
||||
vals = crit.list();
|
||||
for (Object val : vals) {
|
||||
if (((GridCoverage) val).spatialEquals(coverage)) {
|
||||
return (GridCoverage) val;
|
||||
}
|
||||
}
|
||||
}
|
||||
rval = query(coverage, sess);
|
||||
if (rval == null && create) {
|
||||
// if it still does not exist, create it if requested
|
||||
coverage.initialize();
|
||||
sess.saveOrUpdate(coverage);
|
||||
rval = coverage;
|
||||
ClusterTask ct = null;
|
||||
do {
|
||||
ct = ClusterLockUtils.lock("gridcoverage", "create"
|
||||
+ coverage.getProjectionType(), 120000, true);
|
||||
} while (!LockState.SUCCESSFUL.equals(ct.getLockState()));
|
||||
try {
|
||||
rval = query(coverage, sess);
|
||||
if (rval == null) {
|
||||
// if it still does not exist, create it if requested
|
||||
coverage.initialize();
|
||||
sess.saveOrUpdate(coverage);
|
||||
rval = coverage;
|
||||
}
|
||||
} finally {
|
||||
ClusterLockUtils.deleteLock(ct.getId().getName(), ct
|
||||
.getId().getDetails());
|
||||
}
|
||||
}
|
||||
|
||||
trans.commit();
|
||||
|
@ -154,4 +127,54 @@ public class GetGridCoverageHandler implements
|
|||
|
||||
return rval;
|
||||
}
|
||||
|
||||
private GridCoverage query(GridCoverage coverage, Session sess) {
|
||||
GridCoverage rval = null;
|
||||
|
||||
Criteria crit = sess.createCriteria(coverage.getClass());
|
||||
|
||||
crit.add(Restrictions.eq("nx", coverage.getNx()));
|
||||
crit.add(Restrictions.eq("ny", coverage.getNx()));
|
||||
crit.add(Restrictions.between("dx", coverage.getDx()
|
||||
- GridCoverage.SPATIAL_TOLERANCE, coverage.getDx()
|
||||
+ GridCoverage.SPATIAL_TOLERANCE));
|
||||
crit.add(Restrictions.between("dy", coverage.getDy()
|
||||
- GridCoverage.SPATIAL_TOLERANCE, coverage.getDy()
|
||||
+ GridCoverage.SPATIAL_TOLERANCE));
|
||||
crit.add(Restrictions.between("la1", coverage.getLa1()
|
||||
- GridCoverage.SPATIAL_TOLERANCE, coverage.getLa1()
|
||||
+ GridCoverage.SPATIAL_TOLERANCE));
|
||||
crit.add(Restrictions.between("lo1", coverage.getLo1()
|
||||
- GridCoverage.SPATIAL_TOLERANCE, coverage.getLo1()
|
||||
+ GridCoverage.SPATIAL_TOLERANCE));
|
||||
List<?> vals = crit.list();
|
||||
for (Object val : vals) {
|
||||
if (((GridCoverage) val).spatialEquals(coverage)) {
|
||||
rval = (GridCoverage) val;
|
||||
}
|
||||
}
|
||||
if (rval == null
|
||||
&& (Math.abs(coverage.getLo1()) > 179 || Math.abs(coverage
|
||||
.getLa1()) > 89)) {
|
||||
// if we got here nothing matches, try a query with no la1, and
|
||||
// lo1 in case there are world wrap issues.
|
||||
crit = sess.createCriteria(coverage.getClass());
|
||||
|
||||
crit.add(Restrictions.eq("nx", coverage.getNx()));
|
||||
crit.add(Restrictions.eq("ny", coverage.getNx()));
|
||||
crit.add(Restrictions.between("dx", coverage.getDx()
|
||||
- GridCoverage.SPATIAL_TOLERANCE, coverage.getDx()
|
||||
+ GridCoverage.SPATIAL_TOLERANCE));
|
||||
crit.add(Restrictions.between("dy", coverage.getDy()
|
||||
- GridCoverage.SPATIAL_TOLERANCE, coverage.getDy()
|
||||
+ GridCoverage.SPATIAL_TOLERANCE));
|
||||
vals = crit.list();
|
||||
for (Object val : vals) {
|
||||
if (((GridCoverage) val).spatialEquals(coverage)) {
|
||||
return (GridCoverage) val;
|
||||
}
|
||||
}
|
||||
}
|
||||
return rval;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue