digital-guard / preserv

Digital Preservation Project
http://git.digital-guard.org/preserv
Apache License 2.0
0 stars 0 forks source link

Falha ingestão/publicação, CO/_pk0003.01: signature, recursive, volume grande de dados #144

Open 0e1 opened 1 year ago

0e1 commented 1 year ago

O processo de ingestão do layer parcel de CO/_pk0003.01 derrubou o banco de dados.

Rastreando o problemas

Execução de

psql postgres://postgres@localhost/ingest33 -c "SELECT ingest.any_load_assign('$(find /tmp/sandbox/_pk17000000301_001 -path "*TERRENO*.shp" | head -n 1)','parcel_none','17000000301301' )"

usa a função

CREATE or replace FUNCTION ingest.any_load_assign(
    p_fileref text,  -- apenas referencia para ingest.donated_PackComponent
    p_ftname text,   -- featureType of layer... um file pode ter mais de um layer??
    p_pck_id bigint  -- id do package da Preservação.
) RETURNS text AS $f$
  DECLARE
    q_file_id integer;
  BEGIN
  q_file_id := ingest.getmeta_to_file(p_fileref,p_ftname,p_pck_id);

  IF (SELECT COUNT(*) FROM ingest.feature_asis WHERE file_id=q_file_id)>0 AND (SELECT ftid::int FROM ingest.fdw_feature_type WHERE ftname=lower(p_ftname))>=20 THEN
    UPDATE ingest.donated_PackComponent
    SET proc_step=2,   -- if insert process occurs after q_query.
        lineage = lineage || ingest.feature_asis_assign(q_file_id)
    WHERE id=q_file_id;
  END IF;

  IF (SELECT COUNT(*) FROM ingest.feature_asis WHERE file_id=q_file_id)>0 THEN
    UPDATE ingest.donated_PackComponent
    SET proc_step=3,   -- if insert process occurs after q_query.
        lineage =  lineage || ingest.feature_asis_assign_signature(q_file_id)
    WHERE id=q_file_id;
  END IF;

  RETURN 'Ok';
  END;
$f$ LANGUAGE PLpgSQL;
COMMENT ON FUNCTION ingest.any_load_assign(text,text,bigint)
  IS 'Assign when ingest multiple files per layer.'
;

o erro corre na aplicação da função ingest.feature_asis_assign_signature(q_file_id):

CREATE or replace FUNCTION ingest.feature_asis_assign_signature(
    p_file_id bigint  -- ID at ingest.donated_PackComponent
) RETURNS jsonb AS $f$
  SELECT jsonb_build_object(
        'ghs_signature',
        hcode.signature_reduce(ingest.feature_asis_geohashes(p_file_id,ghs_size), 2, 1, (SELECT lineage->'hcode_signature_parameters' FROM ingest.donated_PackComponent WHERE id=p_file_id))
    )
  FROM (
    SELECT CASE WHEN (ingest.donated_PackComponent_geomtype(p_file_id))[1]='poly' THEN 5 ELSE 6 END AS ghs_size
  ) t
$f$ LANGUAGE SQL;

que por sua vez chama hcode.signature_reduce:

CREATE or replace FUNCTION hcode.signature_reduce(
  p_j             jsonB,             -- 1. input pairs {$hcode:$n_items}
  p_left_erode    int  DEFAULT 1,    -- 2. number of charcters to drop from left to right
  p_size_min      int  DEFAULT 1,    -- 3. minimal size of hcode
  p_percentile    real DEFAULT 0.75, -- 4.
  p_heuristic     int  DEFAULT 1     -- 5. algorithm options 1-3, zero is no recursion.
) RETURNS jsonB AS $wrap$
  SELECT jsonb_object_agg(hcode, n_items)
  FROM hcode.signature_reduce_recursive_raw($1,$2,$3,$4,$5)
$wrap$ LANGUAGE SQL IMMUTABLE;

que aplica a recursão hcode.signature_reduce_recursive_raw.

A combinação de volume grande de dados com recursão é o que deve estar causando o problema.

0e1 commented 1 year ago

Mais problema:


Resumo:

0e1 commented 1 year ago

Conforme https://github.com/digital-guard/preserv/issues/154 o problema está na passagem como parâmetro de um jsonb muito grande nas funções do schema hcode de geração de mosaico.

Na https://github.com/digital-guard/preserv/issues/154 se passa a usar tabelas no lugar de jsonb nas funções do schema hcode relacionadas a geração do mosaico.

A mesma estratégia pode ser aplicada nas funções de assinatura.