[Geoserver-users] Max legend graphic memory usage exceeded.

Hello,

in my geoserver instance the generation of legend graphics does not work anymore. I use the following URL:
http://localhost:8080/geoserver/ows?service=WMS&request=GetLegendGraphic&format=image%2Fpng&height=12&width=12&layer=geodata%3Amylayer&style=&version=1.3.0&SLD_VERSION=1.1.0&LEGEND_OPTIONS=forceLabels%3Aon&SCALE=564&authkey=xxx

The errormessage is:

<ServiceExceptionReport xmlns=http://www.opengis.net/ogc xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance version=“1.3.0” xsi:schemaLocation=http://www.opengis.net/ogc https://nbmssp8/geoserver/schemas/wms/1.3.0/exceptions_1_3_0.xsd?authkey=56f60c87-989c-4f71-b2bb-14d5c8cf20e3>

Max legend graphic memory usage exceeded.

The WMS map rendering works as expected. The tomcat memory settings of the tomcat are JvmMs=1024 and JvmMx=4096.

Where can I change the setting?

I am using GeoServer Release 2.24.1. on windows.

Thanks and all the best,

Michael

I was not aware there was a limit, checking the code for that exception shows it is thrown by something called Tally.java which calculates max memory based on the max memory set aside for WMS requests.

https://github.com/geoserver/geoserver/blob/b3b3ca4985f8fba292dea910d9d3317e72b00edb/src/wms/src/main/java/org/geoserver/wms/legendgraphic/Tally.java#L26

public Tally(WMS wms) {
if (wms != null && wms.getMaxRequestMemory() > 0) {
this.maxMemory = wms.getMaxRequestMemory() * 1024L; // KB to bytes
} else {
this.maxMemory = UNLIMITED;
}
}

Consider increasing the WMS “Max rendering memory” and see if has an effected: https://docs.geoserver.org/stable/en/user/services/wms/webadmin.html

(The WMS max memory setting should be documented as “Resource consumption limits” on that page but I do not see anything).

···


Jody Garnett

Yes indeed, that’s the area. GetLegendGraphic had no max memory limit (unlike GetMap) and could be used to bring a GeoServer to OOM
by simply increasing the sample image size. Not any longer. I’m guessing Michael has a very long and complex style there, that would generate
a very large GetLegendGraphic?

···

Regards,

Andrea Aime

==
GeoServer Professional Services from the experts!

Visit http://bit.ly/gs-services-us for more information.

Ing. Andrea Aime
@geowolf
Technical Lead

GeoSolutions Group
phone: +39 0584 962313

fax: +39 0584 1660272

mob: +39 339 8844549

https://www.geosolutionsgroup.com/

http://twitter.com/geosolutions_it


Con riferimento alla normativa sul trattamento dei dati personali (Reg. UE 2016/679 - Regolamento generale sulla protezione dei dati “GDPR”), si precisa che ogni circostanza inerente alla presente email (il suo contenuto, gli eventuali allegati, etc.) è un dato la cui conoscenza è riservata al/i solo/i destinatario/i indicati dallo scrivente. Se il messaggio Le è giunto per errore, è tenuta/o a cancellarlo, ogni altra operazione è illecita. Le sarei comunque grato se potesse darmene notizia.

This email is intended only for the person or entity to which it is addressed and may contain information that is privileged, confidential or otherwise protected from disclosure. We remind that - as provided by European Regulation 2016/679 “GDPR” - copying, dissemination or use of this e-mail or the information herein by anyone other than the intended recipient is prohibited. If you have received this email by mistake, please notify us immediately by telephone or e-mail


Jody Garnett

Good morning,

thanks for your feedback. That’s really strange. The error occurs with all SLDs in my instance. Also the default simple polygon:

<?xml version="1.0" encoding="ISO-8859-1"?>

<StyledLayerDescriptor version=“1.0.0”

xsi:schemaLocation=http://www.opengis.net/sld StyledLayerDescriptor.xsd

xmlns=http://www.opengis.net/sld

xmlns:ogc=http://www.opengis.net/ogc

xmlns:xlink=http://www.w3.org/1999/xlink

xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance>

Default Polygon

Grey Polygon

A sample style that just prints out a grey interior with a black outline

Rule 1

Grey Fill and Black Outline

Grey fill with a black outline 1 pixel in width

#AAAAAA

#000000

1

The detailled exception is:

29 027 05:27:54 WARN [web.data] - Failed to build legend preview

org.geoserver.platform.ServiceException: Max legend graphic memory usage exceeded.

at org.geoserver.wms.legendgraphic.Tally.addImage(Tally.java:39)

at org.geoserver.wms.legendgraphic.ImageList.add(ImageList.java:33)

at org.geoserver.wms.legendgraphic.BufferedImageLegendGraphicBuilder.renderRules(BufferedImageLegendGraphicBuilder.java:386)

at org.geoserver.wms.legendgraphic.BufferedImageLegendGraphicBuilder.buildLegendGraphic(BufferedImageLegendGraphicBuilder.java:265)

at org.geoserver.wms.web.data.StyleAdminPanel$7.onClick(StyleAdminPanel.java:414)

at org.geoserver.web.wicket.GeoServerAjaxFormLink.onSubmit(GeoServerAjaxFormLink.java:45)

at org.apache.wicket.ajax.markup.html.form.AjaxSubmitLink$1.onSubmit(AjaxSubmitLink.java:111)

at org.apache.wicket.ajax.form.AjaxFormSubmitBehavior$AjaxFormSubmitter.onSubmit(AjaxFormSubmitBehavior.java:218)

at org.apache.wicket.markup.html.form.Form.onFormSubmitted(Form.java:787)

at org.apache.wicket.ajax.form.AjaxFormSubmitBehavior.onEvent(AjaxFormSubmitBehavior.java:174)

at org.apache.wicket.ajax.AjaxEventBehavior.respond(AjaxEventBehavior.java:155)

at org.apache.wicket.ajax.AbstractDefaultAjaxBehavior.onRequest(AbstractDefaultAjaxBehavior.java:601)

at jdk.internal.reflect.GeneratedMethodAccessor325.invoke(Unknown Source)

at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)

at java.base/java.lang.reflect.Method.invoke(Unknown Source)

at org.apache.wicket.RequestListenerInterface.internalInvoke(RequestListenerInterface.java:258)

at org.apache.wicket.RequestListenerInterface.invoke(RequestListenerInterface.java:241)

at org.apache.wicket.core.request.handler.ListenerInterfaceRequestHandler.invokeListener(ListenerInterfaceRequestHandler.java:248)

at org.apache.wicket.core.request.handler.ListenerInterfaceRequestHandler.respond(ListenerInterfaceRequestHandler.java:234)

at org.apache.wicket.request.cycle.RequestCycle$HandlerExecutor.respond(RequestCycle.java:895)

at org.apache.wicket.request.RequestHandlerStack.execute(RequestHandlerStack.java:64)

at org.apache.wicket.request.cycle.RequestCycle.execute(RequestCycle.java:265)

at org.apache.wicket.request.cycle.RequestCycle.processRequest(RequestCycle.java:222)

at org.apache.wicket.request.cycle.RequestCycle.processRequestAndDetach(RequestCycle.java:293)

at org.apache.wicket.protocol.http.WicketFilter.processRequestCycle(WicketFilter.java:261)

at org.apache.wicket.protocol.http.WicketFilter.processRequest(WicketFilter.java:203)

at org.apache.wicket.protocol.http.WicketServlet.doPost(WicketServlet.java:159)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:555)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:623)

at org.springframework.web.servlet.mvc.ServletWrappingController.handleRequestInternal(ServletWrappingController.java:166)

at org.springframework.web.servlet.mvc.AbstractController.handleRequest(AbstractController.java:177)

at org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter.handle(SimpleControllerHandlerAdapter.java:51)

at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1072)

at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:965)

at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)

at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:555)

at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:623)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:209)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153)

at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153)

at org.apache.catalina.filters.CorsFilter.handleNonCORS(CorsFilter.java:331)

at org.apache.catalina.filters.CorsFilter.doFilter(CorsFilter.java:158)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153)

at org.geoserver.filters.ThreadLocalsCleanupFilter.doFilter(ThreadLocalsCleanupFilter.java:28)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153)

at org.geoserver.filters.SpringDelegatingFilter$Chain.doFilter(SpringDelegatingFilter.java:73)

at org.geoserver.ows.HTTPHeadersCollector.doFilter(HTTPHeadersCollector.java:48)

at org.geoserver.filters.SpringDelegatingFilter$Chain.doFilter(SpringDelegatingFilter.java:70)

at org.geoserver.filters.HTTPMethodFilter.doFilter(HTTPMethodFilter.java:36)

at org.geoserver.filters.SpringDelegatingFilter$Chain.doFilter(SpringDelegatingFilter.java:70)

at org.geoserver.filters.LoggingFilter.doFilter(LoggingFilter.java:194)

at org.geoserver.filters.SpringDelegatingFilter$Chain.doFilter(SpringDelegatingFilter.java:70)

at org.geoserver.filters.SpringDelegatingFilter.doFilter(SpringDelegatingFilter.java:43)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153)

at org.geoserver.platform.AdvancedDispatchFilter.doFilter(AdvancedDispatchFilter.java:39)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153)

at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:337)

at org.geoserver.security.filter.GeoServerCompositeFilter$NestedFilterChain.doFilter(GeoServerCompositeFilter.java:71)

at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:115)

at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:81)

at org.geoserver.security.filter.GeoServerCompositeFilter$NestedFilterChain.doFilter(GeoServerCompositeFilter.java:75)

at org.geoserver.security.filter.GeoServerCompositeFilter.doFilter(GeoServerCompositeFilter.java:92)

at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346)

at org.geoserver.security.filter.GeoServerCompositeFilter$NestedFilterChain.doFilter(GeoServerCompositeFilter.java:71)

at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:122)

at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:116)

at org.geoserver.security.filter.GeoServerCompositeFilter$NestedFilterChain.doFilter(GeoServerCompositeFilter.java:75)

at org.geoserver.security.filter.GeoServerCompositeFilter.doFilter(GeoServerCompositeFilter.java:92)

at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346)

at org.geoserver.security.filter.GeoServerAnonymousAuthenticationFilter.doFilter(GeoServerAnonymousAuthenticationFilter.java:53)

at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346)

at org.geoserver.security.filter.GeoServerCompositeFilter$NestedFilterChain.doFilter(GeoServerCompositeFilter.java:71)

at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:223)

at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:217)

at org.geoserver.security.filter.GeoServerCompositeFilter$NestedFilterChain.doFilter(GeoServerCompositeFilter.java:75)

at org.geoserver.security.filter.GeoServerCompositeFilter.doFilter(GeoServerCompositeFilter.java:92)

at org.geoserver.security.filter.GeoServerUserNamePasswordAuthenticationFilter.doFilter(GeoServerUserNamePasswordAuthenticationFilter.java:122)

at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346)

at org.geoserver.security.filter.GeoServerCompositeFilter$NestedFilterChain.doFilter(GeoServerCompositeFilter.java:71)

at org.springframework.security.web.authentication.rememberme.RememberMeAuthenticationFilter.doFilter(RememberMeAuthenticationFilter.java:106)

at org.springframework.security.web.authentication.rememberme.RememberMeAuthenticationFilter.doFilter(RememberMeAuthenticationFilter.java:97)

at org.geoserver.security.filter.GeoServerCompositeFilter$NestedFilterChain.doFilter(GeoServerCompositeFilter.java:75)

at org.geoserver.security.filter.GeoServerCompositeFilter.doFilter(GeoServerCompositeFilter.java:92)

at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346)

at org.geoserver.security.filter.GeoServerCompositeFilter$NestedFilterChain.doFilter(GeoServerCompositeFilter.java:71)

at org.geoserver.security.filter.GeoServerSecurityContextPersistenceFilter$1.doFilterInternal(GeoServerSecurityContextPersistenceFilter.java:72)

at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)

at org.geoserver.security.filter.GeoServerCompositeFilter$NestedFilterChain.doFilter(GeoServerCompositeFilter.java:75)

at org.geoserver.security.filter.GeoServerCompositeFilter.doFilter(GeoServerCompositeFilter.java:92)

at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346)

at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:221)

at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:186)

at org.geoserver.security.GeoServerSecurityFilterChainProxy.doFilter(GeoServerSecurityFilterChainProxy.java:142)

at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:354)

at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:267)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153)

at org.geoserver.filters.XFrameOptionsFilter.doFilter(XFrameOptionsFilter.java:100)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153)

at org.geoserver.filters.GZIPFilter.doFilter(GZIPFilter.java:48)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153)

at org.geoserver.filters.SessionDebugFilter.doFilter(SessionDebugFilter.java:49)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153)

at org.geoserver.filters.FlushSafeFilter.doFilter(FlushSafeFilter.java:42)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153)

at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)

at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153)

at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:168)

at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90)

at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:481)

at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:130)

at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)

at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:670)

at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)

at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342)

at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:390)

at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)

at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:928)

at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1794)

at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)

at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)

at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)

at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)

at java.base/java.lang.Thread.run(Unknown Source)

29 027 05:27:54 TRACE [geoserver.platform] - Found Property override: ‘wicket.configuration’ to be unset

The Tomcat itself occupies at around 1,5 GB of the allowed 4GBs of memory. The WMS services itself produce the maps as expected.

All the best,

Michael

···

Von: Andrea Aime <andrea.aime@…10949…>
Gesendet: Mittwoch, 26. Juni 2024 09:36
An: Jody Garnett <jody.garnett@…84…>
Cc: Michael STEIGEMANN <ms@…2362…>; geoserver-users@lists.sourceforge.net
Betreff: Re: [Geoserver-users] Max legend graphic memory usage exceeded.

Yes indeed, that’s the area. GetLegendGraphic had no max memory limit (unlike GetMap) and could be used to bring a GeoServer to OOM

by simply increasing the sample image size. Not any longer. I’m guessing Michael has a very long and complex style there, that would generate

a very large GetLegendGraphic?

Regards,

Andrea Aime

==
GeoServer Professional Services from the experts!

Visit http://bit.ly/gs-services-us for more information.

Ing. Andrea Aime
@geowolf
Technical Lead

GeoSolutions Group
phone: +39 0584 962313

fax: +39 0584 1660272

mob: +39 339 8844549

https://www.geosolutionsgroup.com/

http://twitter.com/geosolutions_it


Con riferimento alla normativa sul trattamento dei dati personali (Reg. UE 2016/679 - Regolamento generale sulla protezione dei dati “GDPR”), si precisa che ogni circostanza inerente alla presente email (il suo contenuto, gli eventuali allegati, etc.) è un dato la cui conoscenza è riservata al/i solo/i destinatario/i indicati dallo scrivente. Se il messaggio Le è giunto per errore, è tenuta/o a cancellarlo, ogni altra operazione è illecita. Le sarei comunque grato se potesse darmene notizia.

This email is intended only for the person or entity to which it is addressed and may contain information that is privileged, confidential or otherwise protected from disclosure. We remind that - as provided by European Regulation 2016/679 “GDPR” - copying, dissemination or use of this e-mail or the information herein by anyone other than the intended recipient is prohibited. If you have received this email by mistake, please notify us immediately by telephone or e-mail

On Wed, Jun 26, 2024 at 8:30 AM Jody Garnett <jody.garnett@…84…> wrote:

I was not aware there was a limit, checking the code for that exception shows it is thrown by something called Tally.java which calculates max memory based on the max memory set aside for WMS requests.

https://github.com/geoserver/geoserver/blob/b3b3ca4985f8fba292dea910d9d3317e72b00edb/src/wms/src/main/java/org/geoserver/wms/legendgraphic/Tally.java#L26

public Tally(WMS wms) {

if (wms != null && wms.getMaxRequestMemory() > 0) {

this.maxMemory = wms.getMaxRequestMemory() * 1024L; // KB to bytes

} else {

this.maxMemory = UNLIMITED;

}

}

Consider increasing the WMS “Max rendering memory” and see if has an effected: https://docs.geoserver.org/stable/en/user/services/wms/webadmin.html

(The WMS max memory setting should be documented as “Resource consumption limits” on that page but I do not see anything).

Jody Garnett

On Jun 25, 2024 at 1:27:01 PM, Michael STEIGEMANN via Geoserver-users <geoserver-users@lists.sourceforge.net> wrote:

Hello,

in my geoserver instance the generation of legend graphics does not work anymore. I use the following URL:
http://localhost:8080/geoserver/ows?service=WMS&request=GetLegendGraphic&format=image%2Fpng&height=12&width=12&layer=geodata%3Amylayer&style=&version=1.3.0&SLD_VERSION=1.1.0&LEGEND_OPTIONS=forceLabels%3Aon&SCALE=564&authkey=xxx

The errormessage is:

<ServiceExceptionReport xmlns=http://www.opengis.net/ogc xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance version=“1.3.0” xsi:schemaLocation=http://www.opengis.net/ogc https://nbmssp8/geoserver/schemas/wms/1.3.0/exceptions_1_3_0.xsd?authkey=56f60c87-989c-4f71-b2bb-14d5c8cf20e3>

Max legend graphic memory usage exceeded.

The WMS map rendering works as expected. The tomcat memory settings of the tomcat are JvmMs=1024 and JvmMx=4096.

Where can I change the setting?

I am using GeoServer Release 2.24.1. on windows.

Thanks and all the best,

Michael


Geoserver-users mailing list

Please make sure you read the following two resources before posting to this list:

If you want to request a feature or an improvement, also see this: https://github.com/geoserver/geoserver/wiki/Successfully-requesting-and-integrating-new-features-and-improvements-in-GeoServer

Geoserver-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/geoserver-users


Geoserver-users mailing list

Please make sure you read the following two resources before posting to this list:

If you want to request a feature or an improvement, also see this: https://github.com/geoserver/geoserver/wiki/Successfully-requesting-and-integrating-new-features-and-improvements-in-GeoServer

Geoserver-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/geoserver-users