Linux Btrfs filesystem development
 help / color / mirror / Atom feed
* Does btrfs use crc32 for error correction?
@ 2017-09-19 15:35 Timofey Titovets
  2017-09-19 15:40 ` Hugo Mills
  2017-09-19 16:51 ` Eric Sandeen
  0 siblings, 2 replies; 6+ messages in thread
From: Timofey Titovets @ 2017-09-19 15:35 UTC (permalink / raw)
  To: linux-btrfs

Stupid question:
Does btrfs use crc32 for error correction?
If no, why?

(AFAIK if using CRC that possible to fix 1 bit flip)

P.S. I try check that (i create image, create text file, flip bit, try
read and btrfs show IO-error)

Thanks!
-- 
Have a nice day,
Timofey.

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: Does btrfs use crc32 for error correction?
  2017-09-19 15:35 Does btrfs use crc32 for error correction? Timofey Titovets
@ 2017-09-19 15:40 ` Hugo Mills
  2017-09-19 16:51 ` Eric Sandeen
  1 sibling, 0 replies; 6+ messages in thread
From: Hugo Mills @ 2017-09-19 15:40 UTC (permalink / raw)
  To: Timofey Titovets; +Cc: linux-btrfs

[-- Attachment #1: Type: text/plain, Size: 876 bytes --]

On Tue, Sep 19, 2017 at 06:35:48PM +0300, Timofey Titovets wrote:
> Stupid question:
> Does btrfs use crc32 for error correction?

   It uses it for error _detection_. On read, it'll verify the data
(or metadata) against the checksum.

   With no reduncancy (single, RAID-0), a bad csum check will return
I/O error.

   With redundancy (RAID-1, 10, 5, 6), a bad csum check will try
reading the other copy. If that's good, it will use it and repair the
broken copy.

   Hugo.

> If no, why?
> 
> (AFAIK if using CRC that possible to fix 1 bit flip)
> 
> P.S. I try check that (i create image, create text file, flip bit, try
> read and btrfs show IO-error)
> 
> Thanks!

-- 
Hugo Mills             | Dullest spy film ever: The Eastbourne Ultimatum
hugo@... carfax.org.uk |
http://carfax.org.uk/  |
PGP: E2AB1DE4          |                                       The Thick of It

[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 836 bytes --]

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: Does btrfs use crc32 for error correction?
  2017-09-19 15:35 Does btrfs use crc32 for error correction? Timofey Titovets
  2017-09-19 15:40 ` Hugo Mills
@ 2017-09-19 16:51 ` Eric Sandeen
  2017-09-19 18:04   ` Marat Khalili
  2017-09-20 22:04   ` Timofey Titovets
  1 sibling, 2 replies; 6+ messages in thread
From: Eric Sandeen @ 2017-09-19 16:51 UTC (permalink / raw)
  To: Timofey Titovets, linux-btrfs

On 9/19/17 10:35 AM, Timofey Titovets wrote:
> Stupid question:
> Does btrfs use crc32 for error correction?
> If no, why?
> 
> (AFAIK if using CRC that possible to fix 1 bit flip)
> 
> P.S. I try check that (i create image, create text file, flip bit, try
> read and btrfs show IO-error)
> 
> Thanks!

I wasn't aware that crc32 could (in general) be used for single bit correction; I've read up on that, and it seems pretty cool.
 
However, I don't think that the generator polynomial used in crc32c /can/ be used for error correction.  I just skimmed some reading, but that seems to be the case if I understand it correctly.

-Eric

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: Does btrfs use crc32 for error correction?
  2017-09-19 16:51 ` Eric Sandeen
@ 2017-09-19 18:04   ` Marat Khalili
  2017-09-20  1:52     ` Timofey Titovets
  2017-09-20 22:04   ` Timofey Titovets
  1 sibling, 1 reply; 6+ messages in thread
From: Marat Khalili @ 2017-09-19 18:04 UTC (permalink / raw)
  To: Eric Sandeen, Timofey Titovets, linux-btrfs

Would be cool, but probably not wise IMHO, since on modern hardware you almost never get one-bit errors (usually it's a whole sector of garbage), and therefore you'd more often see an incorrect recovery than actually fixed bit.
-- 

With Best Regards,
Marat Khalili

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: Does btrfs use crc32 for error correction?
  2017-09-19 18:04   ` Marat Khalili
@ 2017-09-20  1:52     ` Timofey Titovets
  0 siblings, 0 replies; 6+ messages in thread
From: Timofey Titovets @ 2017-09-20  1:52 UTC (permalink / raw)
  To: Marat Khalili; +Cc: Eric Sandeen, linux-btrfs

2017-09-19 21:04 GMT+03:00 Marat Khalili <mkh@rqc.ru>:
> Would be cool, but probably not wise IMHO, since on modern hardware you almost never get one-bit errors (usually it's a whole sector of garbage), and therefore you'd more often see an incorrect recovery than actually fixed bit.
> --
>
> With Best Regards,
> Marat Khalili

Over the past 2 months, I've thinking about some parity solution for
btrfs to have a trade-off between full duplication and single
profiles.

Something like the variable stripe len for mate(data), to fix one
sector's errors.
that is, calculate a one-time parity for each written extent.

But for now, I think that this can not be fixed without tricks or
changing the format.
(Because if you do this in FS lvl, i.e. use a space in B-Tree, this
will create one more exception, if you do this at block level, that
needs a "new" raid5, it's not cool).
But these are only my thoughts.

Therefore, I was recall that CRC in theory allow fixup one bit of error,
but for now, I do not have enough knowledge about CRC to try and
implement a proof of concept for this = \.

(I think that can be usefull not only in btrfs code, i.e. one bit CRC
correction)

But I also remember that btrfs have a lot of unused checksum space in
the checksum tree:
32 bytes of the checksum field, 4 bytes for CRC32C => 28 bytes of freedom =)

So for now I think about calculating the parity with the checksum data,
Proof of the concept (code):
https://github.com/Nefelim4ag/CRC32C_AND_8Byte_parity

As I see it:
1. Btrfs calculates parity 8/16 bytes and 4 bytes of CRC32C
    8/16 bytes stored at the end of the field.
2. Compatibility bits?
    Reason for absence:
     - For an old kernel that does not change anything, it's the same
for old btrfs progs
     - That possible to silent assume that it's have a parity and try
use it and fixup
     Because if it's missing or broken, we just fall back to old behaviour
    Reason for Yes:
     - May be we need to show by something that btrfs has parity +
CRC32 for this data?
3. For x86_64, this works comparably fast with HW CRC32
    --- Checking speed of hash / parity functions ---
    PAGE_SIZE: 4096, number of cycles: 1048576
    Parity64:   0xf7182ccbfc34f088    perf: 233750 usec, th:
18374.191641 MiB / s
    parity32:   0xb2cdc43                    perf: 464824 μs,    th:
9239.986094 MiB / s
    crc32:       0xa4aa10b2                 perf: 312446 μs,     th:
13746.270703 MiB / s
    xxhash64: 0x77e7064e1a16f422 perf: 367570 μs,     th: 11684.760171 MiB / s
4. If a CRC mismatch detected, try to correct the data by parity (for
single profile only):
4.1 Make a tmp data copy
4.2. Suppose that the 0+N block / stripe damaged
       inverse computation of that block from parity
4.3 Check CRC for page:
       - mismatch? -> N + 1 -> Go to 3.1
       - match? -> Hooray! -> Overwrite broken block

That solution will easy fix for most sort of bit flips and up to 1-16
byte -local- corruption

Possible parity combinations:
1 byte: x1 or x2 or x4 or x8 or x16
2 byte: x1 or x2 or x4 or x8
4 byte: x1 or x2 or x4
8 byte: x1 or x2 - fastest on x86_64 (i didn't have other CPUs)

That you think about that?

Thanks.

P.S.
Script for reproduction of 1 bit error case, where FS can't be mounted:
#!/bin/bash

DISK_IMAGE=$(mktemp)
MNT_TMP_DIR="$(mktemp -d)"

truncate -s 48M $DISK_IMAGE
mkfs.btrfs -f -L CRC_TEST -m single $DISK_IMAGE

TMP_DIR="$(mktemp -d)"

mount $DISK_IMAGE $MNT_TMP_DIR
echo "Test String: some_text_data" | tee $MNT_TMP_DIR/file.txt
umount $MNT_TMP_DIR

echo "Add 1 bit error: o -> n"
sed -i 's/some_text_data/snme_text_data/g' $DISK_IMAGE
btrfs check -b -p $DISK_IMAGE

echo "Fix 1 bit error: n -> o"
sed -i 's/snme_text_data/some_text_data/g' $DISK_IMAGE
btrfs check -b -p $DISK_IMAGE

mount $DISK_IMAGE $MNT_TMP_DIR
cat $MNT_TMP_DIR/file.txt
umount $MNT_TMP_DIR

rm -fv "$DISK_IMAGE"


-- 
Have a nice day,
Timofey.

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: Does btrfs use crc32 for error correction?
  2017-09-19 16:51 ` Eric Sandeen
  2017-09-19 18:04   ` Marat Khalili
@ 2017-09-20 22:04   ` Timofey Titovets
  1 sibling, 0 replies; 6+ messages in thread
From: Timofey Titovets @ 2017-09-20 22:04 UTC (permalink / raw)
  To: Eric Sandeen; +Cc: linux-btrfs

2017-09-19 19:51 GMT+03:00 Eric Sandeen <sandeen@redhat.com>:
> On 9/19/17 10:35 AM, Timofey Titovets wrote:
>> Stupid question:
>> Does btrfs use crc32 for error correction?
>> If no, why?
>>
>> (AFAIK if using CRC that possible to fix 1 bit flip)
>>
>> P.S. I try check that (i create image, create text file, flip bit, try
>> read and btrfs show IO-error)
>>
>> Thanks!
>
> I wasn't aware that crc32 could (in general) be used for single bit correction; I've read up on that, and it seems pretty cool.
>
> However, I don't think that the generator polynomial used in crc32c /can/ be used for error correction.  I just skimmed some reading, but that seems to be the case if I understand it correctly.
>
> -Eric

That possible, but if i understood doc about CRC16 bit correction
correctly, that need some tricks (As example preprocess all possible
bit flips and have a map of that) for fast find bit error.
Also in theory for CRC32C that possible with some state machine, to
move algo backward and forward over data.

I also check [1], so CRC32C (for our case) have hamming distance about 4.
So CRC32 in theory can fix up to HD-1 ~= 3 bit (If i understand all
things correctly);

So that possible to just brute force over data and flip 1-3 bit, and
try check if CRC fixed %)
In theory that safe for 1-2 bit error (Because again HD for input
data) (Proof of concept[2]).

Thanks.

1. https://users.ece.cmu.edu/~koopman/networks/dsn02/dsn02_koopman.pdf
2. https://github.com/Nefelim4ag/CRC32C_AND_8Byte_parity/commit/cb0fe76eac2ff036468bbc5ea75ebc06cb1e9928

-- 
Have a nice day,
Timofey.

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2017-09-20 22:04 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2017-09-19 15:35 Does btrfs use crc32 for error correction? Timofey Titovets
2017-09-19 15:40 ` Hugo Mills
2017-09-19 16:51 ` Eric Sandeen
2017-09-19 18:04   ` Marat Khalili
2017-09-20  1:52     ` Timofey Titovets
2017-09-20 22:04   ` Timofey Titovets

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox