LCOV - differential code coverage report
Current view: top level - src/bin/pg_upgrade - relfilenumber.c (source / functions) Coverage Total Hit UNC UIC UBC GNC CBC DUB
Current: Differential Code Coverage 16@8cea358b128 vs 17@8cea358b128 Lines: 63.6 % 88 56 8 24 56 2
Current Date: 2024-04-14 14:21:10 Functions: 100.0 % 4 4 2 2
Baseline: 16@8cea358b128 Branches: 48.1 % 52 25 2 25 25
Baseline Date: 2024-04-14 14:21:09 Line coverage date bins:
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed [..60] days: 0.0 % 8 0 8
(240..) days: 70.0 % 80 56 24 56
Function coverage date bins:
(240..) days: 100.0 % 4 4 2 2
Branch coverage date bins:
(240..) days: 48.1 % 52 25 2 25 25

 Age         Owner                    Branch data    TLA  Line data    Source code
                                  1                 :                : /*
                                  2                 :                :  *  relfilenumber.c
                                  3                 :                :  *
                                  4                 :                :  *  relfilenumber functions
                                  5                 :                :  *
                                  6                 :                :  *  Copyright (c) 2010-2024, PostgreSQL Global Development Group
                                  7                 :                :  *  src/bin/pg_upgrade/relfilenumber.c
                                  8                 :                :  */
                                  9                 :                : 
                                 10                 :                : #include "postgres_fe.h"
                                 11                 :                : 
                                 12                 :                : #include <sys/stat.h>
                                 13                 :                : 
                                 14                 :                : #include "access/transam.h"
                                 15                 :                : #include "catalog/pg_class_d.h"
                                 16                 :                : #include "pg_upgrade.h"
                                 17                 :                : 
                                 18                 :                : static void transfer_single_new_db(FileNameMap *maps, int size, char *old_tablespace);
                                 19                 :                : static void transfer_relfile(FileNameMap *map, const char *type_suffix, bool vm_must_add_frozenbit);
                                 20                 :                : 
                                 21                 :                : 
                                 22                 :                : /*
                                 23                 :                :  * transfer_all_new_tablespaces()
                                 24                 :                :  *
                                 25                 :                :  * Responsible for upgrading all database. invokes routines to generate mappings and then
                                 26                 :                :  * physically link the databases.
                                 27                 :                :  */
                                 28                 :                : void
 4113 bruce@momjian.us           29                 :CBC           3 : transfer_all_new_tablespaces(DbInfoArr *old_db_arr, DbInfoArr *new_db_arr,
                                 30                 :                :                              char *old_pgdata, char *new_pgdata)
                                 31                 :                : {
 1985 peter_e@gmx.net            32   [ -  +  -  -  :              3 :     switch (user_opts.transfer_mode)
                                                 - ]
                                 33                 :                :     {
 1985 peter_e@gmx.net            34                 :UBC           0 :         case TRANSFER_MODE_CLONE:
  783 andres@anarazel.de         35                 :              0 :             prep_status_progress("Cloning user relation files");
 1985 peter_e@gmx.net            36                 :              0 :             break;
 1985 peter_e@gmx.net            37                 :CBC           3 :         case TRANSFER_MODE_COPY:
  783 andres@anarazel.de         38                 :              3 :             prep_status_progress("Copying user relation files");
 1985 peter_e@gmx.net            39                 :              3 :             break;
   39 tmunro@postgresql.or       40                 :UNC           0 :         case TRANSFER_MODE_COPY_FILE_RANGE:
                                 41                 :              0 :             prep_status_progress("Copying user relation files with copy_file_range");
                                 42                 :              0 :             break;
 1985 peter_e@gmx.net            43                 :UBC           0 :         case TRANSFER_MODE_LINK:
  783 andres@anarazel.de         44                 :              0 :             prep_status_progress("Linking user relation files");
 1985 peter_e@gmx.net            45                 :              0 :             break;
                                 46                 :                :     }
                                 47                 :                : 
                                 48                 :                :     /*
                                 49                 :                :      * Transferring files by tablespace is tricky because a single database
                                 50                 :                :      * can use multiple tablespaces.  For non-parallel mode, we just pass a
                                 51                 :                :      * NULL tablespace path, which matches all tablespaces.  In parallel mode,
                                 52                 :                :      * we pass the default tablespace and all user-created tablespaces and let
                                 53                 :                :      * those operations happen in parallel.
                                 54                 :                :      */
 4113 bruce@momjian.us           55         [ +  - ]:CBC           3 :     if (user_opts.jobs <= 1)
                                 56                 :              3 :         parallel_transfer_all_new_dbs(old_db_arr, new_db_arr, old_pgdata,
                                 57                 :                :                                       new_pgdata, NULL);
                                 58                 :                :     else
                                 59                 :                :     {
                                 60                 :                :         int         tblnum;
                                 61                 :                : 
                                 62                 :                :         /* transfer default tablespace */
 4113 bruce@momjian.us           63                 :UBC           0 :         parallel_transfer_all_new_dbs(old_db_arr, new_db_arr, old_pgdata,
                                 64                 :                :                                       new_pgdata, old_pgdata);
                                 65                 :                : 
                                 66         [ #  # ]:              0 :         for (tblnum = 0; tblnum < os_info.num_old_tablespaces; tblnum++)
 3970 sfrost@snowman.net         67                 :              0 :             parallel_transfer_all_new_dbs(old_db_arr,
                                 68                 :                :                                           new_db_arr,
                                 69                 :                :                                           old_pgdata,
                                 70                 :                :                                           new_pgdata,
                                 71                 :              0 :                                           os_info.old_tablespaces[tblnum]);
                                 72                 :                :         /* reap all children */
 4113 bruce@momjian.us           73         [ #  # ]:              0 :         while (reap_child(true) == true)
                                 74                 :                :             ;
                                 75                 :                :     }
                                 76                 :                : 
 4113 bruce@momjian.us           77                 :CBC           3 :     end_progress_output();
                                 78                 :              3 :     check_ok();
                                 79                 :              3 : }
                                 80                 :                : 
                                 81                 :                : 
                                 82                 :                : /*
                                 83                 :                :  * transfer_all_new_dbs()
                                 84                 :                :  *
                                 85                 :                :  * Responsible for upgrading all database. invokes routines to generate mappings and then
                                 86                 :                :  * physically link the databases.
                                 87                 :                :  */
                                 88                 :                : void
                                 89                 :              3 : transfer_all_new_dbs(DbInfoArr *old_db_arr, DbInfoArr *new_db_arr,
                                 90                 :                :                      char *old_pgdata, char *new_pgdata, char *old_tablespace)
                                 91                 :                : {
                                 92                 :                :     int         old_dbnum,
                                 93                 :                :                 new_dbnum;
                                 94                 :                : 
                                 95                 :                :     /* Scan the old cluster databases and transfer their files */
 4548                            96                 :              3 :     for (old_dbnum = new_dbnum = 0;
 4546                            97         [ +  + ]:             13 :          old_dbnum < old_db_arr->ndbs;
 4548                            98                 :             10 :          old_dbnum++, new_dbnum++)
                                 99                 :                :     {
 4326                           100                 :             10 :         DbInfo     *old_db = &old_db_arr->dbs[old_dbnum],
                                101                 :             10 :                    *new_db = NULL;
                                102                 :                :         FileNameMap *mappings;
                                103                 :                :         int         n_maps;
                                104                 :                : 
                                105                 :                :         /*
                                106                 :                :          * Advance past any databases that exist in the new cluster but not in
                                107                 :                :          * the old, e.g. "postgres".  (The user might have removed the
                                108                 :                :          * 'postgres' database from the old cluster.)
                                109                 :                :          */
 4546                           110         [ +  - ]:             10 :         for (; new_dbnum < new_db_arr->ndbs; new_dbnum++)
                                111                 :                :         {
                                112                 :             10 :             new_db = &new_db_arr->dbs[new_dbnum];
                                113         [ +  - ]:             10 :             if (strcmp(old_db->db_name, new_db->db_name) == 0)
                                114                 :             10 :                 break;
                                115                 :                :         }
                                116                 :                : 
                                117         [ -  + ]:             10 :         if (new_dbnum >= new_db_arr->ndbs)
  642 tgl@sss.pgh.pa.us         118                 :UBC           0 :             pg_fatal("old database \"%s\" not found in the new cluster",
                                119                 :                :                      old_db->db_name);
                                120                 :                : 
 4926 bruce@momjian.us          121                 :CBC          10 :         mappings = gen_db_file_maps(old_db, new_db, &n_maps, old_pgdata,
                                122                 :                :                                     new_pgdata);
 5086                           123         [ +  - ]:             10 :         if (n_maps)
                                124                 :                :         {
 2959 rhaas@postgresql.org      125                 :             10 :             transfer_single_new_db(mappings, n_maps, old_tablespace);
                                126                 :                :         }
                                127                 :                :         /* We allocate something even for n_maps == 0 */
 3383 bruce@momjian.us          128                 :             10 :         pg_free(mappings);
                                129                 :                :     }
 5086                           130                 :              3 : }
                                131                 :                : 
                                132                 :                : /*
                                133                 :                :  * transfer_single_new_db()
                                134                 :                :  *
                                135                 :                :  * create links for mappings stored in "maps" array.
                                136                 :                :  */
                                137                 :                : static void
 2959 rhaas@postgresql.org      138                 :             10 : transfer_single_new_db(FileNameMap *maps, int size, char *old_tablespace)
                                139                 :                : {
                                140                 :                :     int         mapnum;
 2956                           141                 :             10 :     bool        vm_must_add_frozenbit = false;
                                142                 :                : 
                                143                 :                :     /*
                                144                 :                :      * Do we need to rewrite visibilitymap?
                                145                 :                :      */
                                146         [ -  + ]:             10 :     if (old_cluster.controldata.cat_ver < VISIBILITY_MAP_FROZEN_BIT_CAT_VER &&
 2956 rhaas@postgresql.org      147         [ #  # ]:UBC           0 :         new_cluster.controldata.cat_ver >= VISIBILITY_MAP_FROZEN_BIT_CAT_VER)
                                148                 :              0 :         vm_must_add_frozenbit = true;
                                149                 :                : 
 5086 bruce@momjian.us          150         [ +  + ]:CBC        1378 :     for (mapnum = 0; mapnum < size; mapnum++)
                                151                 :                :     {
 4113                           152         [ -  + ]:           1368 :         if (old_tablespace == NULL ||
 4113 bruce@momjian.us          153         [ #  # ]:UBC           0 :             strcmp(maps[mapnum].old_tablespace, old_tablespace) == 0)
                                154                 :                :         {
                                155                 :                :             /* transfer primary file */
 2956 rhaas@postgresql.org      156                 :CBC        1368 :             transfer_relfile(&maps[mapnum], "", vm_must_add_frozenbit);
                                157                 :                : 
                                158                 :                :             /*
                                159                 :                :              * Copy/link any fsm and vm files, if they exist
                                160                 :                :              */
 1286 bruce@momjian.us          161                 :           1368 :             transfer_relfile(&maps[mapnum], "_fsm", vm_must_add_frozenbit);
  852 tgl@sss.pgh.pa.us         162                 :           1368 :             transfer_relfile(&maps[mapnum], "_vm", vm_must_add_frozenbit);
                                163                 :                :         }
                                164                 :                :     }
 5086 bruce@momjian.us          165                 :             10 : }
                                166                 :                : 
                                167                 :                : 
                                168                 :                : /*
                                169                 :                :  * transfer_relfile()
                                170                 :                :  *
                                171                 :                :  * Copy or link file from old cluster to new one.  If vm_must_add_frozenbit
                                172                 :                :  * is true, visibility map forks are converted and rewritten, even in link
                                173                 :                :  * mode.
                                174                 :                :  */
                                175                 :                : static void
 2956 rhaas@postgresql.org      176                 :           4104 : transfer_relfile(FileNameMap *map, const char *type_suffix, bool vm_must_add_frozenbit)
                                177                 :                : {
                                178                 :                :     char        old_file[MAXPGPATH];
                                179                 :                :     char        new_file[MAXPGPATH];
                                180                 :                :     int         segno;
                                181                 :                :     char        extent_suffix[65];
                                182                 :                :     struct stat statbuf;
                                183                 :                : 
                                184                 :                :     /*
                                185                 :                :      * Now copy/link any related segments as well. Remember, PG breaks large
                                186                 :                :      * files into 1GB segments, the first segment has no extension, subsequent
                                187                 :                :      * segments are named relfilenumber.1, relfilenumber.2, relfilenumber.3.
                                188                 :                :      */
 4169 bruce@momjian.us          189                 :           5778 :     for (segno = 0;; segno++)
                                190                 :                :     {
                                191         [ +  + ]:           5778 :         if (segno == 0)
                                192                 :           4104 :             extent_suffix[0] = '\0';
                                193                 :                :         else
                                194                 :           1674 :             snprintf(extent_suffix, sizeof(extent_suffix), ".%d", segno);
                                195                 :                : 
  564 rhaas@postgresql.org      196                 :           5778 :         snprintf(old_file, sizeof(old_file), "%s%s/%u/%u%s%s",
                                197                 :                :                  map->old_tablespace,
                                198                 :                :                  map->old_tablespace_suffix,
                                199                 :                :                  map->db_oid,
                                200                 :                :                  map->relfilenumber,
                                201                 :                :                  type_suffix,
                                202                 :                :                  extent_suffix);
                                203                 :           5778 :         snprintf(new_file, sizeof(new_file), "%s%s/%u/%u%s%s",
                                204                 :                :                  map->new_tablespace,
                                205                 :                :                  map->new_tablespace_suffix,
                                206                 :                :                  map->db_oid,
                                207                 :                :                  map->relfilenumber,
                                208                 :                :                  type_suffix,
                                209                 :                :                  extent_suffix);
                                210                 :                : 
                                211                 :                :         /* Is it an extent, fsm, or vm file? */
 4169 bruce@momjian.us          212   [ +  +  +  + ]:           5778 :         if (type_suffix[0] != '\0' || segno != 0)
                                213                 :                :         {
                                214                 :                :             /* Did file open fail? */
 2956 rhaas@postgresql.org      215         [ +  + ]:           4410 :             if (stat(old_file, &statbuf) != 0)
                                216                 :                :             {
                                217                 :                :                 /* File does not exist?  That's OK, just return */
 4169 bruce@momjian.us          218         [ +  - ]:           4103 :                 if (errno == ENOENT)
                                219                 :           4103 :                     return;
                                220                 :                :                 else
   33 michael@paquier.xyz       221                 :UNC           0 :                     pg_fatal("error while checking for file existence \"%s.%s\" (\"%s\" to \"%s\"): %m",
                                222                 :                :                              map->nspname, map->relname, old_file, new_file);
                                223                 :                :             }
                                224                 :                : 
                                225                 :                :             /* If file is empty, just return */
 2956 rhaas@postgresql.org      226         [ +  + ]:CBC         307 :             if (statbuf.st_size == 0)
                                227                 :              1 :                 return;
                                228                 :                :         }
                                229                 :                : 
 4169 bruce@momjian.us          230                 :           1674 :         unlink(new_file);
                                231                 :                : 
                                232                 :                :         /* Copying files might take some time, so give feedback. */
 4146                           233                 :           1674 :         pg_log(PG_STATUS, "%s", old_file);
                                234                 :                : 
 2753 tgl@sss.pgh.pa.us         235   [ -  +  -  - ]:           1674 :         if (vm_must_add_frozenbit && strcmp(type_suffix, "_vm") == 0)
                                236                 :                :         {
                                237                 :                :             /* Need to rewrite visibility map format */
  642 tgl@sss.pgh.pa.us         238                 :UBC           0 :             pg_log(PG_VERBOSE, "rewriting \"%s\" to \"%s\"",
                                239                 :                :                    old_file, new_file);
 2753                           240                 :              0 :             rewriteVisibilityMap(old_file, new_file, map->nspname, map->relname);
                                241                 :                :         }
                                242                 :                :         else
 1985 peter_e@gmx.net           243   [ -  +  -  -  :CBC        1674 :             switch (user_opts.transfer_mode)
                                                 - ]
                                244                 :                :             {
 1985 peter_e@gmx.net           245                 :UBC           0 :                 case TRANSFER_MODE_CLONE:
  642 tgl@sss.pgh.pa.us         246                 :              0 :                     pg_log(PG_VERBOSE, "cloning \"%s\" to \"%s\"",
                                247                 :                :                            old_file, new_file);
 1985 peter_e@gmx.net           248                 :              0 :                     cloneFile(old_file, new_file, map->nspname, map->relname);
                                249                 :              0 :                     break;
 1985 peter_e@gmx.net           250                 :CBC        1674 :                 case TRANSFER_MODE_COPY:
  642 tgl@sss.pgh.pa.us         251                 :           1674 :                     pg_log(PG_VERBOSE, "copying \"%s\" to \"%s\"",
                                252                 :                :                            old_file, new_file);
 1985 peter_e@gmx.net           253                 :           1674 :                     copyFile(old_file, new_file, map->nspname, map->relname);
                                254                 :           1674 :                     break;
   39 tmunro@postgresql.or      255                 :UNC           0 :                 case TRANSFER_MODE_COPY_FILE_RANGE:
                                256                 :              0 :                     pg_log(PG_VERBOSE, "copying \"%s\" to \"%s\" with copy_file_range",
                                257                 :                :                            old_file, new_file);
                                258                 :              0 :                     copyFileByRange(old_file, new_file, map->nspname, map->relname);
                                259                 :              0 :                     break;
 1985 peter_e@gmx.net           260                 :UBC           0 :                 case TRANSFER_MODE_LINK:
  642 tgl@sss.pgh.pa.us         261                 :              0 :                     pg_log(PG_VERBOSE, "linking \"%s\" to \"%s\"",
                                262                 :                :                            old_file, new_file);
 1985 peter_e@gmx.net           263                 :              0 :                     linkFile(old_file, new_file, map->nspname, map->relname);
                                264                 :                :             }
                                265                 :                :     }
                                266                 :                : }
        

Generated by: LCOV version 2.1-beta2-3-g6141622