Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Altera os tipos de transações de conteúdos na tabela balance_operations #1624

Merged
merged 1 commit into from
Feb 17, 2024

Conversation

aprendendofelipe
Copy link
Collaborator

Mudanças realizadas

Alterada a modelagem da tabela balance_operations para facilitar a consulta dos saldos de TabCoins dos conteúdos pela função get_content_balance_credit_debit criada no PR #1607.

Foi removido content:tabcoin das opções para balance_operations.balance_type e substituído por content:tabcoin:initial, content:tabcoin:credit e content:tabcoin:debit.

Já foi adicionado no PR atual a versão da função get_content_balance_credit_debit que aproveita a mudança em balance_operations. Agora ela só recebe um parâmetro, que é o ID do conteúdo.

As mudanças que envolvem o banco de dados já foram aplicadas em homologação, o que não afeta o funcionando das versões existentes de antes do PR #1607.

Tipo de mudança

  • Altera modelagem de dados

Checklist:

  • As modificações não geram novos logs de erro ou aviso (warning).
  • Os testes antigos estão passando localmente.

Copy link

vercel bot commented Feb 13, 2024

The latest updates on your projects. Learn more about Vercel for Git ↗︎

Name Status Preview Comments Updated (UTC)
tabnews ✅ Ready (Inspect) Visit Preview 💬 Add feedback Feb 17, 2024 2:06pm

@Rafatcb
Copy link
Collaborator

Rafatcb commented Feb 13, 2024

Eu tentei testar essa migração num banco que tenho com muitos dados e que estava usando para testar o desempenho do PR #1607, mas aquele teste de uma publicação com 27 comentários está demorando ~800ms (vs ~60ms) com a query que apenas pega o total de TabCoins (get_current_balance), e a publicação com 2027 comentários está demorando ~57 segundos (vs ~200ms).

Você tem ideia de qual é o problema? 🤔

Não sei se em homologação também está demorando mais.

@aprendendofelipe
Copy link
Collaborator Author

Local e homologação está normal. Nenhuma diferença perceptível na get_current_balance (nem deveria ter diferença mesmo).

Faz o teste, por exemplo, qualificando qualquer conteúdo em homologação. Não importa qual deploy.

Será que seu banco não estava ocupado, talvez atualizando o índice? Mesmo assim, 57s é muito tempo.

Ele atualizou corretamente todos os content:tabcoin para os novos tipos?

@Rafatcb
Copy link
Collaborator

Rafatcb commented Feb 13, 2024

Esse é o Explain que fiz no meu banco maior, que rodei a migração desse PR: https://www.pgexplain.dev/plan/75e4741f-6a69-49b1-bb39-58dfc855b462. O planejamento continua igual, só um Nested loop que está demorando praticamente o tempo inteiro da query. Antes ele também era a parte que mais demorava, mas não tanto (nesse exemplo do link foram 73.9ms).

Também tive o problema criando um banco grande (porém bem menor) já na sua branch, ou seja, teoricamente está tudo certo. A query que eu estava testando é a do GET /api/v1/contents/[username]/[slug]/children, com get_current_balance , mas também ficou lenta com get_content_balance_credit_debit. Se eu comentar as linhas get_current_balance('content:tabcoin', parent.id) as tabcoins, a query fica rápida novamente. Nesse banco "menor", é uma diferença de 2 segundos para menos de 100ms ao comentar as linhas.

WITH parent AS (SELECT * FROM contents
  WHERE
    contents.owner_id = (
      SELECT id FROM users
      WHERE
        LOWER(username) = LOWER('<username>')
      LIMIT 1
    )
    AND
      contents.slug = '<slug>' AND
      contents.status = 'published'
  )
  SELECT
    parent.*,
    users.username as owner_username,
	get_current_balance('content:tabcoin', parent.id) as tabcoins
  FROM
    parent
  INNER JOIN
    users ON parent.owner_id = users.id

  UNION ALL

  SELECT
    c.*,
    users.username as owner_username,
	get_current_balance('content:tabcoin', c.id) as tabcoins
  FROM
    contents c
  INNER JOIN
    parent ON c.path @> ARRAY[parent.id]::uuid[]
  INNER JOIN
    users ON c.owner_id = users.id
  WHERE
    c.status = 'published';

O endpoint GET /api/v1/contents/[username]/[slug] está normal (~50ms), tanto com get_current_balance quanto com get_content_balance_credit_debit.

  WITH content_window AS (
  SELECT
    COUNT(*) OVER()::INTEGER as total_rows,
    id
  FROM contents
  WHERE contents.slug = '<slug>' AND contents.status = 'published' AND contents.owner_id = '<user-id>'
  LIMIT 1 OFFSET 0
)
SELECT
  contents.id,
  contents.owner_id,
  contents.parent_id,
  contents.slug,
  contents.title,
  contents.body,
  contents.status,
  contents.source_url,
  contents.created_at,
  contents.updated_at,
  contents.published_at,
  contents.deleted_at,
  contents.path,
  users.username as owner_username,
  content_window.total_rows,
  tabcoins_count.total_balance as tabcoins,
  tabcoins_count.total_credit as tabcoins_credit,
  tabcoins_count.total_debit as tabcoins_debit,
  (
    SELECT COUNT(*)
    FROM contents as children
    WHERE children.path @> ARRAY[contents.id]
    AND children.status = 'published'
  ) as children_deep_count
FROM
  contents
INNER JOIN
  content_window ON contents.id = content_window.id
INNER JOIN
  users ON contents.owner_id = users.id
LEFT JOIN LATERAL get_content_balance_credit_debit(contents.id) tabcoins_count ON true;

A query de votos (em POST /contents/[user]/[slug]/tabcoins) ficou mais lenta, antes costumava ficar na faixa dos 50ms e agora está na faixa dos 100ms. Como essa query tem muitos parâmetros, para ficar mais fácil de obtê-la eu coloco o código abaixo na função rateContent, após a definição de query, então dou um voto pela UI e copio a query.

console.log(
  query.text
    .replaceAll('$1', `'${fromUserId}'`)
    .replaceAll('$2', `'${tabCoinsToDebitFromUser}'`)
    .replaceAll('$3', `'${tabCashToCreditToUser}'`)
    .replaceAll('$4', `'${contentId}'`)
    .replaceAll('$5', `'${tabCoinsToTransactToContent}'`)
    .replaceAll('$6', `'${contentOwnerId}'`)
    .replaceAll('$7', `'${tabCoinsToTransactToContentOwner}'`)
    .replaceAll('$8', `'${originatorType}'`)
    .replaceAll('$9', `'${originatorId}'`)
    .replaceAll('$10', `'${contentBalanceType}'`),
);

Todos esses testes eu realizei no pgAdmin4, mas também notei a diferença ao usar o TabNews pelo localhost.

Cheguei a reiniciar o PC, testei direto na sua branch com um banco novo, até avaliei o Explain mas não entendi o que houve. Pode ser algo da minha máquina mesmo, o meu receio era apenas fazer o merge e ficar lento em produção. E se for na minha máquina, não vou conseguir testar o outro PR sem descobrir o problema 😅

Script para popular o banco

Meu script para popular o banco é meio demorado e com algumas gambiarras. Seria bom ter um script melhor para poder deixar no repositório, assim qualquer um pode realizar testes de desempenho. Se você quiser uma base para popular seu banco:

async function populateDatabase() {
  const batchSize = 100;
  const totalToCreate = 30_000;

  const totalBatches = Math.ceil(totalToCreate / batchSize);
  const allUsers = await user.findAll();
  const allContents = await content.findAll(); // Pode passar { per_pages: 10_000 }, por exemplo, e tirar o limite do validator (está em 100)

  console.log(`Creating ${totalToCreate} records...`);

  let totalSuccessful = 0;
  for (let batchIndex = 0; batchIndex < totalBatches; batchIndex++) {
    const batchPromises = [];

    for (let i = 0; i < batchSize; i++) {
      const recordIndex = batchIndex * batchSize + i;
      if (recordIndex >= totalToCreate) break;

      const randomUserIndex = Math.floor(Math.random() * allUsers.length);
      const randomUser = allUsers[randomUserIndex];

      let parent_id = null;
      if (Math.random() < 0.8 && allContents.length > 0) {
        const randomContentIndex = Math.floor(Math.random() * allContents.length);
        parent_id = allContents[randomContentIndex].id;

        const rate = Math.random() < 0.3 ? -1 : 1;
        batchPromises.push(orchestrator.createRate(allContents[randomContentIndex], rate, randomUser.id));
      }

      // batchPromises.push(createUser());

      batchPromises.push(
        orchestrator.createContent({
          parent_id,
          owner_id: randomUser.id,
          status: 'published',
          title: parent_id ? null : faker.lorem.sentence(),
        }),
      );
    }

    const results = await Promise.allSettled(batchPromises);
    const successfulCount = results.filter((result) => result.status === 'fulfilled').length;
    totalSuccessful += successfulCount;
    if (batchIndex % 50 === 0) {
      console.log(`More ${(batchIndex + 1) * batchSize} records creation attempts...`);
    }
  }
  console.log(`${totalSuccessful} records created.`);
}

Eu coloco essa função no orchestrator e comento as linhas conforme a etapa da "população" em que estou (primeiro deixo só criar usuários, depois apenas conteúdos, depois apenas as qualificações). Também crio um arquivo de teste para conseguir executar a função:

// fake.test.js
import orchestrator from './orchestrator';

describe('performance script', () => {
  it('should populate db', async () => {
    await orchestrator.populateDatabase();
    expect(true).toBe(true);
  }, 200_000);
});

A parte de criação de conteúdo demora muito, então costuma dar timeout, mas ele continua rodando o script enquanto não "matar" o Jest.

@Rafatcb
Copy link
Collaborator

Rafatcb commented Feb 13, 2024

Depois de executar REINDEX INDEX balance_operations_balance_type_recipient_id_index no banco grande, caiu dos 50 segundos para 17 segundos. Experimentei também o REINDEX DATABASE <db>, mas não melhorou mais. O ponto mais demorado continua no mesmo lugar.

No banco que criei nessa branch, ou não teve impacto, ou foi um impacto bem pequeno.

@aprendendofelipe
Copy link
Collaborator Author

Legal esse script @Rafatcb! Depois vou popular uma instância usando ele. 👍💪

Qual é o tamanho do volume do contêiner do seu banco? Reparou no tamanho absurdo dos buffers que aparecem nas suas análises?

@aprendendofelipe
Copy link
Collaborator Author

E se for na minha máquina, não vou conseguir testar o outro PR sem descobrir o problema

Mesmo com o banco populado pelo seu script você deveria conseguir testar com Codespaces ou Gitpod

@Rafatcb
Copy link
Collaborator

Rafatcb commented Feb 14, 2024

Qual é o tamanho do volume do contêiner do seu banco? Reparou no tamanho absurdo dos buffers que aparecem nas suas análises?

Reparei que ficou usou vários GB, achei estranho mas não entendi o motivo.

Não senho certeza se para ver o tamanho seria com o comando docker system df -v, mas se for, o resultado está abaixo (quase 1GB).

$ docker system df -v
Images space usage:

REPOSITORY         TAG           IMAGE ID       CREATED         SIZE      SHARED SIZE   UNIQUE SIZE   CONTAINERS
sj26/mailcatcher   latest        7ab5eb1bdf54   6 months ago    95.7MB    0B            95.75MB       1
postgres           14.7-alpine   9d94e6318ef2   10 months ago   242MB     0B            241.7MB       1

Containers space usage:

CONTAINER ID   IMAGE                  COMMAND                  LOCAL VOLUMES   SIZE      CREATED        STATUS                    NAMES
06aa8b42f6f5   postgres:14.7-alpine   "docker-entrypoint.s…"   2               63B       17 hours ago   Up About an hour          postgres-dev
e3955d7f55b0   sj26/mailcatcher       "mailcatcher --foreg…"   0               0B        3 days ago     Exited (0) 12 hours ago   mailcatcher

Local Volumes space usage:

VOLUME NAME                                                        LINKS     SIZE
fd184ee451a9328e702a601199288ad0b3f1ffd8bdf4771b88dd1033e2d3b4be   1         952.1MB
infra_postgres_data                                                1         0B

Build cache usage: 0B

CACHE ID   CACHE TYPE   SIZE      CREATED   LAST USED   USAGE     SHARED

$ docker ps -a --filter volume=fd184ee451a9328e702a601199288ad0b3f1ffd8bdf4771b88dd1033e2d3b4be 
CONTAINER ID   IMAGE                  COMMAND                  CREATED        STATUS             PORTS                                         NAMES
06aa8b42f6f5   postgres:14.7-alpine   "docker-entrypoint.s…"   17 hours ago   Up About an hour   0.0.0.0:54320->5432/tcp, :::54320->5432/tcp   postgres-dev

Mesmo com o banco populado pelo seu script você deveria conseguir testar com Codespaces ou Gitpod

Tenho quatro bancos do TabNews:

  • tabnews: gerado pelos testes automatizados;
  • tabnews_performance: o "banco grande";
  • tabnews_performance_bkp: backup do banco grande para não ter que rodar o script de novo;
  • tabnews_performance_2: o banco que criei nessa branch.

Tentei testar no Codespaces mas não consegui acessar o banco localmente e nem diretamente (pelo Codespaces) para executar o SQL, então eu apenas acessei uma publicação específica nessa branch e na main, vendo a duração da requisição GET https://<url>.app.github.dev/<username>/<slug> pelas ferramentas de desenvolvedor do navegador. O Codespaces estava bem lento, a página de usuário nem carregava (quase 2min carregando e cancelava).

Quando mudei para a branch main, não carregava nenhuma página. Reinicei o Codespaces, mas não melhorou. Vou tentar novamente de noite. Se não der certo, experimento pelo Gitpod.

@Rafatcb
Copy link
Collaborator

Rafatcb commented Feb 15, 2024

Não consegui testar mesmo no Codespaces. Criando o banco com menos registros as coisas até funcionam, mas sem conseguir executar apenas a query não dá para ter uma boa noção da duração.

Então, fui testar no Windows, usando o DBeaver ao invés do pgAdmin4. Clonei a branch, rodei o script para popular o banco (30 mil usuários, 18,5 mil conteúdos, 76 mil registros em balance_operations, 14,5 mil votos). O Explain está aqui. Também demorou (8 segundos) e usou 13 GB no Nested loop. A publicação na qual testei possuía 1506 comentários.

Após usar o REINDEX DATABASE <db>, continuou demorado, porém menos (Explain, 1.4 segundo).

Edit: Vou testar no Windows, no main de noite para poder comparar um banco de cada branch.

@aprendendofelipe
Copy link
Collaborator Author

@Rafatcb, populei um banco com o seu script e acredito que entendi o problema que você dever estar enfrentando.

Não tem nenhuma relação com o PR, mas sim com a quantidade de conteúdos publicados em menos de 7 dias pelo script, que é muito maior do que o volume normal do TabNews. A query de ranqueamento não está otimizada para uma quantidade tão grande de conteúdos em 7 dias. Só de rodar essa query uma vez já faz o banco travar em 100% de processamento e nunca mais sair disso. E só de subir o servidor web, essa query já é executada para montar a página inicial. E o banco continua funcionando, mas fica muito lento, já que está ocupado com algo, então isso afeta todas as análises.

O desempenho do ranqueamento é a razão de limitarmos aos conteúdos publicados nos últimos 7 dias, pois para montar cada página não basta computar os saldos dos 30 conteúdos da página, mas sim computar os saldos de todos os conteúdos dos últimos 7 dias (mais os com comentários recentes) para descobrir quais serão os 30 conteúdos da página em questão. Só que o script simula uma quantidade muito grande de conteúdos dentro de 7 dias.

Pelo mesmo motivo não podermos organizar todos os conteúdos pelos saldos de TabCoins enquanto não tivermos indexado algum cache do saldo já computado. E esse PR não muda nada com relação a isso, já que é esperado que o desempenho da get_current_balance permaneça o mesmo de antes. De forma alguma esse PR é a solução para get_current_balance, que acredito que deverá ser substituída por um cache.

O que esse PR faz de diferente é criar um get_content_balance_credit_debit um pouco mais eficiente do que o original do #1607. Esse novo get_content_balance_credit_debit deve ter desempenho muito próximo ao do get_current_balance, então permite usá-lo em todos os locais que o get_current_balance era utilizado, inclusive no ranqueamento, sem preocupação em piora do desempenho que já temos atualmente.

Apenas para os testes, modifique a query de ranqueamento para lidar com uma quantidade limitada de conteúdos, então tudo deverá funcionar normalmente. É bom verificar também se o seu banco já não está em algum estado de lentidão por algum outro motivo, já que ele está mostrando esses dados de buffer bem estranhos.

Adicione limites no começo de rankedContent, por exemplo como nas linhas abaixo:

    WITH
    latest_published_child_contents AS (
        SELECT
            contents.owner_id,
            contents.path
        FROM contents
        WHERE
            parent_id IS NOT NULL
            AND status = 'published'
            AND published_at > NOW() - INTERVAL '1 day'
        LIMIT 50
    ),
    latest_interacted_root_contents AS ((
        SELECT
            contents.id,
            contents.owner_id,
            contents.published_at,
            get_current_balance('content:tabcoin', contents.id) as tabcoins
        FROM contents
        WHERE
            parent_id IS NULL
            AND status = 'published'
            AND published_at > NOW() - INTERVAL '7 days'
        LIMIT 200)

@Rafatcb
Copy link
Collaborator

Rafatcb commented Feb 16, 2024

Não tem nenhuma relação com o PR, mas sim com a quantidade de conteúdos publicados em menos de 7 dias pelo script, que é muito maior do que o volume normal do TabNews.

Sim, provavelmente esse era o problema no Codespaces. O que eu não entendi mesmo foi o problema que você mencionou, do tamanho do Buffer, e por isso resolvi testar no Windows para ver se ocorria alguma mudança (a maior parte do tempo eu programo o TabNews pelo Linux).

Limpando o banco (da mesma forma que ocorre nos testes automatizados) e depois populando ele na branch main, sem usar o REINDEX, parece normal (Explain). Realmente não entendi o que houve aqui.

Bom, como você disse que testou e está normal, creio que podemos realizar o merge, mas antes disso, uma dúvida: você não acha que precisa do REINDEX na migração? Aqui, pelo menos, estava fazendo uma diferença positiva usar o REINDEX do índice em questão (balance_operations_balance_type_recipient_id_index).

@aprendendofelipe
Copy link
Collaborator Author

Bom, como você disse que testou e está normal, creio que podemos realizar o merge, mas antes disso, uma dúvida: você não acha que precisa do REINDEX na migração? Aqui, pelo menos, estava fazendo uma diferença positiva usar o REINDEX do índice em questão (balance_operations_balance_type_recipient_id_index).

@Rafatcb, que bom que você falou do índice, pois eu não tinha verificado se ele ainda estava sendo utilizado corretamente. Por ser dentro da função, o uso do índice balance_operations_balance_type_recipient_id_index não aparece nas análises das queries. E, por causa da ordem das colunas no índice, ele não estava sendo utilizado. Eu tinha comparado o desempenho de get_current_balance e get_content_balance_credit_debit, e estava igual, mas ainda não tinha comparado com a versão original, que era melhor por usar o índice.

Alterei o PR e agora estou adicionando um novo índice e removendo o anterior (apenas invertendo a ordem das colunas balance_type e recipient_id. Para a versão original da get_current_balance a ordem não importa, mas na nova faz diferença, assim como para a get_content_balance_credit_debit. E com essa troca dos índices, não será necessário usar o REINDEX.

E pensando que, mesmo que fosse bom usar o REINDEX, talvez não precisasse estar na migration, pensei que também não é necessário manter o UPDATE balance_operations, pois isso só faz sentido por causa de mudanças no código e não no banco. Acho que nesse caso é melhor só rodar manualmente.

Testando os índices eu também peguei um erro na definição da get_content_balance_credit_debit na migration, em que eu tinha colocado tabcoin no plural em balance_type, mas o correto é no singular. Já corrigi.

Por fim, se no PR #1607 for adotar a get_content_balance_credit_debit em todos os locais em que get_current_balance era chamada com content:tabcoin, então a mudança em get_current_balance pode ser revertida.

@Rafatcb
Copy link
Collaborator

Rafatcb commented Feb 17, 2024

Alterei o PR e agora estou adicionando um novo índice e removendo o anterior (apenas invertendo a ordem das colunas balance_type e recipient_id.

Faz sentido 👍

Por fim, se no PR #1607 for adotar a get_content_balance_credit_debit em todos os locais em que get_current_balance era chamada com content:tabcoin, então a mudança em get_current_balance pode ser revertida.

Eu acredito que não seja necessário mudar em todas as situações, porque como a função retorna três valores, o uso dela em uma query acaba não sendo tão simples quanto o de uma função que retorna apenas um valor, então apenas adicionaria mais complexidade onde o somatório de créditos e débitos não é necessário. Faz sentido para você?

@aprendendofelipe
Copy link
Collaborator Author

Eu acredito que não seja necessário mudar em todas as situações, porque como a função retorna três valores, o uso dela em uma query acaba não sendo tão simples quanto o de uma função que retorna apenas um valor, então apenas adicionaria mais complexidade onde o somatório de créditos e débitos não é necessário. Faz sentido para você?

Com certeza! Onde apenas o saldo for necessário, não é preciso usar a get_content_balance_credit_debit.

Bora pro merge aqui pra poder concluir a #1607?

@aprendendofelipe
Copy link
Collaborator Author

aprendendofelipe commented Feb 17, 2024

Em homologação eu já removi todos os deploys de outros PRs para não setar mais o balance_type com content:tabcoin, assim como já executei todos os passos abaixo que são comuns aos dois ambientes.

Em produção eu já fiz as trocas dos índices, invertendo as colunas, e já atualizei a get_current_balance. Com isso não há pressa para executar a migration após o merge e atualizar a coluna balance_type dos conteúdos com os UPDATEs abaixo.

Daria para unificar os comandos, mas vou deixar exatamente com foram executados:

UPDATE balance_operations AS bo
SET balance_type = 
  CASE 
    WHEN e.type != 'update:content:tabcoins' THEN 'content:tabcoin:initial'
    WHEN bo.amount > 0 THEN 'content:tabcoin:credit'
    WHEN bo.amount < 0 THEN 'content:tabcoin:debit'
    ELSE 'content:tabcoin'
  END
FROM events AS e
WHERE bo.balance_type = 'content:tabcoin' 
  AND e.id = bo.originator_id;

Cria o tipo content:tabcoin:ban apenas provisoriamente:

UPDATE balance_operations AS bo
SET balance_type = 
  CASE 
    WHEN e.type = 'ban:user' THEN 'content:tabcoin:ban'
    WHEN e.type = 'system:update:tabcoins' THEN 'content:tabcoin:initial'
    WHEN e.type = 'create:content:text_root' THEN 'content:tabcoin:initial'
    WHEN e.type = 'create:content:text_child' THEN 'content:tabcoin:initial'
    WHEN e.type = 'update:content:text_root' THEN 'content:tabcoin:initial'
    WHEN e.type = 'update:content:text_child' THEN 'content:tabcoin:initial'
    ELSE 'content:tabcoin'
  END
FROM events AS e
WHERE bo.balance_type = 'content:tabcoin:initial' 
  AND e.id = bo.originator_id;

Substitui o content:tabcoin:ban por content:tabcoin:credit ou content:tabcoin:debit, conforme o caso:

UPDATE balance_operations
SET balance_type = 
  CASE 
    WHEN amount < 0 THEN 'content:tabcoin:credit'
    WHEN amount > 0 THEN 'content:tabcoin:debit'
    ELSE 'content:tabcoin'
  END
WHERE balance_type = 'content:tabcoin:ban';

Seta os casos de content:tabcoin:initial negativos das publicações deletadas durante processo antigo de banimento, em que os saldos dos conteúdos também eram zerados.

WITH ids_to_update AS (
  SELECT bo.id
  FROM balance_operations AS bo
  INNER JOIN events AS e
    ON bo.originator_id = e.id
  INNER JOIN contents AS c 
    ON (e.metadata->>'user_id')::uuid = c.owner_id
    AND c.id = recipient_id
  WHERE bo.balance_type = 'content:tabcoin:credit'
    AND bo.amount < 0
    AND e.type = 'ban:user'
)
UPDATE balance_operations AS bo
SET balance_type = 'content:tabcoin:initial'
FROM ids_to_update AS i
WHERE bo.id = i.id;

Para verificar se os comandos foram executados com sucesso, basta executar a consulta abaixo, que deve retornar a quantidade zero:

SELECT COUNT(*)
FROM balance_operations
WHERE
  balance_type = 'content:tabcoin'
  OR balance_type = 'content:tabcoin:ban'

Por fim é aconselhável fazer um REINDEX:

REINDEX INDEX balance_operations_recipient_id_balance_type_index;

Apenas para ficar registrado no PR, em caso de reversão das modificações, antes de reverter a migration, seria necessário reverter a coluna balance_type com o UPDATE abaixo:

UPDATE balance_operations
SET balance_type = 'content:tabcoin'
WHERE 
  balance_type = 'content:tabcoin:initial' 
  OR balance_type = 'content:tabcoin:credit'
  OR balance_type = 'content:tabcoin:debit';

@aprendendofelipe aprendendofelipe merged commit d1236b4 into main Feb 17, 2024
7 checks passed
@aprendendofelipe aprendendofelipe deleted the balance-functions branch February 17, 2024 15:06
@aprendendofelipe
Copy link
Collaborator Author

Todos os passos executados em produção com sucesso! 🚀🚀🚀

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

2 participants