| From: | Tomas Vondra <tomas(at)vondra(dot)me> |
|---|---|
| To: | Bram van der Vos <bram(dot)van(dot)der(dot)vos(at)axisinto(dot)nl>, pgsql-bugs(at)lists(dot)postgresql(dot)org |
| Subject: | Re: file corruption goes undetected |
| Date: | 2026-08-06 22:01:33 |
| Message-ID: | 9abdddef-4c08-4d47-8879-9265e164dacb@vondra.me |
| Views: | Whole Thread | Raw Message | Download mbox | Resend email |
| Thread: | |
| Lists: | pgsql-bugs |
This is expected behavior, not a bug. It'd be great to detect these
kinds of data corruption, but data checksums can't do that (and we don't
have other protections).
regards
On 8/6/26 16:11, Bram van der Vos wrote:
> *ISSUE*
>
> External modified datafile not detected, no error given but result produced;
>
> *REPRODUCTION*
>
> script.sh
> ---
>
> psql <<DO_CLEAN_1
> drop database corruption;
> DO_CLEAN_1
>
> rm -rf /tmp/oscmd.sh
> rm rf /tmp/output_1.txt
> rm rf /tmp/output_2.txt
>
> psql <<END_SCRIPT
>
> \o '/tmp/output_1.txt'
> select version();
> create database corruption;
> \c corruption
> show data_checksums;
> show ignore_checksum_failure;
> create table demo ( a serial, t timestamp with time zone);
> insert into demo (t) values (now());
> select max(t) from demo;
> select pg_relation_filepath('demo');
> copy (select command || setting ||'/'||file
> from (select * from (select 1 as my_order, 'rm -rf ' as command,
> pg_relation_filepath('demo') as file
> union all
> select 2 as my_order , 'touch ' as command ,
> pg_relation_filepath('demo') as file )
> cross join (select setting from pg_settings where
> name='data_directory')) order by my_order) to '/tmp/oscmd.sh';
> END_SCRIPT
>
>
> cat /tmp/output_1.txt
> chmod 700 /tmp/oscmd.sh
> /tmp/oscmd.sh
>
> psql -d corruption <<END_SCRIPT_2
>
> \o '/tmp/output_2.txt'
> select max(t) from demo;
> END_SCRIPT_2
>
> cat /tmp/output_2.txt
> ---
>
> *ETC*
> Result in tmp/output_1.txt en tmp/output_2.txt. After file has been
> removed and recreated with touch a NULL result is returned. The same
> happens when the has been replaced with dd -if /dev/zero of=<file>
> bs=1024 count=64000
>
> When replacing file with bogus data (/dev/random) an error is being
> returned. Result when the datafile is being nullified
>
> side info: pg_backrest does recognise the file as not valid an replaces
> is during restore
>
>
> regards
>
>
> Bram
>
> --
> vrijdags afwezig
> LOGO <https://www.axisintoict.nl>
> Bram van der Vos
> bram(dot)van(dot)der(dot)vos(at)axisinto(dot)nl
> 06 127 27 547
> Albert Schweitzerlaan 10b
> 3451 EC Vleuten
> Twitter <https://twitter.com/AxisintoICT>Linkedin <https://
> nl.linkedin.com/in/bramvandervos>
>
--
Tomas Vondra
| From | Date | Subject | |
|---|---|---|---|
| Next Message | Tom Lane | 2026-08-06 22:09:17 | Re: file corruption goes undetected |
| Previous Message | Andrey Rachitskiy | 2026-08-06 14:21:56 | Re: Update in check_max_stack_depth |