diff options
author | Heikki Linnakangas | 2011-06-10 20:15:05 +0000 |
---|---|---|
committer | Heikki Linnakangas | 2011-06-10 20:41:10 +0000 |
commit | cb2d158c5808c72cbd12cbffe0b7f5dbe830760b (patch) | |
tree | 2528c1607ed60d1641d4d681686e352febed2bc3 /src/include | |
parent | d69149ed71cc4f073f222f11f702a20a6d279e0c (diff) |
Fix locking while setting flags in MySerializableXact.
Even if a flag is modified only by the backend owning the transaction, it's
not safe to modify it without a lock. Another backend might be setting or
clearing a different flag in the flags field concurrently, and that
operation might be lost because setting or clearing a bit in a word is not
atomic.
Make did-write flag a simple backend-private boolean variable, because it
was only set or tested in the owning backend (except when committing a
prepared transaction, but it's not worthwhile to optimize for the case of a
read-only prepared transaction). This also eliminates the need to add
locking where that flag is set.
Also, set the did-write flag when doing DDL operations like DROP TABLE or
TRUNCATE -- that was missed earlier.
Diffstat (limited to 'src/include')
-rw-r--r-- | src/include/storage/predicate_internals.h | 15 |
1 files changed, 7 insertions, 8 deletions
diff --git a/src/include/storage/predicate_internals.h b/src/include/storage/predicate_internals.h index e73159554b..da6e641f4e 100644 --- a/src/include/storage/predicate_internals.h +++ b/src/include/storage/predicate_internals.h @@ -99,14 +99,13 @@ typedef struct SERIALIZABLEXACT */ #define SXACT_FLAG_CONFLICT_OUT 0x00000004 #define SXACT_FLAG_READ_ONLY 0x00000008 -#define SXACT_FLAG_DID_WRITE 0x00000010 -#define SXACT_FLAG_MARKED_FOR_DEATH 0x00000020 -#define SXACT_FLAG_DEFERRABLE_WAITING 0x00000040 -#define SXACT_FLAG_RO_SAFE 0x00000080 -#define SXACT_FLAG_RO_UNSAFE 0x00000100 -#define SXACT_FLAG_SUMMARY_CONFLICT_IN 0x00000200 -#define SXACT_FLAG_SUMMARY_CONFLICT_OUT 0x00000400 -#define SXACT_FLAG_PREPARED 0x00000800 +#define SXACT_FLAG_MARKED_FOR_DEATH 0x00000010 +#define SXACT_FLAG_DEFERRABLE_WAITING 0x00000020 +#define SXACT_FLAG_RO_SAFE 0x00000040 +#define SXACT_FLAG_RO_UNSAFE 0x00000080 +#define SXACT_FLAG_SUMMARY_CONFLICT_IN 0x00000100 +#define SXACT_FLAG_SUMMARY_CONFLICT_OUT 0x00000200 +#define SXACT_FLAG_PREPARED 0x00000400 /* * The following types are used to provide an ad hoc list for holding |