Re: Unhappy about API changes in the no-fsm-for-small-rels patch

Поиск
Список
Период
Сортировка
От Andres Freund
Тема Re: Unhappy about API changes in the no-fsm-for-small-rels patch
Дата
Msg-id 20190422170412.ndbhtxhf2flp464q@alap3.anarazel.de
обсуждение исходный текст
Ответ на Re: Unhappy about API changes in the no-fsm-for-small-rels patch  (Amit Kapila <amit.kapila16@gmail.com>)
Ответы Re: Unhappy about API changes in the no-fsm-for-small-rels patch  (Amit Kapila <amit.kapila16@gmail.com>)
Список pgsql-hackers
Hi,

On 2019-04-22 18:49:44 +0530, Amit Kapila wrote:
> Attached is a hacky and work-in-progress patch to move fsm map to
> relcache.  This will give you some idea.  I think we need to see if
> there is a need to invalidate the relcache due to this patch.  I think
> some other comments of Andres also need to be addressed, see if you
> can attempt to fix some of them.



>  /*
> @@ -1132,9 +1110,6 @@ fsm_local_set(Relation rel, BlockNumber cur_nblocks)
>      BlockNumber blkno,
>                  cached_target_block;
>  
> -    /* The local map must not be set already. */
> -    Assert(!FSM_LOCAL_MAP_EXISTS);
> -
>      /*
>       * Starting at the current last block in the relation and working
>       * backwards, mark alternating blocks as available.
> @@ -1142,7 +1117,7 @@ fsm_local_set(Relation rel, BlockNumber cur_nblocks)
>      blkno = cur_nblocks - 1;
>      while (true)
>      {
> -        fsm_local_map.map[blkno] = FSM_LOCAL_AVAIL;
> +        rel->fsm_local_map->map[blkno] = FSM_LOCAL_AVAIL;
>          if (blkno >= 2)
>              blkno -= 2;
>          else
> @@ -1150,13 +1125,13 @@ fsm_local_set(Relation rel, BlockNumber cur_nblocks)
>      }
>  
>      /* Cache the number of blocks. */
> -    fsm_local_map.nblocks = cur_nblocks;
> +    rel->fsm_local_map->nblocks = cur_nblocks;
>  
>      /* Set the status of the cached target block to 'unavailable'. */
>      cached_target_block = RelationGetTargetBlock(rel);
>      if (cached_target_block != InvalidBlockNumber &&
>          cached_target_block < cur_nblocks)
> -        fsm_local_map.map[cached_target_block] = FSM_LOCAL_NOT_AVAIL;
> +        rel->fsm_local_map->map[cached_target_block] = FSM_LOCAL_NOT_AVAIL;
>  }

I think there shouldn't be any need for this anymore. After this change
we shouldn't invalidate the map until there's no space on it - thereby
addressing the cost overhead, and greatly reducing the likelihood that
the local FSM can lead to increased bloat.


>  /*
> @@ -1168,18 +1143,18 @@ fsm_local_set(Relation rel, BlockNumber cur_nblocks)
>   * This function is used when there is no FSM.
>   */
>  static BlockNumber
> -fsm_local_search(void)
> +fsm_local_search(Relation rel)
>  {
>      BlockNumber target_block;
>  
>      /* Local map must be set by now. */
> -    Assert(FSM_LOCAL_MAP_EXISTS);
> +    Assert(FSM_LOCAL_MAP_EXISTS(rel));
>  
> -    target_block = fsm_local_map.nblocks;
> +    target_block = rel->fsm_local_map->nblocks;
>      do
>      {
>          target_block--;
> -        if (fsm_local_map.map[target_block] == FSM_LOCAL_AVAIL)
> +        if (rel->fsm_local_map->map[target_block] == FSM_LOCAL_AVAIL)
>              return target_block;
>      } while (target_block > 0);
>  
> @@ -1189,7 +1164,22 @@ fsm_local_search(void)
>       * first, which would otherwise lead to the same conclusion again and
>       * again.
>       */
> -    FSMClearLocalMap();
> +    fsm_clear_local_map(rel);

I'm not sure I like this. My inclination would be that we should be able
to check the local fsm repeatedly even if there's no space in the
in-memory representation - otherwise the use of the local FSM increases
bloat.

Greetings,

Andres Freund



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

Предыдущее
От: "Daniel Verite"
Дата:
Сообщение: Trouble with FETCH_COUNT and combined queries in psql
Следующее
От: Stephen Frost
Дата:
Сообщение: Re: block-level incremental backup