Re: the big picture for index-only scans

Поиск
Список
Период
Сортировка
От Bruce Momjian
Тема Re: the big picture for index-only scans
Дата
Msg-id 201108191522.p7JFMcC24106@momjian.us
обсуждение исходный текст
Ответ на Re: the big picture for index-only scans  (Robert Haas <robertmhaas@gmail.com>)
Ответы Re: the big picture for index-only scans  (Robert Haas <robertmhaas@gmail.com>)
Список pgsql-hackers
Robert Haas wrote:
> > I am happy to have pg_upgrade skip upgrading visibility map files --- it
> > already has code to conditionally process them because they only exist
> > in >= 8.4:
> >
> > ? ? ? ?/* fsm/vm files added in PG 8.4 */
> > ? ? ? ?if (GET_MAJOR_VERSION(old_cluster.major_version) >= 804)
> > ? ? ? ?{
> > ? ? ? ? ? ?/*
> > ? ? ? ? ? ? * Copy/link any fsm and vm files, if they exist
> > ? ? ? ? ? ? */
> >
> > Just give the word and it will be done.
>
> I hereby give the word.  :-)
>
> Specifically, we need to skip copying vm files (only) if coming from a
> version prior to this commit:
>
> http://git.postgresql.org/gitweb/?p=postgresql.git;a=commit;h=e16954f3d27fa8e16c379ff6623ae18d6250a39c

Done with the attached, applied patch.  There was no cat-version bump
from that commit (because the format didn't change, just the
crash-safeness) so I picked the first cat-version change after this
commit.  This is only a pg_upgrade 9.2+ issue.

--
  Bruce Momjian  <bruce@momjian.us>        http://momjian.us
  EnterpriseDB                             http://enterprisedb.com

  + It's impossible for everything to be true. +
diff --git a/contrib/pg_upgrade/pg_upgrade.h b/contrib/pg_upgrade/pg_upgrade.h
new file mode 100644
index 6def748..a19b3df
*** a/contrib/pg_upgrade/pg_upgrade.h
--- b/contrib/pg_upgrade/pg_upgrade.h
***************
*** 64,69 ****
--- 64,75 ----
  #define TABLE_SPACE_SUBDIRS_CAT_VER 201001111
  /* postmaster/postgres -b (binary_upgrade) flag added during PG 9.1 development */
  #define BINARY_UPGRADE_SERVER_FLAG_CAT_VER 201104251
+ /*
+  *     Visibility map changed with this 9.2 commit,
+  *    8f9fe6edce358f7904e0db119416b4d1080a83aa; pick later catalog version.
+  */
+ #define VISIBILITY_MAP_CRASHSAFE_CAT_VER 201107031
+

  /*
   * Each relation is represented by a relinfo structure.
diff --git a/contrib/pg_upgrade/relfilenode.c b/contrib/pg_upgrade/relfilenode.c
new file mode 100644
index d4a420f..df752c5
*** a/contrib/pg_upgrade/relfilenode.c
--- b/contrib/pg_upgrade/relfilenode.c
*************** transfer_single_new_db(pageCnvCtx *pageC
*** 120,128 ****
      int            numFiles = 0;
      int            mapnum;
      int            fileno;
!
      old_dir[0] = '\0';

      for (mapnum = 0; mapnum < size; mapnum++)
      {
          char        old_file[MAXPGPATH];
--- 120,134 ----
      int            numFiles = 0;
      int            mapnum;
      int            fileno;
!     bool        vm_crashsafe_change = false;
!
      old_dir[0] = '\0';

+     /* Do not copy non-crashsafe vm files for binaries that assume crashsafety */
+     if (old_cluster.controldata.cat_ver < VISIBILITY_MAP_CRASHSAFE_CAT_VER &&
+         new_cluster.controldata.cat_ver >= VISIBILITY_MAP_CRASHSAFE_CAT_VER)
+         vm_crashsafe_change = true;
+
      for (mapnum = 0; mapnum < size; mapnum++)
      {
          char        old_file[MAXPGPATH];
*************** transfer_single_new_db(pageCnvCtx *pageC
*** 168,175 ****

              for (fileno = 0; fileno < numFiles; fileno++)
              {
                  if (strncmp(namelist[fileno]->d_name, scandir_file_pattern,
!                             strlen(scandir_file_pattern)) == 0)
                  {
                      snprintf(old_file, sizeof(old_file), "%s/%s", maps[mapnum].old_dir,
                               namelist[fileno]->d_name);
--- 174,189 ----

              for (fileno = 0; fileno < numFiles; fileno++)
              {
+                 char *vm_offset = strstr(namelist[fileno]->d_name, "_vm");
+                 bool is_vm_file = false;
+
+                 /* Is a visibility map file? (name ends with _vm) */
+                 if (vm_offset && strlen(vm_offset) == strlen("_vm"))
+                     is_vm_file = true;
+
                  if (strncmp(namelist[fileno]->d_name, scandir_file_pattern,
!                             strlen(scandir_file_pattern)) == 0 &&
!                     (!is_vm_file || !vm_crashsafe_change))
                  {
                      snprintf(old_file, sizeof(old_file), "%s/%s", maps[mapnum].old_dir,
                               namelist[fileno]->d_name);

В списке pgsql-hackers по дате отправления:

Предыдущее
От: Christopher Browne
Дата:
Сообщение: Re: How to define global variable in postgresql
Следующее
От: Robert Haas
Дата:
Сообщение: Re: the big picture for index-only scans