From c71cb63f38cacb217755ecf40c4b7a60794676c6 Mon Sep 17 00:00:00 2001 From: Brian Quinion Date: Tue, 8 Feb 2011 12:09:11 +0000 Subject: [PATCH] stop treating capital cities as villages, memory leak on deadlock --- nominatim/export.c | 2 +- nominatim/index.c | 15 +++++++++------ sql/functions.sql | 5 ++++- sql/partitions.src.sql | 8 +++++++- 4 files changed, 21 insertions(+), 9 deletions(-) diff --git a/nominatim/export.c b/nominatim/export.c index 8051c183..9a2f57ad 100644 --- a/nominatim/export.c +++ b/nominatim/export.c @@ -367,7 +367,7 @@ void nominatim_exportPlace(uint64_t place_id, PGconn * conn, // Add, modify or delete? if (prevQuerySet) { - if ((PQgetvalue(prevQuerySet->res, 0, 14) && strcmp(PQgetvalue(prevQuerySet->res, 0, 14), "100") == 0) || PQntuples(querySet.res)) + if ((PQgetvalue(prevQuerySet->res, 0, 14) && strcmp(PQgetvalue(prevQuerySet->res, 0, 14), "100") == 0) || PQntuples(querySet.res) == 0) { // Delete if (writer_mutex) pthread_mutex_lock( writer_mutex ); diff --git a/nominatim/index.c b/nominatim/index.c index 5d10994c..55f3c578 100644 --- a/nominatim/index.c +++ b/nominatim/index.c @@ -343,13 +343,14 @@ void *nominatim_indexThread(void * thread_data_in) updateStartTime = time(0); int done = 0; + + if (thread_data->writer) + { + nominatim_exportPlaceQueries(place_id, thread_data->conn, &querySet); + } + while(!done) { - if (thread_data->writer) - { - nominatim_exportPlaceQueries(place_id, thread_data->conn, &querySet); - } - paramPlaceID = PGint32(place_id); paramValues[0] = (char *)¶mPlaceID; @@ -363,12 +364,14 @@ void *nominatim_indexThread(void * thread_data_in) if (strncmp(PQerrorMessage(thread_data->conn), "ERROR: deadlock detected", 25)) { fprintf(stderr, "index_placex: UPDATE failed - deadlock, retrying\n"); + PQclear(res); + sleep(rand() % 10); } else { fprintf(stderr, "index_placex: UPDATE failed: %s", PQerrorMessage(thread_data->conn)); PQclear(res); - sleep(5); + sleep(rand() % 10); // exit(EXIT_FAILURE); } } diff --git a/sql/functions.sql b/sql/functions.sql index 157c1525..62829ffe 100644 --- a/sql/functions.sql +++ b/sql/functions.sql @@ -1477,9 +1477,12 @@ BEGIN -- try using the isin value to find parent places IF array_upper(isin_tokens, 1) IS NOT NULL THEN FOR i IN 1..array_upper(isin_tokens, 1) LOOP ---RAISE WARNING ' ISIN: % % % %',NEW.partition, place_centroid, search_maxrank, isin_tokens[i]; +--RAISE WARNING ' getNearestNamedFeature: % % % %',NEW.partition, place_centroid, search_maxrank, isin_tokens[i]; FOR location IN SELECT * from getNearestNamedFeature(NEW.partition, place_centroid, search_maxrank, isin_tokens[i]) LOOP + +--RAISE WARNING ' ISIN: %',location; + nameaddress_vector := array_merge(nameaddress_vector, location.keywords::integer[]); INSERT INTO place_addressline VALUES (NEW.place_id, location.place_id, false, NOT address_havelevel[location.rank_address], location.distance, location.rank_address); address_havelevel[location.rank_address] := true; diff --git a/sql/partitions.src.sql b/sql/partitions.src.sql index 85671f86..389d7c7f 100644 --- a/sql/partitions.src.sql +++ b/sql/partitions.src.sql @@ -61,7 +61,13 @@ BEGIN UNION ALL SELECT * FROM location_area_country WHERE ST_Contains(geometry, point) and rank_search < maxrank ) as location_area - ORDER BY rank_address desc, isin_tokens && keywords desc, isguess asc, ST_Distance(point, centroid) * CASE WHEN rank_address = 16 AND rank_search = 16 THEN 0.25 WHEN rank_address = 16 AND rank_search = 17 THEN 0.5 ELSE 1 END ASC + ORDER BY rank_address desc, isin_tokens && keywords desc, isguess asc, + ST_Distance(point, centroid) * + CASE + WHEN rank_address = 16 AND rank_search = 15 THEN 0.2 -- capital city + WHEN rank_address = 16 AND rank_search = 16 THEN 0.25 -- city + WHEN rank_address = 16 AND rank_search = 17 THEN 0.5 -- town + ELSE 1 END ASC -- everything else LOOP RETURN NEXT r; END LOOP; -- 2.39.5