Skip to content

Commit

Permalink
Allow renderd* sections to follow map sections in renderd.conf (#…
Browse files Browse the repository at this point in the history
…308)

* Allow `renderd*` sections to precede `map` sections in config file

* Adding test

* astyle formatting
  • Loading branch information
hummeltech committed Mar 9, 2023
1 parent be0d5fe commit f521540
Show file tree
Hide file tree
Showing 4 changed files with 114 additions and 69 deletions.
136 changes: 74 additions & 62 deletions src/daemon.c
Original file line number Diff line number Diff line change
Expand Up @@ -803,25 +803,26 @@ int main(int argc, char **argv)

g_logger(G_LOG_LEVEL_INFO, "Rendering daemon started (version %s)", VERSION);

g_logger(G_LOG_LEVEL_INFO, "Initialising request queue");
render_request_queue = request_queue_init();

if (render_request_queue == NULL) {
g_logger(G_LOG_LEVEL_CRITICAL, "Failed to initialise request queue");
exit(1);
}

g_logger(G_LOG_LEVEL_INFO, "Initialising request_queue");

xmlconfigitem maps[XMLCONFIGS_MAX];
bzero(maps, sizeof(xmlconfigitem) * XMLCONFIGS_MAX);

renderd_config config_slaves[MAX_SLAVES];
bzero(config_slaves, sizeof(renderd_config) * MAX_SLAVES);
bzero(&config, sizeof(renderd_config));

g_logger(G_LOG_LEVEL_INFO, "Parsing config file: %s", config_file_name);
dictionary *ini = iniparser_load(config_file_name);

if (! ini) {
if (!ini) {
g_logger(G_LOG_LEVEL_CRITICAL, "Failed to load config file: %s", config_file_name);
exit(1);
}

Expand All @@ -830,19 +831,86 @@ int main(int argc, char **argv)
int iconf = -1;
char buffer[PATH_MAX];

g_logger(G_LOG_LEVEL_DEBUG, "Parsing renderd config section(s)");

for (int section = 0; section < iniparser_getnsec(ini); section++) {
const char *name = iniparser_getsecname(ini, section);

if (strncmp(name, "renderd", 7) == 0) {
/* this is a renderd config section */
int render_sec = 0;

if (sscanf(name, "renderd%i", &render_sec) != 1) {
render_sec = 0;
}

g_logger(G_LOG_LEVEL_DEBUG, "Parsing renderd config section %i: %s", render_sec, name);

if (render_sec >= MAX_SLAVES) {
g_logger(G_LOG_LEVEL_CRITICAL, "Can't handle more than %i renderd config sections",
MAX_SLAVES);
exit(7);
}

snprintf(buffer, sizeof(buffer), "%s:socketname", name);
config_slaves[render_sec].socketname = iniparser_getstring(ini,
buffer, (char *) RENDER_SOCKET);
snprintf(buffer, sizeof(buffer), "%s:iphostname", name);
config_slaves[render_sec].iphostname = iniparser_getstring(ini,
buffer, "");
snprintf(buffer, sizeof(buffer), "%s:ipport", name);
config_slaves[render_sec].ipport = iniparser_getint(ini, buffer, 0);
snprintf(buffer, sizeof(buffer), "%s:num_threads", name);
config_slaves[render_sec].num_threads = iniparser_getint(ini,
buffer, NUM_THREADS);
snprintf(buffer, sizeof(buffer), "%s:tile_dir", name);
config_slaves[render_sec].tile_dir = iniparser_getstring(ini,
buffer, (char *) HASH_PATH);
snprintf(buffer, sizeof(buffer), "%s:stats_file", name);
config_slaves[render_sec].stats_filename = iniparser_getstring(ini,
buffer, NULL);
snprintf(buffer, sizeof(buffer), "%s:pid_file", name);
config_slaves[render_sec].pid_filename = iniparser_getstring(ini,
buffer, (char *) PIDFILE);

if (render_sec == active_slave) {
config.socketname = config_slaves[render_sec].socketname;
config.iphostname = config_slaves[render_sec].iphostname;
config.ipport = config_slaves[render_sec].ipport;
config.num_threads = config_slaves[render_sec].num_threads;
config.tile_dir = config_slaves[render_sec].tile_dir;
config.stats_filename
= config_slaves[render_sec].stats_filename;
config.pid_filename
= config_slaves[render_sec].pid_filename;
config.mapnik_plugins_dir = iniparser_getstring(ini,
"mapnik:plugins_dir", (char *) MAPNIK_PLUGINS);
config.mapnik_font_dir = iniparser_getstring(ini,
"mapnik:font_dir", (char *) FONT_DIR);
config.mapnik_font_dir_recurse = iniparser_getboolean(ini,
"mapnik:font_dir_recurse", FONT_RECURSE);
} else {
noSlaveRenders += config_slaves[render_sec].num_threads;
}
}
}

g_logger(G_LOG_LEVEL_DEBUG, "Parsing map config section(s)");

for (int section = 0; section < iniparser_getnsec(ini); section++) {
const char *name = iniparser_getsecname(ini, section);
g_logger(G_LOG_LEVEL_INFO, "Parsing section %s", name);

if (strncmp(name, "renderd", 7) && strcmp(name, "mapnik")) {
if (config.tile_dir == NULL) {
/* this is a map config section */
if (config.num_threads == NULL || config.tile_dir == NULL) {
g_logger(G_LOG_LEVEL_CRITICAL, "No valid (active) renderd config section available");
exit(7);
}

/* this is a map section */
iconf++;

g_logger(G_LOG_LEVEL_DEBUG, "Parsing map config section %i: %s", iconf, name);

if (iconf >= XMLCONFIGS_MAX) {
g_logger(G_LOG_LEVEL_CRITICAL, "Config: more than %d configurations found", XMLCONFIGS_MAX);
exit(7);
Expand Down Expand Up @@ -960,62 +1028,6 @@ int main(int argc, char **argv)
* as it is needed to configure mapniks number of connections
*/
maps[iconf].num_threads = config.num_threads;

} else if (strncmp(name, "renderd", 7) == 0) {
int render_sec = 0;

if (sscanf(name, "renderd%i", &render_sec) != 1) {
render_sec = 0;
}

g_logger(G_LOG_LEVEL_INFO, "Parsing render section %i", render_sec);

if (render_sec >= MAX_SLAVES) {
g_logger(G_LOG_LEVEL_CRITICAL, "Can't handle more than %i render sections",
MAX_SLAVES);
exit(7);
}

snprintf(buffer, sizeof(buffer), "%s:socketname", name);
config_slaves[render_sec].socketname = iniparser_getstring(ini,
buffer, (char *) RENDER_SOCKET);
snprintf(buffer, sizeof(buffer), "%s:iphostname", name);
config_slaves[render_sec].iphostname = iniparser_getstring(ini,
buffer, "");
snprintf(buffer, sizeof(buffer), "%s:ipport", name);
config_slaves[render_sec].ipport = iniparser_getint(ini, buffer, 0);
snprintf(buffer, sizeof(buffer), "%s:num_threads", name);
config_slaves[render_sec].num_threads = iniparser_getint(ini,
buffer, NUM_THREADS);
snprintf(buffer, sizeof(buffer), "%s:tile_dir", name);
config_slaves[render_sec].tile_dir = iniparser_getstring(ini,
buffer, (char *) HASH_PATH);
snprintf(buffer, sizeof(buffer), "%s:stats_file", name);
config_slaves[render_sec].stats_filename = iniparser_getstring(ini,
buffer, NULL);
snprintf(buffer, sizeof(buffer), "%s:pid_file", name);
config_slaves[render_sec].pid_filename = iniparser_getstring(ini,
buffer, (char *) PIDFILE);

if (render_sec == active_slave) {
config.socketname = config_slaves[render_sec].socketname;
config.iphostname = config_slaves[render_sec].iphostname;
config.ipport = config_slaves[render_sec].ipport;
config.num_threads = config_slaves[render_sec].num_threads;
config.tile_dir = config_slaves[render_sec].tile_dir;
config.stats_filename
= config_slaves[render_sec].stats_filename;
config.pid_filename
= config_slaves[render_sec].pid_filename;
config.mapnik_plugins_dir = iniparser_getstring(ini,
"mapnik:plugins_dir", (char *) MAPNIK_PLUGINS);
config.mapnik_font_dir = iniparser_getstring(ini,
"mapnik:font_dir", (char *) FONT_DIR);
config.mapnik_font_dir_recurse = iniparser_getboolean(ini,
"mapnik:font_dir_recurse", FONT_RECURSE);
} else {
noSlaveRenders += config_slaves[render_sec].num_threads;
}
}
}

Expand Down
5 changes: 4 additions & 1 deletion tests/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -103,8 +103,10 @@ add_test(
add_test(
NAME start_renderd
COMMAND ${BASH} -c "
echo '${PROJECT_BINARY_DIR}/src/renderd --config ${PROJECT_BINARY_DIR}/tests/conf/renderd.conf --foreground > ${PROJECT_BINARY_DIR}/tests/logs/renderd.log 2>&1 &' > ${PROJECT_BINARY_DIR}/tests/renderd_start.sh
echo '${PROJECT_BINARY_DIR}/src/renderd --config ${PROJECT_BINARY_DIR}/tests/conf/renderd.conf --foreground --slave 0 > ${PROJECT_BINARY_DIR}/tests/logs/renderd.log 2>&1 &' > ${PROJECT_BINARY_DIR}/tests/renderd_start.sh
echo 'printf \${!} > ${PROJECT_BINARY_DIR}/tests/run/renderd.pid' >> ${PROJECT_BINARY_DIR}/tests/renderd_start.sh
echo '${PROJECT_BINARY_DIR}/src/renderd --config ${PROJECT_BINARY_DIR}/tests/conf/renderd.conf --foreground --slave 1 > ${PROJECT_BINARY_DIR}/tests/logs/renderd1.log 2>&1 &' >> ${PROJECT_BINARY_DIR}/tests/renderd_start.sh
echo 'printf \${!} > ${PROJECT_BINARY_DIR}/tests/run/renderd1.pid' >> ${PROJECT_BINARY_DIR}/tests/renderd_start.sh
echo 'exit 0' >> ${PROJECT_BINARY_DIR}/tests/renderd_start.sh
${BASH} ${PROJECT_BINARY_DIR}/tests/renderd_start.sh
"
Expand Down Expand Up @@ -156,6 +158,7 @@ add_test(
NAME stop_renderd
COMMAND ${BASH} -c "
${KILL_EXECUTABLE} $(${CAT_EXECUTABLE} run/renderd.pid) && ${RM} run/renderd.pid
${KILL_EXECUTABLE} $(${CAT_EXECUTABLE} run/renderd1.pid) && ${RM} run/renderd1.pid
"
)
add_test(
Expand Down
23 changes: 23 additions & 0 deletions tests/httpd.conf.in
Original file line number Diff line number Diff line change
Expand Up @@ -36,10 +36,33 @@ Redirect /renderd-example-map/leaflet/leaflet.min.js https://unpkg.com/leaflet/d
ModTileTileDir @PROJECT_BINARY_DIR@/tests/tiles
</VirtualHost>

<VirtualHost *:8181>
LoadTileConfigFile @PROJECT_BINARY_DIR@/tests/conf/renderd.conf
ModTileBulkMode Off
ModTileCacheDurationDirty 900
ModTileCacheDurationLowZoom 9 518400
ModTileCacheDurationMax 604800
ModTileCacheDurationMediumZoom 13 86400
ModTileCacheDurationMinimum 10800
ModTileCacheLastModifiedFactor 0.20
ModTileEnableStats On
ModTileEnableTileThrottling Off
ModTileEnableTileThrottlingXForward 0
ModTileMaxLoadMissing 5
ModTileMaxLoadOld 2
ModTileMissingRequestTimeout 10
ModTileRenderdSocketAddr 127.0.0.1 8881
ModTileRequestTimeout 3
ModTileThrottlingRenders 128 0.2
ModTileThrottlingTiles 10000 1
ModTileTileDir @PROJECT_BINARY_DIR@/tests/tiles
</VirtualHost>

CustomLog logs/access_log "%h %l %u %t \"%r\" %>s %b"
ErrorLog logs/error_log
Group @NOGROUP_NAME@
Listen 8081
Listen 8181
LogLevel debug
PidFile run/httpd.pid
ServerName localhost
Expand Down
19 changes: 13 additions & 6 deletions tests/renderd.conf.in
Original file line number Diff line number Diff line change
@@ -1,9 +1,3 @@
[renderd]
pid_file=@PROJECT_BINARY_DIR@/tests/run/renderd.pid
socketname=@PROJECT_BINARY_DIR@/tests/run/renderd.sock
stats_file=@PROJECT_BINARY_DIR@/tests/run/renderd.stats
tile_dir=@PROJECT_BINARY_DIR@/tests/tiles

[mapnik]
font_dir_recurse=true
font_dir=@MAPNIK_FONTS_DIR@
Expand All @@ -13,3 +7,16 @@ plugins_dir=@MAPNIK_PLUGINS_DIR@
TILEDIR=@PROJECT_BINARY_DIR@/tests/tiles
URI=/tiles/renderd-example
XML=@PROJECT_BINARY_DIR@/tests/www/mapnik.xml

[renderd1]
iphostname=127.0.0.1
ipport=8881
pid_file=@PROJECT_BINARY_DIR@/tests/run/renderd1.pid
stats_file=@PROJECT_BINARY_DIR@/tests/run/renderd1.stats
tile_dir=@PROJECT_BINARY_DIR@/tests/tiles

[renderd]
pid_file=@PROJECT_BINARY_DIR@/tests/run/renderd.pid
socketname=@PROJECT_BINARY_DIR@/tests/run/renderd.sock
stats_file=@PROJECT_BINARY_DIR@/tests/run/renderd.stats
tile_dir=@PROJECT_BINARY_DIR@/tests/tiles

0 comments on commit f521540

Please sign in to comment.