]> git.openstreetmap.org Git - nominatim.git/commitdiff
stop treating capital cities as villages, memory leak on deadlock
authorBrian Quinion <openstreetmap@brian.quinion.co.uk>
Tue, 8 Feb 2011 12:09:11 +0000 (12:09 +0000)
committerBrian Quinion <openstreetmap@brian.quinion.co.uk>
Tue, 8 Feb 2011 12:09:11 +0000 (12:09 +0000)
nominatim/export.c
nominatim/index.c
sql/functions.sql
sql/partitions.src.sql

index 8051c183ddd18183379a0313afa6f51500d2013c..9a2f57ad1f383323b887a6df55a1bc5fabd3eab3 100644 (file)
@@ -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 );
index 5d10994cc465cfe6043e65235b163bd92162445d..55f3c578f55b73b0aaadb59d81e8686dbb46e9b4 100644 (file)
@@ -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 *)&paramPlaceID;
@@ -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);
                        }
                }
index 157c1525f5a2b810a8818f83a04e4e305e4c45dd..62829ffe11402a9d54a5019d558305de3dd0abfd 100644 (file)
@@ -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;
index 85671f864588fa5291d575f449e2c6547e81edb7..389d7c7f958454a8318242a34f9a887c34dc54aa 100644 (file)
@@ -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;