Block-level CRC checks

Started by Alvaro Herreraover 17 years ago367 messageshackers
Jump to latest
#1Alvaro Herrera
alvherre@2ndquadrant.com

A customer of ours has been having trouble with corrupted data for some
time. Of course, we've almost always blamed hardware (and we've seen
RAID controllers have their firmware upgraded, among other actions), but
the useful thing to know is when corruption has happened, and where.

So we've been tasked with adding CRCs to data files.

The idea is that these CRCs are going to be checked just after reading
files from disk, and calculated just before writing it. They are
just a protection against the storage layer going mad; they are not
intended to protect against faulty RAM, CPU or kernel.

This code would be run-time or compile-time configurable. I'm not
absolutely sure which yet; the problem with run-time is what to do if
the user restarts the server with the setting flipped. It would have
almost no impact on users who don't enable it.

The implementation I'm envisioning requires the use of a new relation
fork to store the per-block CRCs. Initially I'm aiming at a CRC32 sum
for each block. FlushBuffer would calculate the checksum and store it
in the CRC fork; ReadBuffer_common would read the page, calculate the
checksum, and compare it to the one stored in the CRC fork.

A buffer's io_in_progress lock protects the buffer's CRC. We read and
pin the CRC page before acquiring the lock, to avoid having two buffer
IO operations in flight.

I'd like to submit this for 8.4, but I want to ensure that -hackers at
large approve of this feature before starting serious coding.

Opinions?

--
Alvaro Herrera http://www.CommandPrompt.com/
PostgreSQL Replication, Consulting, Custom Development, 24x7 support

#2Jonah H. Harris
jonah.harris@gmail.com
In reply to: Alvaro Herrera (#1)
Re: Block-level CRC checks

On Tue, Sep 30, 2008 at 2:02 PM, Alvaro Herrera
<alvherre@commandprompt.com> wrote:

A customer of ours has been having trouble with corrupted data for some
time. Of course, we've almost always blamed hardware (and we've seen
RAID controllers have their firmware upgraded, among other actions), but
the useful thing to know is when corruption has happened, and where.

Agreed.

So we've been tasked with adding CRCs to data files.

Awesome.

The idea is that these CRCs are going to be checked just after reading
files from disk, and calculated just before writing it. They are
just a protection against the storage layer going mad; they are not
intended to protect against faulty RAM, CPU or kernel.

This is the common case.

This code would be run-time or compile-time configurable. I'm not
absolutely sure which yet; the problem with run-time is what to do if
the user restarts the server with the setting flipped. It would have
almost no impact on users who don't enable it.

I've supported this forever!

The implementation I'm envisioning requires the use of a new relation
fork to store the per-block CRCs. Initially I'm aiming at a CRC32 sum
for each block. FlushBuffer would calculate the checksum and store it
in the CRC fork; ReadBuffer_common would read the page, calculate the
checksum, and compare it to the one stored in the CRC fork.

A buffer's io_in_progress lock protects the buffer's CRC. We read and
pin the CRC page before acquiring the lock, to avoid having two buffer
IO operations in flight.

If the CRC gets written before the block, how is recovery going to
handle it? I'm not too familiar with the new forks stuff, but
recovery will pull the old block, compare it against the checksum, and
consider the block invalid, correct?

I'd like to submit this for 8.4, but I want to ensure that -hackers at
large approve of this feature before starting serious coding.

IMHO, this is a functionality that should be enabled by default (as it
is on most other RDBMS). It would've prevented severe corruption in
the 20 or so databases I've had to fix, and other than making it
optional, I don't see the reasoning for a separate relation fork
rather than storing it directly on the block (as everyone else does).
Similarly, I think Greg Stark was playing with a patch for it
(http://archives.postgresql.org/pgsql-hackers/2007-02/msg01850.php).

--
Jonah H. Harris, Senior DBA
myYearbook.com

#3Tom Lane
tgl@sss.pgh.pa.us
In reply to: Alvaro Herrera (#1)
Re: Block-level CRC checks

Alvaro Herrera <alvherre@commandprompt.com> writes:

The implementation I'm envisioning requires the use of a new relation
fork to store the per-block CRCs.

That seems bizarre, and expensive, and if you lose one block of the CRC
fork you lose confidence in a LOT of data. Why not keep the CRCs in the
page headers?

A buffer's io_in_progress lock protects the buffer's CRC.

Unfortunately, it doesn't. See hint bits.

regards, tom lane

#4Heikki Linnakangas
heikki.linnakangas@enterprisedb.com
In reply to: Alvaro Herrera (#1)
Re: Block-level CRC checks

Alvaro Herrera wrote:

A customer of ours has been having trouble with corrupted data for some
time. Of course, we've almost always blamed hardware (and we've seen
RAID controllers have their firmware upgraded, among other actions), but
the useful thing to know is when corruption has happened, and where.

So we've been tasked with adding CRCs to data files.

The idea is that these CRCs are going to be checked just after reading
files from disk, and calculated just before writing it. They are
just a protection against the storage layer going mad; they are not
intended to protect against faulty RAM, CPU or kernel.

This has been suggested before, and the usual objection is precisely
that it only protects from errors in the storage layer, giving a false
sense of security.

Doesn't some filesystems include a per-block CRC, which would achieve
the same thing? ZFS?

This code would be run-time or compile-time configurable. I'm not
absolutely sure which yet; the problem with run-time is what to do if
the user restarts the server with the setting flipped. It would have
almost no impact on users who don't enable it.

Yeah, seems like it would need to be compile-time or initdb-time
configurable.

The implementation I'm envisioning requires the use of a new relation
fork to store the per-block CRCs. Initially I'm aiming at a CRC32 sum
for each block. FlushBuffer would calculate the checksum and store it
in the CRC fork; ReadBuffer_common would read the page, calculate the
checksum, and compare it to the one stored in the CRC fork.

Surely it would be much simpler to just add a field to the page header.

--
Heikki Linnakangas
EnterpriseDB http://www.enterprisedb.com

#5Joshua D. Drake
jd@commandprompt.com
In reply to: Jonah H. Harris (#2)
Re: Block-level CRC checks

On Tue, 30 Sep 2008 14:33:04 -0400
"Jonah H. Harris" <jonah.harris@gmail.com> wrote:

I'd like to submit this for 8.4, but I want to ensure that -hackers
at large approve of this feature before starting serious coding.

IMHO, this is a functionality that should be enabled by default (as it
is on most other RDBMS). It would've prevented severe corruption in

What other RDMS have it enabled by default?

Sincerely,

Joshua D. Drake

--
The PostgreSQL Company since 1997: http://www.commandprompt.com/
PostgreSQL Community Conference: http://www.postgresqlconference.org/
United States PostgreSQL Association: http://www.postgresql.us/

#6Jonah H. Harris
jonah.harris@gmail.com
In reply to: Joshua D. Drake (#5)
Re: Block-level CRC checks

On Tue, Sep 30, 2008 at 2:49 PM, Joshua Drake <jd@commandprompt.com> wrote:

On Tue, 30 Sep 2008 14:33:04 -0400
"Jonah H. Harris" <jonah.harris@gmail.com> wrote:

I'd like to submit this for 8.4, but I want to ensure that -hackers
at large approve of this feature before starting serious coding.

IMHO, this is a functionality that should be enabled by default (as it
is on most other RDBMS). It would've prevented severe corruption in

What other RDMS have it enabled by default?

Oracle and (I belive) SQL Server >= 2005

--
Jonah H. Harris, Senior DBA
myYearbook.com

#7Markus Wanner
markus@bluegap.ch
In reply to: Alvaro Herrera (#1)
Re: Block-level CRC checks

Hello Alvaro,

some random thoughts while reading your proposal follow...

Alvaro Herrera wrote:

So we've been tasked with adding CRCs to data files.

Disks get larger and relative reliability shrinks, it seems. So I agree
that this is a worthwhile thing to have. But shouldn't that be the job
of the filesystem? Think of ZFS or the upcoming BTRFS.

The idea is that these CRCs are going to be checked just after reading
files from disk, and calculated just before writing it. They are
just a protection against the storage layer going mad; they are not
intended to protect against faulty RAM, CPU or kernel.

That sounds reasonable if we do it from Postgres.

This code would be run-time or compile-time configurable. I'm not
absolutely sure which yet; the problem with run-time is what to do if
the user restarts the server with the setting flipped. It would have
almost no impact on users who don't enable it.

I'd say calculating a CRC is close enough to be considered "no impact".
A single core of a modern CPU easily reaches way above 200 MiB/s
throughput for CRC32 today. See [1]Crypto++ benchmarks: http://www.cryptopp.com/benchmarks.html.

Maybe consider Adler-32 which is 3-4x faster [2]Wikipedia about hash functions: http://en.wikipedia.org/wiki/List_of_hash_functions#Computational_costs_of_CRCs_vs_Hashes, also part of zlib and
AFAIK about equally safe for 8k blocks and above.

The implementation I'm envisioning requires the use of a new relation
fork to store the per-block CRCs. Initially I'm aiming at a CRC32 sum
for each block. FlushBuffer would calculate the checksum and store it
in the CRC fork; ReadBuffer_common would read the page, calculate the
checksum, and compare it to the one stored in the CRC fork.

Huh? Aren't CRCs normally stored as part of the block they are supposed
to protect? Or how do you expect to ensure the data from the CRC
relation fork is correct? How about crash safety (a data block written,
but not its CRC block or vice versa)?

Wouldn't that double the amount of seeking required for writes?

I'd like to submit this for 8.4, but I want to ensure that -hackers at
large approve of this feature before starting serious coding.

Very cool!

Regards

Markus Wanner

[1]: Crypto++ benchmarks: http://www.cryptopp.com/benchmarks.html
http://www.cryptopp.com/benchmarks.html

[2]: Wikipedia about hash functions: http://en.wikipedia.org/wiki/List_of_hash_functions#Computational_costs_of_CRCs_vs_Hashes
http://en.wikipedia.org/wiki/List_of_hash_functions#Computational_costs_of_CRCs_vs_Hashes

#8Heikki Linnakangas
heikki.linnakangas@enterprisedb.com
In reply to: Alvaro Herrera (#1)
Re: Block-level CRC checks

Alvaro Herrera wrote:

Initially I'm aiming at a CRC32 sum
for each block. FlushBuffer would calculate the checksum and store it
in the CRC fork; ReadBuffer_common would read the page, calculate the
checksum, and compare it to the one stored in the CRC fork.

There's one fundamental problem with that, related to the way our hint
bits are written.

Currently, hint bit updates are not WAL-logged, and thus no full page
write is done when only hint bits are changed. Imagine what happens if
hint bits are updated on a page, but there's no other changes, and we
crash so that only one half of the new page version makes it to disk (=
torn page). The CRC would not match, even though the page is actually valid.

--
Heikki Linnakangas
EnterpriseDB http://www.enterprisedb.com

#9Mark Woodward
pgsql@mohawksoft.com
In reply to: Alvaro Herrera (#1)
Re: Block-level CRC checks

A customer of ours has been having trouble with corrupted data for some
time. Of course, we've almost always blamed hardware (and we've seen
RAID controllers have their firmware upgraded, among other actions), but
the useful thing to know is when corruption has happened, and where.

That is an important statement, to know when it happens not necessarily to
be able to recover the block or where in the block it is corrupt. Is that
correct?

So we've been tasked with adding CRCs to data files.

CRC or checksum? If the objective is merely general "detection" there
should be some latitude in choosing the methodology for performance.

The idea is that these CRCs are going to be checked just after reading
files from disk, and calculated just before writing it. They are
just a protection against the storage layer going mad; they are not
intended to protect against faulty RAM, CPU or kernel.

It will actually find faults in all if it. If the CPU can't add and/or a
RAM location lost a bit, this will blow up just as easily as a bad block.
It may cause "false identification" of an error, but it will keep a bad
system from hiding.

This code would be run-time or compile-time configurable. I'm not
absolutely sure which yet; the problem with run-time is what to do if
the user restarts the server with the setting flipped. It would have
almost no impact on users who don't enable it.

CPU capacity on modern hardware within a small area of RAM is practically
infinite when compared to any sort of I/O.

The implementation I'm envisioning requires the use of a new relation
fork to store the per-block CRCs. Initially I'm aiming at a CRC32 sum
for each block. FlushBuffer would calculate the checksum and store it
in the CRC fork; ReadBuffer_common would read the page, calculate the
checksum, and compare it to the one stored in the CRC fork.

Hell, all that is needed is a long or a short checksum value in the block.
I mean, if you just want a sanity test, it doesn't take much. Using a
second relation creates confusion. If there is a CRC discrepancy between
two different blocks, who's wrong? You need a third "control" to know. If
the block knows its CRC or checksum and that is in error, the block is
bad.

A buffer's io_in_progress lock protects the buffer's CRC. We read and
pin the CRC page before acquiring the lock, to avoid having two buffer
IO operations in flight.

I'd like to submit this for 8.4, but I want to ensure that -hackers at
large approve of this feature before starting serious coding.

Opinions?

If its fast enough, its a good idea. It could be very helpful in
protecting users data.

Show quoted text

--
Alvaro Herrera
http://www.CommandPrompt.com/
PostgreSQL Replication, Consulting, Custom Development, 24x7 support

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#10Greg Smith
gsmith@gregsmith.com
In reply to: Heikki Linnakangas (#4)
Re: Block-level CRC checks

On Tue, 30 Sep 2008, Heikki Linnakangas wrote:

Doesn't some filesystems include a per-block CRC, which would achieve the
same thing? ZFS?

Yes, there is a popular advoacy piece for ZFS with a high-level view of
why and how they implement that at
http://blogs.sun.com/bonwick/entry/zfs_end_to_end_data The guarantees are
stronger than what you can get if you just put a CRC in the block itself.
I'd never really thought too hard about putting this in the database
knowing that ZFS is available for environments where this is a concern,
but it certainly would be a nice addition.

The best analysis I've ever seen that makes a case for OS or higher level
disk checksums of some sort, by looking at the myriad ways that disks and
disk arrays fail in the real world, is in
http://www.usenix.org/event/fast08/tech/full_papers/bairavasundaram/bairavasundaram.pdf
(there is a shorter version that hits the high points of that at
http://www.usenix.org/publications/login/2008-06/openpdfs/bairavasundaram.pdf
)

One really interesting bit in there I'd never seen before is that they
find real data that supports the stand that enterprise drives are
significantly more reliable than consumer ones. While general failure
rates aren't that different, "SATA disks have an order of magnitude higher
probability of developing checksum mismatches than Fibre Channel disks. We
find that 0.66% of SATA disks develop at least one mismatch during the
first 17 months in the field, whereas only 0.06% of Fibre Channel disks
develop a mismatch during that time."

--
* Greg Smith gsmith@gregsmith.com http://www.gregsmith.com Baltimore, MD

#11Bruce Momjian
bruce@momjian.us
In reply to: Alvaro Herrera (#1)
Re: Block-level CRC checks

Alvaro Herrera wrote:

A customer of ours has been having trouble with corrupted data for some
time. Of course, we've almost always blamed hardware (and we've seen
RAID controllers have their firmware upgraded, among other actions), but
the useful thing to know is when corruption has happened, and where.

So we've been tasked with adding CRCs to data files.

Maybe a stupid question, but what I/O subsystems corrupt data and fail
to report it?

--
Bruce Momjian <bruce@momjian.us> http://momjian.us
EnterpriseDB http://enterprisedb.com

+ If your life is a hard drive, Christ can be your backup. +

#12Jeffrey Baker
jwbaker@gmail.com
In reply to: Bruce Momjian (#11)
Re: Block-level CRC checks

On Tue, Sep 30, 2008 at 1:41 PM, Bruce Momjian <bruce@momjian.us> wrote:

Alvaro Herrera wrote:

A customer of ours has been having trouble with corrupted data for some
time. Of course, we've almost always blamed hardware (and we've seen
RAID controllers have their firmware upgraded, among other actions), but
the useful thing to know is when corruption has happened, and where.

So we've been tasked with adding CRCs to data files.

Maybe a stupid question, but what I/O subsystems corrupt data and fail
to report it?

Practically all of them. Here is a good paper on various checksums, their
failure rates, and practical applications.

"Parity Lost and Parity Regained"
http://www.usenix.org/event/fast08/tech/full_papers/krioukov/krioukov_html/index.html

-jwb

#13Jim Nasby
Jim.Nasby@BlueTreble.com
In reply to: Mark Woodward (#9)
Re: Block-level CRC checks

On Sep 30, 2008, at 2:17 PM, pgsql@mohawksoft.com wrote:

A customer of ours has been having trouble with corrupted data for
some
time. Of course, we've almost always blamed hardware (and we've seen
RAID controllers have their firmware upgraded, among other
actions), but
the useful thing to know is when corruption has happened, and where.

That is an important statement, to know when it happens not
necessarily to
be able to recover the block or where in the block it is corrupt.
Is that
correct?

Oh, correcting the corruption would be AWESOME beyond belief! But at
this point I'd settle for just knowing it had happened.

So we've been tasked with adding CRCs to data files.

CRC or checksum? If the objective is merely general "detection" there
should be some latitude in choosing the methodology for performance.

See above. Perhaps the best win would be a case where you could
choose which method you wanted. We generally have extra CPU on the
servers, so we could afford to burn some cycles with more complex
algorithms.

The idea is that these CRCs are going to be checked just after
reading
files from disk, and calculated just before writing it. They are
just a protection against the storage layer going mad; they are not
intended to protect against faulty RAM, CPU or kernel.

It will actually find faults in all if it. If the CPU can't add and/
or a
RAM location lost a bit, this will blow up just as easily as a bad
block.
It may cause "false identification" of an error, but it will keep a
bad
system from hiding.

Well, very likely not, since the intention is to only compute the CRC
when we write the block out, at least for now. In the future I would
like to be able to detect when a CPU or memory goes bonkers and poops
on something, because that's actually happened to us as well.

The implementation I'm envisioning requires the use of a new relation
fork to store the per-block CRCs. Initially I'm aiming at a CRC32
sum
for each block. FlushBuffer would calculate the checksum and
store it
in the CRC fork; ReadBuffer_common would read the page, calculate the
checksum, and compare it to the one stored in the CRC fork.

Hell, all that is needed is a long or a short checksum value in the
block.
I mean, if you just want a sanity test, it doesn't take much. Using a
second relation creates confusion. If there is a CRC discrepancy
between
two different blocks, who's wrong? You need a third "control" to
know. If
the block knows its CRC or checksum and that is in error, the block is
bad.

I believe the idea was to make this as non-invasive as possible. And
it would be really nice if this could be enabled without a dump/
reload (maybe the upgrade stuff would make this possible?)
--
Decibel!, aka Jim C. Nasby, Database Architect decibel@decibel.org
Give your computer some brain candy! www.distributed.net Team #1828

Attachments:

smime.p7sapplication/pkcs7-signature; name=smime.p7sDownload
#14Joshua D. Drake
jd@commandprompt.com
In reply to: Jeffrey Baker (#12)
Re: Block-level CRC checks

On Tue, 30 Sep 2008 13:48:52 -0700
"Jeffrey Baker" <jwbaker@gmail.com> wrote:

Practically all of them. Here is a good paper on various checksums,
their failure rates, and practical applications.

"Parity Lost and Parity Regained"
http://www.usenix.org/event/fast08/tech/full_papers/krioukov/krioukov_html/index.html

In a related article published in Login called "Data Corruption in the
storage stack: a closer look" they say:

During a 41-month period we observed more than 400,000 instances of
checksum mistmatches, 8% of which were discovered during RAID
reconstruction, creating the possibility of real data loss.

They also have a wonderful term they mention, "Silent Data corruptions".

Joshua D. Drake

[1]: Login June 2008

-jwb

--
The PostgreSQL Company since 1997: http://www.commandprompt.com/
PostgreSQL Community Conference: http://www.postgresqlconference.org/
United States PostgreSQL Association: http://www.postgresql.us/

#15Mark Woodward
pgsql@mohawksoft.com
In reply to: Jim Nasby (#13)
Re: Block-level CRC checks

I believe the idea was to make this as non-invasive as possible. And
it would be really nice if this could be enabled without a dump/
reload (maybe the upgrade stuff would make this possible?)
--

It's all about the probability of a duplicate check being generated. If
you use a 32 bit checksum, then you have a theoretical probability of 1 in
4 billion that a corrupt block will be missed (probably much lower
depending on your algorithm). If you use a short, then a 1 in 65 thousand
probability. If you use an 8 bit number, then 1 in 256.

Why am I going on? Well, if there are any spare bits in a block header,
they could be used for the check value.

#16Jim Nasby
Jim.Nasby@BlueTreble.com
In reply to: Heikki Linnakangas (#4)
Re: Block-level CRC checks

On Sep 30, 2008, at 1:48 PM, Heikki Linnakangas wrote:

This has been suggested before, and the usual objection is
precisely that it only protects from errors in the storage layer,
giving a false sense of security.

If you can come up with a mechanism for detecting non-storage errors
as well, I'm all ears. :)

In the meantime, you're way, way more likely to experience corruption
at the storage layer than anywhere else. We've had several corruption
events, only one of which was memory related... and we *know* it was
memory related because we actually got logs saying so. But with a SAN
environment there's a lot of moving parts, all waiting to screw up
your data:

filesystem
SAN device driver
SAN network
SAN BIOS
drive BIOS
drive

That's above things that could hose your data outside of storage:
kernel
CPU
memory
motherboard

Doesn't some filesystems include a per-block CRC, which would
achieve the same thing? ZFS?

Sure, some do. We're on linux and can't run ZFS. And I'll argue that
no linux FS is anywhere near as tested as ext3 is, which means that
going to some other FS that offers you CRC means you're now exposing
yourself to the possibility of issues with the FS itself. Not to
mention that changing filesystems on a large production system is
very painful.
--
Decibel!, aka Jim C. Nasby, Database Architect decibel@decibel.org
Give your computer some brain candy! www.distributed.net Team #1828

Attachments:

smime.p7sapplication/pkcs7-signature; name=smime.p7sDownload
#17Bruce Momjian
bruce@momjian.us
In reply to: Jim Nasby (#16)
Re: Block-level CRC checks

On 30 Sep 2008, at 10:17 PM, Decibel! <decibel@decibel.org> wrote:

On Sep 30, 2008, at 1:48 PM, Heikki Linnakangas wrote:

This has been suggested before, and the usual objection is
precisely that it only protects from errors in the storage layer,
giving a false sense of security.

If you can come up with a mechanism for detecting non-storage errors
as well, I'm all ears. :)

In the meantime, you're way, way more likely to experience
corruption at the storage layer than anywhere else.

Fwiw this hasn't been my experience. Bad memory is extremely common
and even the storage failures I've seen (excluding the drive crashes)
turned out to actually be caused by bad memory.

That said I've always been interested in doing this. The main use case
in my mind has actually been for data that's been restored from old
backups which have been lying round and floating between machines for
a while with many opportunities for bit errors to show up.

The main stumbling block I ran into was how to deal with turning the
option off and on. I wanted it to be possible to turn off the option
to have the database ignore any errors and to avoid the overhead.

But that means including an escape hatch value which is always
considered to be correct. But that dramatically reduces the
effectiveness of the scheme.

Another issue is it will make space available on each page smaller
making it harder to do in place upgrades.

If you can deal with those issues and carefully deal with the
contingencies so it's clear to people what to do when errra occur or
they want to turn the feature on or off then I'm all for it. That
despite my experience of memory errors being a lot more common than
undetected storage errors.

#18Andrew Chernow
ac@esilo.com
In reply to: Joshua D. Drake (#14)
Re: Block-level CRC checks

Joshua Drake wrote:

During a 41-month period we observed more than 400,000 instances of
checksum mistmatches, 8% of which were discovered during RAID
reconstruction, creating the possibility of real data loss.

They also have a wonderful term they mention, "Silent Data corruptions".

Exactely!

From my experience, the only assumption to be made about storage is that it can
and will fail ... frequently! It is unreliable (not to mention slooow) and
should not be trusted; regardless of the price tag or brand.

This could help detect:

- fs corruption
- vfs bug
- raid controller firmware bug
- bad disk sector
- power crash
- weird martian-like raid rebuilds

Although, this idea won't prevent anything. Everything would still sinisterly
fail on you. The difference is, no more silence.

--
Andrew Chernow
eSilo, LLC
every bit counts
http://www.esilo.com/

#19Paul Schlie
schlie@comcast.net
In reply to: Andrew Chernow (#18)
Re: Block-level CRC checks

If you are concerned with data integrity (not caused by bugs in the code
itself), you may be interested in utilizing ZFS; however, be aware that I
found and reported a bug in their implementation of the Fletcher checksum
algorithm they use by default to attempt to verify the integrity of the data
stored in their file system, and further aware that checksums/CRCs do not
enable the correction of errors in general, therefore be prepared to make
the decision of "what should be done in the event of a failure"; ZFS
effectively locks up in certain circumstances rather risk silently using
suspect data with some form of persistent indication that the result may be
corrupted. (strong CRC's and FEC's are relatively inexpensive to compute).

So in summary, my two cents: a properly implemented 32/64 bit Fletcher
checksum is likely adequate to detect most errors (and correct them if
presumed to be a result of a single flipped bit within 128KB or so, as such
a Fletcher checksum has a hamming distance of 3 within blocks of this size,
albeit fairly expensive to do so by trial and error; further presuming that
this can not be relied upon, a strategy potentially utilizing the suspect
data as if it were good likely needs to be adopted, accompanied somehow with
a persistent indication that the query results (or specific sub-results) are
themselves suspect, as it may often be a lesser evil than the alternative
(but not always). Or use a file system like ZFS, and let it do its thing,
and hope for the best.

#20Paul Schlie
schlie@comcast.net
In reply to: Paul Schlie (#19)
Re: Block-level CRC checks

Joshua D. Drake wrote:
...
ZFS is not an option; generally speaking.

Then in general, if the corruption occurred within the:

- read path, try again and hope it takes care of itself.

- write path, the best that can be hoped for is a single bit error
within the data itself which can be both detected and corrected
with a sufficiently strong check sum; or worst case if address or
control information was corrupted, god knows what happed to the
data, and what other data may have been destroyed by having the
data written to the wrong blocks and typically unrecoverable.

- drive itself, this is most typically very unlikely, as strong FEC
codes typically prevent the misidentification of unrecoverable
data as being otherwise.

The simplest thing to do would seem to be to upon reading blocks
check the check sum, if bad, try read again; if that doesn't fix
the problem, assume a single bit error, and iteratively flip
single bits until the check sum matches (hopefully not making the
problem worse as may be the case if many bits were actually already
in error) and write the data back, and proceed as normal, possibly
logging the action; otherwise presume the data is unrecoverable and
in error, somehow mark it as being so such that subsequent queries
which may utilize any portion of it knows it may be corrupt (which
I suspect may be best done not on file-system blocks, but actually
on a logical rows or even individual entries if very large, as my
best initial guess, and likely to measurably affect performance
when enabled, and haven't a clue how resulting query should/could
be identified as being potentially corrupt without confusing the
client which requested it).

#21Laurenz Albe
laurenz.albe@cybertec.at
In reply to: Jonah H. Harris (#6)
#22Zdenek Kotala
Zdenek.Kotala@Sun.COM
In reply to: Alvaro Herrera (#1)
#23Harald Armin Massa
haraldarminmassa@gmail.com
In reply to: Zdenek Kotala (#22)
#24Hannu Krosing
hannu@tm.ee
In reply to: Mark Woodward (#15)
#25Tom Lane
tgl@sss.pgh.pa.us
In reply to: Hannu Krosing (#24)
#26Tom Lane
tgl@sss.pgh.pa.us
In reply to: Harald Armin Massa (#23)
#27Jonah H. Harris
jonah.harris@gmail.com
In reply to: Tom Lane (#26)
#28Mark Woodward
pgsql@mohawksoft.com
In reply to: Hannu Krosing (#24)
#29Mark Woodward
pgsql@mohawksoft.com
In reply to: Tom Lane (#25)
#30Brian Hurt
bhurt@janestcapital.com
In reply to: Paul Schlie (#20)
#31Brian Hurt
bhurt@janestcapital.com
In reply to: Brian Hurt (#30)
#32Tom Lane
tgl@sss.pgh.pa.us
In reply to: Mark Woodward (#29)
#33Paul Schlie
schlie@comcast.net
In reply to: Brian Hurt (#30)
#34Paul Schlie
schlie@comcast.net
In reply to: Brian Hurt (#31)
#35Jonah H. Harris
jonah.harris@gmail.com
In reply to: Tom Lane (#32)
#36Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Tom Lane (#3)
#37Tom Lane
tgl@sss.pgh.pa.us
In reply to: Alvaro Herrera (#36)
#38Tom Lane
tgl@sss.pgh.pa.us
In reply to: Jonah H. Harris (#35)
#39Mark Woodward
pgsql@mohawksoft.com
In reply to: Tom Lane (#32)
#40Jonah H. Harris
jonah.harris@gmail.com
In reply to: Tom Lane (#38)
#41Tom Lane
tgl@sss.pgh.pa.us
In reply to: Paul Schlie (#33)
#42Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Tom Lane (#38)
#43Bruce Momjian
bruce@momjian.us
In reply to: Tom Lane (#38)
#44Jonah H. Harris
jonah.harris@gmail.com
In reply to: Alvaro Herrera (#42)
#45Paul Schlie
schlie@comcast.net
In reply to: Jonah H. Harris (#44)
#46Florian Weimer
fweimer@bfk.de
In reply to: Heikki Linnakangas (#8)
#47Tom Lane
tgl@sss.pgh.pa.us
In reply to: Alvaro Herrera (#42)
#48Csaba Nagy
nagy@ecircle-ag.com
In reply to: Bruce Momjian (#43)
#49Florian Weimer
fweimer@bfk.de
In reply to: Tom Lane (#38)
#50Aidan Van Dyk
aidan@highrise.ca
In reply to: Bruce Momjian (#43)
#51Paul Schlie
schlie@comcast.net
In reply to: Tom Lane (#41)
#52Mark Mielke
mark@mark.mielke.cc
In reply to: Aidan Van Dyk (#50)
#53Mark Mielke
mark@mark.mielke.cc
In reply to: Tom Lane (#41)
#54Bruce Momjian
bruce@momjian.us
In reply to: Aidan Van Dyk (#50)
#55Bruce Momjian
bruce@momjian.us
In reply to: Paul Schlie (#51)
#56Sam Mason
sam@samason.me.uk
In reply to: Alvaro Herrera (#42)
#57Kevin Grittner
Kevin.Grittner@wicourts.gov
In reply to: Tom Lane (#41)
#58Paul Schlie
schlie@comcast.net
In reply to: Kevin Grittner (#57)
#59Tom Lane
tgl@sss.pgh.pa.us
In reply to: Paul Schlie (#58)
#60Jonah H. Harris
jonah.harris@gmail.com
In reply to: Tom Lane (#59)
#61Tom Lane
tgl@sss.pgh.pa.us
In reply to: Aidan Van Dyk (#50)
#62Mark Woodward
pgsql@mohawksoft.com
In reply to: Tom Lane (#61)
#63Tom Lane
tgl@sss.pgh.pa.us
In reply to: Mark Woodward (#62)
#64Bruce Momjian
bruce@momjian.us
In reply to: Mark Woodward (#62)
#65Tom Lane
tgl@sss.pgh.pa.us
In reply to: Bruce Momjian (#64)
#66Aidan Van Dyk
aidan@highrise.ca
In reply to: Tom Lane (#65)
#67Jonah H. Harris
jonah.harris@gmail.com
In reply to: Aidan Van Dyk (#66)
#68Jonah H. Harris
jonah.harris@gmail.com
In reply to: Jonah H. Harris (#67)
#69Heikki Linnakangas
heikki.linnakangas@enterprisedb.com
In reply to: Jonah H. Harris (#67)
#70Florian Weimer
fweimer@bfk.de
In reply to: Bruce Momjian (#55)
#71Hannu Krosing
hannu@tm.ee
In reply to: Heikki Linnakangas (#69)
#72Brian Hurt
bhurt@janestcapital.com
In reply to: Jonah H. Harris (#67)
#73Jonah H. Harris
jonah.harris@gmail.com
In reply to: Brian Hurt (#72)
#74Brian Hurt
bhurt@janestcapital.com
In reply to: Jonah H. Harris (#73)
#75Bruce Momjian
bruce@momjian.us
In reply to: Jonah H. Harris (#73)
#76Jonah H. Harris
jonah.harris@gmail.com
In reply to: Brian Hurt (#74)
#77Jonah H. Harris
jonah.harris@gmail.com
In reply to: Bruce Momjian (#75)
#78Heikki Linnakangas
heikki.linnakangas@enterprisedb.com
In reply to: Brian Hurt (#74)
#79Tom Lane
tgl@sss.pgh.pa.us
In reply to: Heikki Linnakangas (#78)
#80Heikki Linnakangas
heikki.linnakangas@enterprisedb.com
In reply to: Tom Lane (#79)
#81Andrew Chernow
ac@esilo.com
In reply to: Jonah H. Harris (#68)
#82Jonah H. Harris
jonah.harris@gmail.com
In reply to: Andrew Chernow (#81)
#83Heikki Linnakangas
heikki.linnakangas@enterprisedb.com
In reply to: Jonah H. Harris (#82)
#84Jonah H. Harris
jonah.harris@gmail.com
In reply to: Heikki Linnakangas (#83)
#85Tom Lane
tgl@sss.pgh.pa.us
In reply to: Heikki Linnakangas (#80)
#86Tom Lane
tgl@sss.pgh.pa.us
In reply to: Andrew Chernow (#81)
#87Jonah H. Harris
jonah.harris@gmail.com
In reply to: Tom Lane (#85)
#88Jonah H. Harris
jonah.harris@gmail.com
In reply to: Jonah H. Harris (#87)
#89Tom Lane
tgl@sss.pgh.pa.us
In reply to: Jonah H. Harris (#88)
#90Robert Treat
xzilla@users.sourceforge.net
In reply to: Jim Nasby (#16)
#91Aidan Van Dyk
aidan@highrise.ca
In reply to: Tom Lane (#89)
#92Joshua D. Drake
jd@commandprompt.com
In reply to: Robert Treat (#90)
#93Jonah H. Harris
jonah.harris@gmail.com
In reply to: Aidan Van Dyk (#91)
#94Aidan Van Dyk
aidan@highrise.ca
In reply to: Jonah H. Harris (#93)
#95Jonah H. Harris
jonah.harris@gmail.com
In reply to: Aidan Van Dyk (#94)
#96Bruce Momjian
bruce@momjian.us
In reply to: Jonah H. Harris (#95)
#97Aidan Van Dyk
aidan@highrise.ca
In reply to: Bruce Momjian (#96)
#98Jonah H. Harris
jonah.harris@gmail.com
In reply to: Bruce Momjian (#96)
#99Bruce Momjian
bruce@momjian.us
In reply to: Aidan Van Dyk (#94)
#100Bruce Momjian
bruce@momjian.us
In reply to: Jonah H. Harris (#98)
#101Jonah H. Harris
jonah.harris@gmail.com
In reply to: Bruce Momjian (#99)
#102Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Bruce Momjian (#99)
#103Aidan Van Dyk
aidan@highrise.ca
In reply to: Bruce Momjian (#99)
#104Bruce Momjian
bruce@momjian.us
In reply to: Aidan Van Dyk (#103)
#105Jonah H. Harris
jonah.harris@gmail.com
In reply to: Bruce Momjian (#104)
#106Jonah H. Harris
jonah.harris@gmail.com
In reply to: Alvaro Herrera (#102)
#107Aidan Van Dyk
aidan@highrise.ca
In reply to: Jonah H. Harris (#105)
#108Robert Treat
xzilla@users.sourceforge.net
In reply to: Tom Lane (#32)
#109Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Robert Treat (#108)
#110Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Jonah H. Harris (#106)
#111Aidan Van Dyk
aidan@highrise.ca
In reply to: Alvaro Herrera (#110)
#112Simon Riggs
simon@2ndQuadrant.com
In reply to: Alvaro Herrera (#110)
#113Dawid Kuroczko
qnex42@gmail.com
In reply to: Jonah H. Harris (#101)
#114Jim Nasby
Jim.Nasby@BlueTreble.com
In reply to: Sam Mason (#56)
#115Bruce Momjian
bruce@momjian.us
In reply to: Dawid Kuroczko (#113)
#116Jim Nasby
Jim.Nasby@BlueTreble.com
In reply to: Alvaro Herrera (#110)
#117Brian Hurt
bhurt@janestcapital.com
In reply to: Jim Nasby (#116)
#118Dawid Kuroczko
qnex42@gmail.com
In reply to: Brian Hurt (#117)
#119Bruce Momjian
bruce@momjian.us
In reply to: Brian Hurt (#117)
#120Aidan Van Dyk
aidan@highrise.ca
In reply to: Jim Nasby (#116)
#121Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Alvaro Herrera (#1)
#122Jonah H. Harris
jonah.harris@gmail.com
In reply to: Alvaro Herrera (#121)
#123Bruce Momjian
bruce@momjian.us
In reply to: Jonah H. Harris (#122)
#124Jonah H. Harris
jonah.harris@gmail.com
In reply to: Bruce Momjian (#123)
#125Aidan Van Dyk
aidan@highrise.ca
In reply to: Bruce Momjian (#123)
#126Simon Riggs
simon@2ndQuadrant.com
In reply to: Alvaro Herrera (#121)
#127Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Simon Riggs (#126)
#128Simon Riggs
simon@2ndQuadrant.com
In reply to: Alvaro Herrera (#127)
#129Bruce Momjian
bruce@momjian.us
In reply to: Alvaro Herrera (#127)
#130Markus Wanner
markus@bluegap.ch
In reply to: Alvaro Herrera (#121)
#131Heikki Linnakangas
heikki.linnakangas@enterprisedb.com
In reply to: Markus Wanner (#130)
#132Paul Schlie
schlie@comcast.net
In reply to: Heikki Linnakangas (#131)
#133Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Simon Riggs (#126)
#134Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Alvaro Herrera (#133)
#135Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Alvaro Herrera (#133)
#136Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Alvaro Herrera (#133)
#137Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Alvaro Herrera (#135)
#138Bruce Momjian
bruce@momjian.us
In reply to: Alvaro Herrera (#137)
#139Zdenek Kotala
Zdenek.Kotala@Sun.COM
In reply to: Alvaro Herrera (#133)
#140Jonah H. Harris
jonah.harris@gmail.com
In reply to: Zdenek Kotala (#139)
#141Joshua D. Drake
jd@commandprompt.com
In reply to: Jonah H. Harris (#140)
#142Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Zdenek Kotala (#139)
#143Bruce Momjian
bruce@momjian.us
In reply to: Joshua D. Drake (#141)
#144Tom Lane
tgl@sss.pgh.pa.us
In reply to: Jonah H. Harris (#140)
#145Jonah H. Harris
jonah.harris@gmail.com
In reply to: Tom Lane (#144)
#146Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Bruce Momjian (#138)
#147Tom Lane
tgl@sss.pgh.pa.us
In reply to: Jonah H. Harris (#145)
#148Zdenek Kotala
Zdenek.Kotala@Sun.COM
In reply to: Jonah H. Harris (#140)
#149Jonah H. Harris
jonah.harris@gmail.com
In reply to: Tom Lane (#147)
#150Bruce Momjian
bruce@momjian.us
In reply to: Alvaro Herrera (#142)
#151Zdenek Kotala
Zdenek.Kotala@Sun.COM
In reply to: Alvaro Herrera (#142)
#152Tom Lane
tgl@sss.pgh.pa.us
In reply to: Zdenek Kotala (#151)
#153Zdenek Kotala
Zdenek.Kotala@Sun.COM
In reply to: Tom Lane (#152)
#154Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Bruce Momjian (#143)
#155Jonah H. Harris
jonah.harris@gmail.com
In reply to: Alvaro Herrera (#154)
#156Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Alvaro Herrera (#146)
In reply to: Bruce Momjian (#150)
#158Florian Weimer
fweimer@bfk.de
In reply to: Bruce Momjian (#99)
#159Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Alvaro Herrera (#156)
#160Paul Schlie
schlie@comcast.net
In reply to: Alvaro Herrera (#159)
In reply to: Alvaro Herrera (#121)
#162Tom Lane
tgl@sss.pgh.pa.us
In reply to: Martijn van Oosterhout (#161)
In reply to: Tom Lane (#162)
#164Bruce Momjian
bruce@momjian.us
In reply to: Tom Lane (#162)
#165Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Bruce Momjian (#164)
#166Tom Lane
tgl@sss.pgh.pa.us
In reply to: Alvaro Herrera (#165)
#167Bruce Momjian
bruce@momjian.us
In reply to: Tom Lane (#166)
#168Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Bruce Momjian (#167)
#169Bruce Momjian
bruce@momjian.us
In reply to: Alvaro Herrera (#168)
In reply to: Bruce Momjian (#169)
#171Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Martijn van Oosterhout (#170)
#172Tom Lane
tgl@sss.pgh.pa.us
In reply to: Alvaro Herrera (#171)
#173Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Tom Lane (#172)
#174Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Alvaro Herrera (#173)
In reply to: Alvaro Herrera (#171)
#176Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Martijn van Oosterhout (#175)
#177Bruce Momjian
bruce@momjian.us
In reply to: Alvaro Herrera (#176)
#178Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Bruce Momjian (#177)
#179Tom Lane
tgl@sss.pgh.pa.us
In reply to: Alvaro Herrera (#178)
#180Aidan Van Dyk
aidan@highrise.ca
In reply to: Alvaro Herrera (#178)
#181Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Tom Lane (#179)
#182Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Aidan Van Dyk (#180)
#183Tom Lane
tgl@sss.pgh.pa.us
In reply to: Alvaro Herrera (#181)
#184Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Alvaro Herrera (#181)
#185Heikki Linnakangas
heikki.linnakangas@enterprisedb.com
In reply to: Alvaro Herrera (#182)
#186Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Heikki Linnakangas (#185)
#187Aidan Van Dyk
aidan@highrise.ca
In reply to: Tom Lane (#183)
In reply to: Tom Lane (#179)
#189Tom Lane
tgl@sss.pgh.pa.us
In reply to: Martijn van Oosterhout (#188)
#190Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Tom Lane (#189)
In reply to: Alvaro Herrera (#190)
#192Tom Lane
tgl@sss.pgh.pa.us
In reply to: Martijn van Oosterhout (#191)
In reply to: Tom Lane (#192)
#194Heikki Linnakangas
heikki.linnakangas@enterprisedb.com
In reply to: Martijn van Oosterhout (#193)
#195Bruce Momjian
bruce@momjian.us
In reply to: Heikki Linnakangas (#194)
#196Aidan Van Dyk
aidan@highrise.ca
In reply to: Bruce Momjian (#195)
In reply to: Aidan Van Dyk (#196)
#198Aidan Van Dyk
aidan@highrise.ca
In reply to: Martijn van Oosterhout (#197)
#199Bruce Momjian
bruce@momjian.us
In reply to: Aidan Van Dyk (#196)
#200Heikki Linnakangas
heikki.linnakangas@enterprisedb.com
In reply to: Bruce Momjian (#199)
#201Matthew T. O'Connor
matthew@zeut.net
In reply to: Aidan Van Dyk (#196)
#202Aidan Van Dyk
aidan@highrise.ca
In reply to: Matthew T. O'Connor (#201)
#203Paul Schlie
schlie@comcast.net
In reply to: Aidan Van Dyk (#202)
#204Bruce Momjian
bruce@momjian.us
In reply to: Paul Schlie (#203)
#205Paul Schlie
schlie@comcast.net
In reply to: Bruce Momjian (#204)
#206Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Aidan Van Dyk (#198)
#207Heikki Linnakangas
heikki.linnakangas@enterprisedb.com
In reply to: Alvaro Herrera (#206)
#208Aidan Van Dyk
aidan@highrise.ca
In reply to: Alvaro Herrera (#206)
#209Tom Lane
tgl@sss.pgh.pa.us
In reply to: Heikki Linnakangas (#207)
#210Tom Lane
tgl@sss.pgh.pa.us
In reply to: Aidan Van Dyk (#208)
#211Aidan Van Dyk
aidan@highrise.ca
In reply to: Tom Lane (#210)
#212Joshua D. Drake
jd@commandprompt.com
In reply to: Aidan Van Dyk (#211)
#213Jaime Casanova
jcasanov@systemguards.com.ec
In reply to: Alvaro Herrera (#178)
#214Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Jaime Casanova (#213)
#215Josh Berkus
josh@agliodbs.com
In reply to: Alvaro Herrera (#214)
#216Jonah H. Harris
jonah.harris@gmail.com
In reply to: Josh Berkus (#215)
#217Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Jonah H. Harris (#216)
#218Jonah H. Harris
jonah.harris@gmail.com
In reply to: Alvaro Herrera (#217)
#219Bruce Momjian
bruce@momjian.us
In reply to: Jonah H. Harris (#218)
#220Jonah H. Harris
jonah.harris@gmail.com
In reply to: Bruce Momjian (#219)
#221Tom Lane
tgl@sss.pgh.pa.us
In reply to: Jonah H. Harris (#220)
#222Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Jonah H. Harris (#220)
#223Jonah H. Harris
jonah.harris@gmail.com
In reply to: Tom Lane (#221)
#224Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Jonah H. Harris (#223)
#225Jonah H. Harris
jonah.harris@gmail.com
In reply to: Alvaro Herrera (#224)
#226Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Jonah H. Harris (#225)
#227Bruce Momjian
bruce@momjian.us
In reply to: Alvaro Herrera (#224)
#228Joshua D. Drake
jd@commandprompt.com
In reply to: Bruce Momjian (#219)
#229Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Joshua D. Drake (#228)
#230Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Bruce Momjian (#227)
#231Joshua D. Drake
jd@commandprompt.com
In reply to: Alvaro Herrera (#229)
#232Jonah H. Harris
jonah.harris@gmail.com
In reply to: Alvaro Herrera (#230)
#233Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Joshua D. Drake (#231)
#234Simon Riggs
simon@2ndQuadrant.com
In reply to: Alvaro Herrera (#121)
#235Joshua D. Drake
jd@commandprompt.com
In reply to: Simon Riggs (#234)
#236Heikki Linnakangas
heikki.linnakangas@enterprisedb.com
In reply to: Simon Riggs (#234)
#237Simon Riggs
simon@2ndQuadrant.com
In reply to: Heikki Linnakangas (#236)
#238Aidan Van Dyk
aidan@highrise.ca
In reply to: Simon Riggs (#237)
#239Simon Riggs
simon@2ndQuadrant.com
In reply to: Aidan Van Dyk (#238)
#240Tom Lane
tgl@sss.pgh.pa.us
In reply to: Simon Riggs (#239)
#241Simon Riggs
simon@2ndQuadrant.com
In reply to: Tom Lane (#240)
#242Heikki Linnakangas
heikki.linnakangas@enterprisedb.com
In reply to: Simon Riggs (#241)
#243Simon Riggs
simon@2ndQuadrant.com
In reply to: Heikki Linnakangas (#242)
#244Bruce Momjian
bruce@momjian.us
In reply to: Simon Riggs (#243)
#245Simon Riggs
simon@2ndQuadrant.com
In reply to: Bruce Momjian (#244)
#246Bruce Momjian
bruce@momjian.us
In reply to: Simon Riggs (#245)
#247Robert Haas
robertmhaas@gmail.com
In reply to: Heikki Linnakangas (#236)
#248Bruce Momjian
bruce@momjian.us
In reply to: Robert Haas (#247)
#249Simon Riggs
simon@2ndQuadrant.com
In reply to: Bruce Momjian (#246)
#250Bruce Momjian
bruce@momjian.us
In reply to: Simon Riggs (#249)
#251Bruce Momjian
bruce@momjian.us
In reply to: Bruce Momjian (#250)
#252Simon Riggs
simon@2ndQuadrant.com
In reply to: Bruce Momjian (#250)
#253Simon Riggs
simon@2ndQuadrant.com
In reply to: Bruce Momjian (#251)
#254Heikki Linnakangas
heikki.linnakangas@enterprisedb.com
In reply to: Bruce Momjian (#246)
#255marcin mank
marcin.mank@gmail.com
In reply to: Heikki Linnakangas (#236)
#256Andres Freund
andres@anarazel.de
In reply to: marcin mank (#255)
#257Aidan Van Dyk
aidan@highrise.ca
In reply to: Andres Freund (#256)
#258Robert Haas
robertmhaas@gmail.com
In reply to: Heikki Linnakangas (#254)
#259Andres Freund
andres@anarazel.de
In reply to: Aidan Van Dyk (#257)
#260Heikki Linnakangas
heikki.linnakangas@enterprisedb.com
In reply to: Robert Haas (#258)
#261Simon Riggs
simon@2ndQuadrant.com
In reply to: Heikki Linnakangas (#254)
#262Robert Haas
robertmhaas@gmail.com
In reply to: Heikki Linnakangas (#260)
#263Florian Weimer
fweimer@bfk.de
In reply to: Simon Riggs (#261)
#264Tom Lane
tgl@sss.pgh.pa.us
In reply to: Florian Weimer (#263)
#265Simon Riggs
simon@2ndQuadrant.com
In reply to: Heikki Linnakangas (#260)
#266Tom Lane
tgl@sss.pgh.pa.us
In reply to: Simon Riggs (#265)
#267Robert Haas
robertmhaas@gmail.com
In reply to: Simon Riggs (#265)
#268Joshua D. Drake
jd@commandprompt.com
In reply to: Bruce Momjian (#246)
#269Simon Riggs
simon@2ndQuadrant.com
In reply to: Tom Lane (#266)
#270Joshua D. Drake
jd@commandprompt.com
In reply to: Tom Lane (#266)
#271Bruce Momjian
bruce@momjian.us
In reply to: Simon Riggs (#261)
#272Robert Haas
robertmhaas@gmail.com
In reply to: Joshua D. Drake (#270)
#273Simon Riggs
simon@2ndQuadrant.com
In reply to: Bruce Momjian (#271)
#274Joshua D. Drake
jd@commandprompt.com
In reply to: Robert Haas (#272)
#275Tom Lane
tgl@sss.pgh.pa.us
In reply to: Bruce Momjian (#271)
#276Tom Lane
tgl@sss.pgh.pa.us
In reply to: Simon Riggs (#273)
#277Aidan Van Dyk
aidan@highrise.ca
In reply to: Tom Lane (#276)
#278Bruce Momjian
bruce@momjian.us
In reply to: Tom Lane (#275)
#279Tom Lane
tgl@sss.pgh.pa.us
In reply to: Bruce Momjian (#278)
#280Josh Berkus
josh@agliodbs.com
In reply to: Tom Lane (#275)
#281Kevin Grittner
Kevin.Grittner@wicourts.gov
In reply to: Josh Berkus (#280)
#282Bruce Momjian
bruce@momjian.us
In reply to: Josh Berkus (#280)
#283Robert Haas
robertmhaas@gmail.com
In reply to: Aidan Van Dyk (#277)
#284Bruce Momjian
bruce@momjian.us
In reply to: Robert Haas (#283)
#285Bruce Momjian
bruce@momjian.us
In reply to: Bruce Momjian (#284)
#286Robert Haas
robertmhaas@gmail.com
In reply to: Bruce Momjian (#284)
#287Tom Lane
tgl@sss.pgh.pa.us
In reply to: Robert Haas (#286)
#288Andrew Dunstan
andrew@dunslane.net
In reply to: Tom Lane (#287)
#289Bruce Momjian
bruce@momjian.us
In reply to: Andrew Dunstan (#288)
#290Bruce Momjian
bruce@momjian.us
In reply to: Tom Lane (#275)
#291Tom Lane
tgl@sss.pgh.pa.us
In reply to: Bruce Momjian (#290)
#292Richard Huxton
dev@archonet.com
In reply to: Bruce Momjian (#290)
#293Jim Nasby
Jim.Nasby@BlueTreble.com
In reply to: Tom Lane (#276)
#294Bruce Momjian
bruce@momjian.us
In reply to: Tom Lane (#291)
#295Bruce Momjian
bruce@momjian.us
In reply to: Richard Huxton (#292)
#296Jim Nasby
Jim.Nasby@BlueTreble.com
In reply to: Kevin Grittner (#281)
#297Bruce Momjian
bruce@momjian.us
In reply to: Jim Nasby (#293)
#298Bruce Momjian
bruce@momjian.us
In reply to: Bruce Momjian (#278)
#299Bruce Momjian
bruce@momjian.us
In reply to: Bruce Momjian (#297)
#300Richard Huxton
dev@archonet.com
In reply to: Bruce Momjian (#295)
#301Tom Lane
tgl@sss.pgh.pa.us
In reply to: Bruce Momjian (#298)
#302Bruce Momjian
bruce@momjian.us
In reply to: Tom Lane (#301)
#303Tom Lane
tgl@sss.pgh.pa.us
In reply to: Richard Huxton (#300)
#304Tom Lane
tgl@sss.pgh.pa.us
In reply to: Bruce Momjian (#302)
#305Bruce Momjian
bruce@momjian.us
In reply to: Tom Lane (#301)
#306Jim Nasby
Jim.Nasby@BlueTreble.com
In reply to: Bruce Momjian (#295)
#307Tom Lane
tgl@sss.pgh.pa.us
In reply to: Bruce Momjian (#305)
#308Bruce Momjian
bruce@momjian.us
In reply to: Tom Lane (#307)
#309Robert Haas
robertmhaas@gmail.com
In reply to: Bruce Momjian (#297)
#310Bruce Momjian
bruce@momjian.us
In reply to: Robert Haas (#309)
#311Robert Haas
robertmhaas@gmail.com
In reply to: Bruce Momjian (#310)
#312Bruce Momjian
bruce@momjian.us
In reply to: Robert Haas (#311)
#313Greg Smith
gsmith@gregsmith.com
In reply to: Robert Haas (#311)
#314Robert Haas
robertmhaas@gmail.com
In reply to: Bruce Momjian (#312)
#315Robert Haas
robertmhaas@gmail.com
In reply to: Greg Smith (#313)
#316Aidan Van Dyk
aidan@highrise.ca
In reply to: Bruce Momjian (#308)
#317Bruce Momjian
bruce@momjian.us
In reply to: Robert Haas (#314)
#318David Fetter
david@fetter.org
In reply to: Bruce Momjian (#312)
#319Dimitri Fontaine
dimitri@2ndQuadrant.fr
In reply to: Bruce Momjian (#312)
#320Bruce Momjian
bruce@momjian.us
In reply to: Dimitri Fontaine (#319)
#321Bruce Momjian
bruce@momjian.us
In reply to: David Fetter (#318)
#322Dimitri Fontaine
dimitri@2ndQuadrant.fr
In reply to: Bruce Momjian (#320)
#323Robert Haas
robertmhaas@gmail.com
In reply to: Bruce Momjian (#317)
#324Simon Riggs
simon@2ndQuadrant.com
In reply to: Robert Haas (#323)
#325Robert Haas
robertmhaas@gmail.com
In reply to: Simon Riggs (#324)
#326Greg Smith
gsmith@gregsmith.com
In reply to: Robert Haas (#323)
#327Robert Haas
robertmhaas@gmail.com
In reply to: Greg Smith (#326)
#328Peter Eisentraut
peter_e@gmx.net
In reply to: Bruce Momjian (#282)
#329Peter Eisentraut
peter_e@gmx.net
In reply to: Tom Lane (#301)
#330Greg Smith
gsmith@gregsmith.com
In reply to: Robert Haas (#327)
#331Robert Haas
robertmhaas@gmail.com
In reply to: Greg Smith (#330)
#332Greg Smith
gsmith@gregsmith.com
In reply to: Robert Haas (#331)
#333Robert Haas
robertmhaas@gmail.com
In reply to: Greg Smith (#332)
#334Bruce Momjian
bruce@momjian.us
In reply to: Robert Haas (#327)
#335Tom Lane
tgl@sss.pgh.pa.us
In reply to: Bruce Momjian (#334)
#336Robert Haas
robertmhaas@gmail.com
In reply to: Tom Lane (#335)
#337Jonah H. Harris
jonah.harris@gmail.com
In reply to: Joshua D. Drake (#274)
#338Jim Nasby
Jim.Nasby@BlueTreble.com
In reply to: Jonah H. Harris (#337)
#339Simon Riggs
simon@2ndQuadrant.com
In reply to: Jim Nasby (#338)
In reply to: Kevin Grittner (#281)
#341Bruce Momjian
bruce@momjian.us
In reply to: Simon Riggs (#339)
#342Bruce Momjian
bruce@momjian.us
In reply to: Jim Nasby (#338)
#343Simon Riggs
simon@2ndQuadrant.com
In reply to: Bruce Momjian (#342)
#344Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Bruce Momjian (#342)
#345Bruce Momjian
bruce@momjian.us
In reply to: Simon Riggs (#343)
#346Simon Riggs
simon@2ndQuadrant.com
In reply to: Bruce Momjian (#345)
#347Simon Riggs
simon@2ndQuadrant.com
In reply to: Alvaro Herrera (#344)
#348Heikki Linnakangas
heikki.linnakangas@enterprisedb.com
In reply to: Simon Riggs (#347)
#349Bruce Momjian
bruce@momjian.us
In reply to: Simon Riggs (#346)
#350Bruce Momjian
bruce@momjian.us
In reply to: Bruce Momjian (#349)
#351Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Bruce Momjian (#350)
#352Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Heikki Linnakangas (#348)
#353Robert Haas
robertmhaas@gmail.com
In reply to: Alvaro Herrera (#352)
#354Tom Lane
tgl@sss.pgh.pa.us
In reply to: Simon Riggs (#343)
#355Tom Lane
tgl@sss.pgh.pa.us
In reply to: Bruce Momjian (#350)
#356Simon Riggs
simon@2ndQuadrant.com
In reply to: Tom Lane (#354)
#357Tom Lane
tgl@sss.pgh.pa.us
In reply to: Robert Haas (#353)
#358Simon Riggs
simon@2ndQuadrant.com
In reply to: Bruce Momjian (#349)
#359Bruce Momjian
bruce@momjian.us
In reply to: Robert Haas (#353)
#360Robert Haas
robertmhaas@gmail.com
In reply to: Bruce Momjian (#359)
#361Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Massa, Harald Armin (#340)
#362Bruce Momjian
bruce@momjian.us
In reply to: Robert Haas (#360)
#363Chuck McDevitt
cmcdevitt@greenplum.com
In reply to: Bruce Momjian (#362)
#364Simon Riggs
simon@2ndQuadrant.com
In reply to: Chuck McDevitt (#363)
In reply to: Alvaro Herrera (#361)
#366Bruce Momjian
bruce@momjian.us
In reply to: Tom Lane (#355)
#367Bruce Momjian
bruce@momjian.us
In reply to: Chuck McDevitt (#363)