[mapguide-commits] r8986 - in trunk/MgDev: Oem/geos/src/io Server/src/Services/Rendering
svn_mapguide at osgeo.org
svn_mapguide at osgeo.org
Wed Jul 13 06:12:46 PDT 2016
Author: jng
Date: 2016-07-13 06:12:46 -0700 (Wed, 13 Jul 2016)
New Revision: 8986
Modified:
trunk/MgDev/Oem/geos/src/io/WKTReader.cpp
trunk/MgDev/Oem/geos/src/io/WKTWriter.cpp
trunk/MgDev/Server/src/Services/Rendering/ServerRenderingService.cpp
Log:
#2596: Resolve instability of QUERYMAPFEATURES under high server load. This is due primarily to an improperly scoped Ptr<MgResourceLayerDefinitionCacheItem> in MgServerRenderingService::RenderForSelection(), which combined with a refcount restriction when asking for such items from the 2nd level cache (presumably due to MdfModel classes not being vetted as thread-safe) could cause the cached MdfModel::LayerDefinition pointers to be prematurely deleted under high load.
Another fix is to disable the use of CLocalizer in the GEOS library. CLocalizer temporarily forces a "C" LC_NUMERIC locale (via std::setlocale()) when reading/writing WKT text. However, std::setlocale() is not thread-safe and mgserver already forces a "C" LC_NUMERIC locale on startup. Also as there is no traces of calls to std::setlocale() in the Web Tier code, the default LC_NUMERIC locale should already be "C" on the Web Tier. Thus the use of CLocalizer is redundant.
Patch originally proposed by Andreas Morf. Reviewed, refined and vetted by me.
Modified: trunk/MgDev/Oem/geos/src/io/WKTReader.cpp
===================================================================
--- trunk/MgDev/Oem/geos/src/io/WKTReader.cpp 2016-07-12 13:34:57 UTC (rev 8985)
+++ trunk/MgDev/Oem/geos/src/io/WKTReader.cpp 2016-07-13 13:12:46 UTC (rev 8986)
@@ -61,7 +61,7 @@
WKTReader::read(const string &wellKnownText)
{
//auto_ptr<StringTokenizer> tokenizer(new StringTokenizer(wellKnownText));
- CLocalizer clocale;
+ //CLocalizer clocale;
StringTokenizer tokenizer(wellKnownText);
Geometry *g=NULL;
g=readGeometryTaggedText(&tokenizer);
Modified: trunk/MgDev/Oem/geos/src/io/WKTWriter.cpp
===================================================================
--- trunk/MgDev/Oem/geos/src/io/WKTWriter.cpp 2016-07-12 13:34:57 UTC (rev 8985)
+++ trunk/MgDev/Oem/geos/src/io/WKTWriter.cpp 2016-07-13 13:12:46 UTC (rev 8986)
@@ -169,7 +169,7 @@
WKTWriter::writeFormatted(const Geometry *geometry, bool isFormatted,
Writer *writer)
{
- CLocalizer clocale;
+ //CLocalizer clocale;
this->isFormatted=isFormatted;
decimalPlaces = roundingPrecision == -1 ? geometry->getPrecisionModel()->getMaximumSignificantDigits() : roundingPrecision;
appendGeometryTaggedText(geometry, 0, writer);
Modified: trunk/MgDev/Server/src/Services/Rendering/ServerRenderingService.cpp
===================================================================
--- trunk/MgDev/Server/src/Services/Rendering/ServerRenderingService.cpp 2016-07-12 13:34:57 UTC (rev 8985)
+++ trunk/MgDev/Server/src/Services/Rendering/ServerRenderingService.cpp 2016-07-13 13:12:46 UTC (rev 8986)
@@ -1575,13 +1575,14 @@
break;
MdfModel::VectorLayerDefinition* vl = NULL;
+ Ptr<MgResourceLayerDefinitionCacheItem> cacheItem;
auto_ptr<MdfModel::LayerDefinition> ldf;
Ptr<MgResourceIdentifier> layerResId = layer->GetLayerDefinition();
if (bOnlyVisibleLayers)
{
//get the MDF layer definition
MgCacheManager* cacheManager = MgCacheManager::GetInstance();
- Ptr<MgResourceLayerDefinitionCacheItem> cacheItem = cacheManager->GetResourceLayerDefinitionCacheItem(layerResId);
+ cacheItem = cacheManager->GetResourceLayerDefinitionCacheItem(layerResId);
MdfModel::LayerDefinition* layerDefinition = cacheItem->Get();
vl = dynamic_cast<MdfModel::VectorLayerDefinition*>(layerDefinition);
}
@@ -1589,6 +1590,18 @@
{
ldf.reset(MgLayerBase::GetLayerDefinition(m_svcResource, layerResId));
vl = dynamic_cast<MdfModel::VectorLayerDefinition*>(ldf.get());
+
+ // Modify the layer scale range only for layers that are passed in
+ MdfModel::VectorScaleRangeCollection* scaleRanges = vl->GetScaleRanges();
+ if (scaleRanges)
+ {
+ MdfModel::VectorScaleRange* scaleRange = scaleRanges->GetAt(0);
+ if (scaleRange)
+ {
+ scaleRange->SetMinScale(0.0);
+ scaleRange->SetMaxScale(MdfModel::VectorScaleRange::MAX_MAP_SCALE);
+ }
+ }
}
//we can only do geometric query selection for vector layers
@@ -1596,22 +1609,6 @@
{
ACE_DEBUG ((LM_DEBUG, ACE_TEXT("(%t) RenderForSelection(): Layer: %W Vector Layer\n"), layer->GetName().c_str()));
- //check to see if we want even layers that aren't visible at the current scale
- if (!bOnlyVisibleLayers)
- {
- // Modify the layer scale range only for layers that are passed in
- MdfModel::VectorScaleRangeCollection* scaleRanges = vl->GetScaleRanges();
- if (scaleRanges)
- {
- MdfModel::VectorScaleRange* scaleRange = scaleRanges->GetAt(0);
- if (scaleRange)
- {
- scaleRange->SetMinScale(0.0);
- scaleRange->SetMaxScale(MdfModel::VectorScaleRange::MAX_MAP_SCALE);
- }
- }
- }
-
Ptr<MgResourceIdentifier> featResId = new MgResourceIdentifier(layer->GetFeatureSourceId());
//get a transform from layer coord sys to map coord sys
More information about the mapguide-commits
mailing list