summaryrefslogtreecommitdiff
path: root/src/include
diff options
context:
space:
mode:
authorHeikki Linnakangas2011-06-10 20:15:05 +0000
committerHeikki Linnakangas2011-06-10 20:41:10 +0000
commitcb2d158c5808c72cbd12cbffe0b7f5dbe830760b (patch)
tree2528c1607ed60d1641d4d681686e352febed2bc3 /src/include
parentd69149ed71cc4f073f222f11f702a20a6d279e0c (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.h15
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