[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