Before the last post was published, I forgot to add in the fix for the pathname problem.
freshports.org=# select ElementPathnameUpdateChildren(453745);
It run. A long time. I let it run. For hours. About 16 hours. Then I killed it. I checked the procedure. It made sense. Then I checked the update statement:
freshports.org=# explain analyse UPDATE element_pathname SET pathname = element_pathname(element_id) where element_id = 2335;
QUERY PLAN
--------------------------------------------------------------------------------------------------------------------------
Update (cost=0.00..15211.29 rows=1 width=10) (actual time=1877.927..1877.927 rows=0 loops=1)
-> Seq Scan on element_pathname (cost=0.00..15211.29 rows=1 width=10) (actual time=518.410..1366.534 rows=1 loops=1)
Filter: (element_id = 2335)
Total runtime: 1878.080 ms
(4 rows)
freshports.org=#
Whoa! Nearly two seconds for each update. That sequential scan is a killer. Let’s add an index and check the results then.
freshports.org=# \d element_pathname
Table "public.element_pathname"
Column | Type | Modifiers
------------+---------+-----------
element_id | integer | not null
pathname | text | not null
Indexes:
"element_pathname_pathname" UNIQUE, btree (pathname)
Foreign-key constraints:
"element_pathname_element_id_fkey" FOREIGN KEY (element_id) REFERENCES element(id) ON DELETE CASCADE
freshports.org=# create index element_pathname_element_id on element_pathname(element_id);
CREATE INDEX
freshports.org=# explain analyse UPDATE element_pathname SET pathname = element_pathname(element_id) where element_id = 2335;
QUERY PLAN
-----------------------------------------------------------------------------------------------------------------------------------------------------
Update (cost=0.00..8.56 rows=1 width=10) (actual time=0.551..0.551 rows=0 loops=1)
-> Index Scan using element_pathname_element_id on element_pathname (cost=0.00..8.56 rows=1 width=10) (actual time=0.498..0.502 rows=1 loops=1)
Index Cond: (element_id = 2335)
Total runtime: 0.609 ms
(4 rows)
freshports.org=#
Much better. Much much better. Let’s try that query again.
freshports.org=# explain analyse select ElementPathnameUpdateChildren(453745);
QUERY PLAN
----------------------------------------------------------------------------------------------
Result (cost=0.00..0.26 rows=1 width=0) (actual time=149758.049..149758.051 rows=1 loops=1)
Total runtime: 149758.080 ms
(2 rows)
freshports.org=#
Ahah! Only 2.5 minutes. That’s acceptable. When run without the explain analyze, we see the number of updated rows.
freshports.org=# select ElementPathnameUpdateChildren(453745);
elementpathnameupdatechildren
-------------------------------
292265
(1 row)
About 300,000 rows.
Now, on to the src directory.
freshports.org=# begin;
BEGIN
freshports.org=# update element set parent_id = (select pathname_id('/base/head')) where parent_id = (select pathname_id('/src'));
UPDATE 55
freshports.org=# select * from element_pathname where element_id in (select id from element where parent_id = (select pathname_id('/base/head/bin')));
element_id | pathname
------------+-----------------------------
95428 | /base/head/bin/kill
332815 | /base/head/bin/pwait
85980 | /base/head/bin/sh
101053 | /base/head/bin/setfacl
95430 | /base/head/bin/sync
86066 | /base/head/bin/domainname
78380 | /base/head/bin/pwd
86071 | /base/head/bin/hostname
84934 | /base/head/bin/Makefile
90490 | /base/head/bin/Makefile.inc
77539 | /base/head/bin/pax
90811 | /base/head/bin/ln
79318 | /base/head/bin/expr
88146 | /base/head/bin/cat
294410 | /base/head/bin/uuidgen
81031 | /base/head/bin/mv
82955 | /base/head/bin/rmail
101020 | /base/head/bin/chmod
101030 | /base/head/bin/echo
92443 | /base/head/bin/rm
96216 | /base/head/bin/sleep
86068 | /base/head/bin/ed
77537 | /base/head/bin/ls
83336 | /base/head/bin/test
90808 | /base/head/bin/cp
77562 | /base/head/bin/ps
86076 | /base/head/bin/rcp
101051 | /base/head/bin/rmdir
101069 | /base/head/bin/stty
124456 | /base/head/bin/kenv
128894 | /base/head/bin/chflags
308137 | /base/head/bin/pkill
101690 | /base/head/bin/csh
82679 | /base/head/bin/chio
83109 | /base/head/bin/df
83838 | /base/head/bin/dd
85998 | /base/head/bin/date
86073 | /base/head/bin/mkdir
86852 | /base/head/bin/realpath
101038 | /base/head/bin/getfacl
(40 rows)
freshports.org=# commit;
COMMIT
freshports.org=#
And now for docs:
freshports.org=# select Element_Add('/docTMP/head', 'D');
element_add
-------------
453751
(1 row)
freshports.org=# begin;
BEGIN
freshports.org=# update element set parent_id = (select pathname_id('/docTMP/head')) where parent_id = (select pathname_id('/doc'));
UPDATE 27
freshports.org=# select * from element_pathname where element_id in (select id from element where parent_id = (select pathname_id('/docTMP/head/release')));
element_id | pathname
------------+-------------------------------
100765 | /docTMP/head/release/texts
443480 | /docTMP/head/release/9.1.0
88900 | /docTMP/head/release/Makefile
(3 rows)
freshports.org=# commit;
COMMIT
freshports.org=#
Done. All new repo trees created.











