I know what causes the "sorry, too many clients already" error, but the number of connections shouldn't grow so big.. so i guess the table (category_tree) got locked. We do REINDEX every 5 minutes because the table gets updated very often and the query's took a lot of time. I think since we use autovacuum now, it's not needed anymore.

Here's the fuction itself..

DECLARE
   row RECORD;
BEGIN
   UPDATE category_tree SET item_count = 0;
FOR row IN SELECT
               count(I.item_id) AS itemcount
               ,CT.node_left
               ,CT.node_right
           FROM
               items I
               JOIN category_tree CT ON (I.category1=CT.category_id)
           WHERE
               date_start <= now()
               AND date_end >= now()
               AND item_status = 1
               AND I.view_group IS NULL
           GROUP BY
               node_left||node_right,
               node_left,
               node_right

           LOOP
UPDATE category_tree SET item_count = item_count + row.itemcount where node_left <= row.node_left AND node_right >= row.node_right;
   END LOOP;
FOR row IN SELECT
               count(I.item_id) AS itemcount
               ,CT.node_left
               ,CT.node_right
           FROM
               items I
               JOIN category_tree CT ON (I.category2=CT.category_id)
           WHERE
               date_start <= now()
               AND date_end >= now()
               AND item_status = 1
               AND I.view_group IS NULL
           GROUP BY
               node_left||node_right,
               node_left,
               node_right

           LOOP
UPDATE category_tree SET item_count = item_count + row.itemcount where node_left <= row.node_left AND node_right >= row.node_right;
   END LOOP;

   --REINDEX TABLE category_tree;

   RETURN 1;
END;

and it's called from..

BEGIN;

SELECT * FROM update_itemcount();
UPDATE cache.cached_stats SET intval=(SELECT count(*) FROM items WHERE item_status = 1 AND view_group IS NULL) WHERE stat_id = 1;

COMMIT;

Heikki Linnakangas wrote:
Janar Kartau wrote:
Hi.
I've been running autovacuum over a month now without any problems, but today one of the critical tables got locked and made a pretty big mess. :) We have a cron script that does REINDEX on this table every 5 minutes. So i wonder if running REINDEX and VACUUM on the same table at the same time may cause this deadlock?
Or can a VACUUM make so much trouble?

ISTM that you have two separate issues.

The "sorry, too many clients already" error means that you've reached the maximum number of connections, as set with the max_connections setting. The autovacuum processes needs one connection to run.

I suspect that the deadlock is not related to the autovacuum, but just an interaction between your transactions and the REINDEX.

What does the update_itemcount() function look like? Are you running the REINDEX in a transaction?

Why do you need to reindex every 5 minutes? How long does the vacuum run normally?



---------------------------(end of broadcast)---------------------------
TIP 3: Have you checked our extensive FAQ?

              http://www.postgresql.org/docs/faq

Reply via email to