Обсуждение: [HACKERS] A weird bit in pg_upgrade/exec.c
Hello! I've came across a weird bit in pg_upgrade/exec.c We have a function check_bin_dir() which goes like this (old_cluster and new_cluster are global variables): void check_bin_dir(ClusterInfo *cluster) { ... get_bin_version(&old_cluster); get_bin_version(&new_cluster); ... } This function has two calls: check_bin_dir(&old_cluster); check_bin_dir(&new_cluster); I'd like to substitute these last two lines with this: get_bin_version(cluster); Doing it would simplify the patch I'm writing, but I'm worried I might break something that's been there for a long time and has been working fine. Is there maybe a reason for it to be this way that I don't happen to understand? Also, there's the exact same situation with the get_bin_version() function in the same file. -- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers
a.akenteva@postgrespro.ru wrote: > This function has two calls: > check_bin_dir(&old_cluster); > check_bin_dir(&new_cluster); > > I'd like to substitute these last two lines with this: > get_bin_version(cluster); Odd indeed. One would think that if a cluster variable is passed as parameter, the global vars should not be used. +1 for fixing it, and your proposal sounds as good as any. > Doing it would simplify the patch I'm writing, but I'm worried I might break > something that's been there for a long time and has been working fine. I think odd coding this was introduced recently because of the pg_resetxlog -> pg_resetwal renaming. -- Álvaro Herrera https://www.2ndQuadrant.com/ PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services -- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers
a.akenteva@postgrespro.ru writes: > I've came across a weird bit in pg_upgrade/exec.c > We have a function check_bin_dir() which goes like this (old_cluster and > new_cluster are global variables): > void check_bin_dir(ClusterInfo *cluster) > { > ... > get_bin_version(&old_cluster); > get_bin_version(&new_cluster); > ... > } > This function has two calls: > check_bin_dir(&old_cluster); > check_bin_dir(&new_cluster); > I'd like to substitute these last two lines with this: > get_bin_version(cluster); Yeah, the way it is now seems outright broken. It will try to do get_bin_version on the new cluster before having done validate_exec there, violating its own comment. I think we should change this as a bug fix, independently of whatever else you had in mind to do here. regards, tom lane -- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers
Alvaro Herrera <alvherre@alvh.no-ip.org> writes: > I think odd coding this was introduced recently because of the > pg_resetxlog -> pg_resetwal renaming. Dunno about that, but certainly somebody fat-fingered a refactoring there. The 9.6 code looks quite different but doesn't seem to be doing anything silly. regards, tom lane -- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers
Tom Lane <tgl@sss.pgh.pa.us> writes: > Yeah, the way it is now seems outright broken. It will try to do > get_bin_version on the new cluster before having done validate_exec > there, violating its own comment. > > I think we should change this as a bug fix, independently of whatever > else you had in mind to do here. I see this bug is now fixed in pg_upgrade/exec.c => check_bin_dir(). There's another bit exactly like that in check_data_dir() though. We use global variables instead of using the argument passed to the function, which makes the function not reusable. Sorry if I mentioned it too vaguely in the previous letter. I attached a patch with the change that would fix it. In pg_upgrade/exec.c => check_data_dir() I substituted these two lines old_cluster.major_version = get_major_server_version(&old_cluster); new_cluster.major_version = get_major_server_version(&new_cluster); with this line: cluster->major_version = get_major_server_version(cluster); and changed the comment accordingly.
Вложения
a.akenteva@postgrespro.ru writes: > I see this bug is now fixed in pg_upgrade/exec.c => check_bin_dir(). > There's another bit exactly like that in check_data_dir() though. Oh, so there is ... and looking around, that seems to have been copied-and-pasted out of check_cluster_versions(), without any thought for the fact that those calls were thereby made redundant. Fix pushed, thanks for noticing! regards, tom lane