Skip to content

Commit 48b6d30

Browse files
authored
Merge pull request #570 from groldan/bug/gwc_layer_config_propagation
2 parents 9debb9c + f4dfa54 commit 48b6d30

File tree

14 files changed

+649
-173
lines changed

14 files changed

+649
-173
lines changed

config

src/gwc/backends/pgconfig/src/main/java/org/geoserver/cloud/gwc/backend/pgconfig/CachingTileLayerInfoRepository.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,10 @@
2020
import java.util.Set;
2121
import java.util.stream.Stream;
2222

23+
/**
24+
* {@link TileLayerInfoRepository} decorator cache {@link TileLayerInfo}s on demand, alleviating the
25+
* load on the delegate, especially under load.
26+
*/
2327
@RequiredArgsConstructor
2428
@Slf4j(topic = "org.geoserver.cloud.gwc.backend.pgconfig.caching")
2529
public class CachingTileLayerInfoRepository implements TileLayerInfoRepository {

src/gwc/backends/pgconfig/src/main/java/org/geoserver/cloud/gwc/backend/pgconfig/PgconfigTileLayerInfoRepository.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
import org.geoserver.cloud.backend.pgconfig.catalog.repository.LoggingTemplate;
1212
import org.geoserver.gwc.layer.CatalogConfiguration;
1313
import org.geoserver.gwc.layer.GeoServerTileLayerInfo;
14-
import org.geoserver.gwc.layer.TileLayerCatalog;
1514
import org.geoserver.platform.resource.ResourceStore;
1615
import org.springframework.dao.DataAccessException;
1716
import org.springframework.dao.EmptyResultDataAccessException;
@@ -26,8 +25,8 @@
2625
import java.util.stream.Stream;
2726

2827
/**
29-
* Implementation of {@link TileLayerCatalog} for {@link CatalogConfiguration} to manage {@link
30-
* GeoServerTileLayerInfo}s directly from the database instead of going through {@link
28+
* Implementation of {@link TileLayerInfoRepository} for {@link CatalogConfiguration} to manage
29+
* {@link GeoServerTileLayerInfo}s directly from the database instead of going through {@link
3130
* ResourceStore}.
3231
*
3332
* @since 1.7

src/gwc/backends/pgconfig/src/main/java/org/geoserver/cloud/gwc/backend/pgconfig/TileLayerInfoRepository.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,11 @@
1010
import java.util.Set;
1111
import java.util.stream.Stream;
1212

13+
/**
14+
* {@code TileLayerInfoRepository} defines CRUD operations on {@link TileLayerInfo}.
15+
*
16+
* @see PgconfigTileLayerCatalog
17+
*/
1318
public interface TileLayerInfoRepository {
1419

1520
void add(TileLayerInfo pgInfo) throws DataAccessException;

src/gwc/core/pom.xml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,5 +45,15 @@
4545
<artifactId>gs-web-gwc</artifactId>
4646
<optional>true</optional>
4747
</dependency>
48+
<dependency>
49+
<groupId>org.xmlunit</groupId>
50+
<artifactId>xmlunit-core</artifactId>
51+
<scope>test</scope>
52+
</dependency>
53+
<dependency>
54+
<groupId>org.xmlunit</groupId>
55+
<artifactId>xmlunit-assertj</artifactId>
56+
<scope>test</scope>
57+
</dependency>
4858
</dependencies>
4959
</project>

src/gwc/core/src/main/java/org/geoserver/cloud/gwc/config/core/DefaultTileLayerCatalogConfiguration.java

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66

77
import org.geoserver.GeoServerConfigurationLock;
88
import org.geoserver.catalog.Catalog;
9-
import org.geoserver.cloud.gwc.event.TileLayerEvent;
109
import org.geoserver.cloud.gwc.repository.CachingTileLayerCatalog;
1110
import org.geoserver.cloud.gwc.repository.CloudCatalogConfiguration;
1211
import org.geoserver.cloud.gwc.repository.GeoServerTileLayerConfiguration;
@@ -16,8 +15,10 @@
1615
import org.geoserver.gwc.config.GWCConfigPersister;
1716
import org.geoserver.gwc.config.GWCInitializer;
1817
import org.geoserver.gwc.layer.CatalogConfiguration;
18+
import org.geoserver.gwc.layer.GeoServerTileLayer;
1919
import org.geoserver.gwc.layer.TileLayerCatalog;
2020
import org.geoserver.platform.resource.ResourceStore;
21+
import org.geowebcache.config.TileLayerConfiguration;
2122
import org.geowebcache.grid.GridSetBroker;
2223
import org.springframework.beans.factory.annotation.Qualifier;
2324
import org.springframework.cache.CacheManager;
@@ -29,7 +30,6 @@
2930
import org.springframework.web.context.WebApplicationContext;
3031

3132
import java.util.Optional;
32-
import java.util.function.Consumer;
3333

3434
/**
3535
* @since 1.0
@@ -57,6 +57,20 @@ DefaultGwcInitializer gwcInitializer(
5757
return new DefaultGwcInitializer(configPersister, blobStore, geoseverTileLayers, lock);
5858
}
5959

60+
/**
61+
* In vanilla GeoServer, {@link CatalogConfiguration} is the {@link TileLayerConfiguration}
62+
* contributed to the app context to serve {@code TileLayer}s ({@link GeoServerTileLayer}) out
63+
* of the GeoServer {@link Catalog} by means of a {@link TileLayerCatalog}.
64+
*
65+
* <p>Here we contribute a different {@code TileLayerConfiguration} for the same purpose, {@link
66+
* GeoServerTileLayerConfiguration}, which is a distributed-event aware decorator over the
67+
* actual {@link CloudCatalogConfiguration} implementation of {@code TileLayerCatalog}.
68+
*
69+
* <p>Since the {@code CloudCatalogConfiguration} isn't hence a spring bean, in order to avoid
70+
* registering as a delegate to {@link TileLayerDispatcher}, {@link TileLayerEvents} will need
71+
* to be relayed from {@code GeoServerTileLayerConfiguration} to {@link
72+
* CloudCatalogConfiguration#onTileLayerEventEvict()}.
73+
*/
6074
@SuppressWarnings("java:S6830")
6175
@Bean(name = "gwcCatalogConfiguration")
6276
GeoServerTileLayerConfiguration gwcCatalogConfiguration( //
@@ -66,8 +80,12 @@ GeoServerTileLayerConfiguration gwcCatalogConfiguration( //
6680
ApplicationEventPublisher eventPublisher) {
6781

6882
var config = new CloudCatalogConfiguration(catalog, tld, gsb);
69-
Consumer<TileLayerEvent> gwcEventPublisher = eventPublisher::publishEvent;
70-
return new GeoServerTileLayerConfiguration(config, gwcEventPublisher);
83+
var eventAwareConfig =
84+
new GeoServerTileLayerConfiguration(config, eventPublisher::publishEvent);
85+
// tell GeoServerTileLayerConfiguration to relay TileLayerEvents to
86+
// CloudCatalogConfiguration, since it's not a spring bean can't listen itself.
87+
eventAwareConfig.setEventListener(config::onTileLayerEventEvict);
88+
return eventAwareConfig;
7189
}
7290

7391
@Primary

src/gwc/core/src/main/java/org/geoserver/cloud/gwc/event/TileLayerEvent.java

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -41,11 +41,6 @@ public TileLayerEvent(
4141
this.name = layerName;
4242
}
4343

44-
public static TileLayerEvent ofId(
45-
@NonNull Object source, @NonNull Type eventType, @NonNull String layerId) {
46-
return new TileLayerEvent(source, eventType, layerId, layerId);
47-
}
48-
4944
public static TileLayerEvent created(
5045
@NonNull Object source, @NonNull String publishedId, @NonNull String layerName) {
5146
return valueOf(source, Type.CREATED, publishedId, layerName, null);
@@ -77,8 +72,20 @@ private static TileLayerEvent valueOf(
7772

7873
@Override
7974
public String toString() {
80-
return "%s[%s id: %s, name: %s]"
81-
.formatted(getClass().getSimpleName(), getEventType(), getPublishedId(), getName());
75+
if (null == getOldName())
76+
return "%s[%s id: %s, name: %s]"
77+
.formatted(
78+
getClass().getSimpleName(),
79+
getEventType(),
80+
getPublishedId(),
81+
getName());
82+
return "%s[%s id: %s, name: %s, oldname: %s]"
83+
.formatted(
84+
getClass().getSimpleName(),
85+
getEventType(),
86+
getPublishedId(),
87+
getName(),
88+
getOldName());
8289
}
8390

8491
protected @Override String getObjectId() {

0 commit comments

Comments
 (0)