diff options
Diffstat (limited to 'src/bin/pg_rewind/filemap.c')
-rw-r--r-- | src/bin/pg_rewind/filemap.c | 60 |
1 files changed, 32 insertions, 28 deletions
diff --git a/src/bin/pg_rewind/filemap.c b/src/bin/pg_rewind/filemap.c index 4e026473066..ee6e6db9b02 100644 --- a/src/bin/pg_rewind/filemap.c +++ b/src/bin/pg_rewind/filemap.c @@ -30,12 +30,12 @@ static char *datasegpath(RelFileNode rnode, ForkNumber forknum, BlockNumber segno); static int path_cmp(const void *a, const void *b); static int final_filemap_cmp(const void *a, const void *b); -static void filemap_list_to_array(void); +static void filemap_list_to_array(filemap_t *map); /* - * Create a new file map. + * Create a new file map (stored in the global pointer "filemap"). */ -filemap_t * +void filemap_create(void) { filemap_t *map; @@ -48,8 +48,6 @@ filemap_create(void) Assert(filemap == NULL); filemap = map; - - return map; } /* @@ -271,7 +269,10 @@ process_local_file(const char *path, file_type_t type, size_t oldsize, pg_fatal("remote file list is empty\n"); } - filemap_list_to_array(); + filemap_list_to_array(map); + + Assert(map->array != NULL); + qsort(map->array, map->narray, sizeof(file_entry_t *), path_cmp); } @@ -284,8 +285,8 @@ process_local_file(const char *path, file_type_t type, size_t oldsize, key.path = (char *) path; key_ptr = &key; - exists = bsearch(&key_ptr, map->array, map->narray, sizeof(file_entry_t *), - path_cmp) != NULL; + exists = (bsearch(&key_ptr, map->array, map->narray, sizeof(file_entry_t *), + path_cmp) != NULL); /* Remove any file or folder that doesn't exist in the remote system. */ if (!exists) @@ -335,7 +336,7 @@ process_block_change(ForkNumber forknum, RelFileNode rnode, BlockNumber blkno) filemap_t *map = filemap; file_entry_t **e; - Assert(filemap->array); + Assert(map->array); segno = blkno / RELSEG_SIZE; blkno_inseg = blkno % RELSEG_SIZE; @@ -395,38 +396,40 @@ process_block_change(ForkNumber forknum, RelFileNode rnode, BlockNumber blkno) } /* - * Convert the linked list of entries in filemap->first/last to the array, - * filemap->array. + * Convert the linked list of entries in map->first/last to the array, + * map->array. */ static void -filemap_list_to_array(void) +filemap_list_to_array(filemap_t *map) { int narray; file_entry_t *entry, *next; - filemap->array = - pg_realloc(filemap->array, - (filemap->nlist + filemap->narray) * sizeof(file_entry_t)); + map->array = (file_entry_t **) + pg_realloc(map->array, + (map->nlist + map->narray) * sizeof(file_entry_t *)); - narray = filemap->narray; - for (entry = filemap->first; entry != NULL; entry = next) + narray = map->narray; + for (entry = map->first; entry != NULL; entry = next) { - filemap->array[narray++] = entry; + map->array[narray++] = entry; next = entry->next; entry->next = NULL; } - Assert(narray == filemap->nlist + filemap->narray); - filemap->narray = narray; - filemap->nlist = 0; - filemap->first = filemap->last = NULL; + Assert(narray == map->nlist + map->narray); + map->narray = narray; + map->nlist = 0; + map->first = map->last = NULL; } void filemap_finalize(void) { - filemap_list_to_array(); - qsort(filemap->array, filemap->narray, sizeof(file_entry_t *), + filemap_t *map = filemap; + + filemap_list_to_array(map); + qsort(map->array, map->narray, sizeof(file_entry_t *), final_filemap_cmp); } @@ -466,9 +469,9 @@ calculate_totals(void) map->total_size = 0; map->fetch_size = 0; - for (i = 0; i < filemap->narray; i++) + for (i = 0; i < map->narray; i++) { - entry = filemap->array[i]; + entry = map->array[i]; if (entry->type != FILE_TYPE_REGULAR) continue; @@ -501,12 +504,13 @@ calculate_totals(void) void print_filemap(void) { + filemap_t *map = filemap; file_entry_t *entry; int i; - for (i = 0; i < filemap->narray; i++) + for (i = 0; i < map->narray; i++) { - entry = filemap->array[i]; + entry = map->array[i]; if (entry->action != FILE_ACTION_NONE || entry->pagemap.bitmapsize > 0) { |