Commit df383b03 authored by Simon Riggs's avatar Simon Riggs

Partially revoke attempt to improve performance with many savepoints.

Maintain difference between subtransaction release and commit introduced
by earlier patch.
parent dde70cc3
......@@ -269,7 +269,7 @@ static TransactionId RecordTransactionAbort(bool isSubXact);
static void StartTransaction(void);
static void StartSubTransaction(void);
static void CommitSubTransaction(bool isTopLevel);
static void CommitSubTransaction(void);
static void AbortSubTransaction(void);
static void CleanupSubTransaction(void);
static void PushTransaction(void);
......@@ -2578,7 +2578,7 @@ CommitTransactionCommand(void)
case TBLOCK_SUBRELEASE:
do
{
CommitSubTransaction(false);
CommitSubTransaction();
s = CurrentTransactionState; /* changed by pop */
} while (s->blockState == TBLOCK_SUBRELEASE);
......@@ -2588,12 +2588,17 @@ CommitTransactionCommand(void)
/*
* We were issued a COMMIT, so we end the current subtransaction
* hierarchy and perform final commit.
* hierarchy and perform final commit. We do this by rolling up
* any subtransactions into their parent, which leads to O(N^2)
* operations with respect to resource owners - this isn't that
* bad until we approach a thousands of savepoints but is necessary
* for correctness should after triggers create new resource
* owners.
*/
case TBLOCK_SUBCOMMIT:
do
{
CommitSubTransaction(true);
CommitSubTransaction();
s = CurrentTransactionState; /* changed by pop */
} while (s->blockState == TBLOCK_SUBCOMMIT);
/* If we had a COMMIT command, finish off the main xact too */
......@@ -3745,7 +3750,7 @@ ReleaseCurrentSubTransaction(void)
BlockStateAsString(s->blockState));
Assert(s->state == TRANS_INPROGRESS);
MemoryContextSwitchTo(CurTransactionContext);
CommitSubTransaction(false);
CommitSubTransaction();
s = CurrentTransactionState; /* changed by pop */
Assert(s->state == TRANS_INPROGRESS);
}
......@@ -4009,13 +4014,9 @@ StartSubTransaction(void)
*
* The caller has to make sure to always reassign CurrentTransactionState
* if it has a local pointer to it after calling this function.
*
* isTopLevel means that this CommitSubTransaction() is being issued as a
* sequence of actions leading directly to a main transaction commit
* allowing some actions to be optimised.
*/
static void
CommitSubTransaction(bool isTopLevel)
CommitSubTransaction(void)
{
TransactionState s = CurrentTransactionState;
......@@ -4069,14 +4070,10 @@ CommitSubTransaction(bool isTopLevel)
/*
* Other locks should get transferred to their parent resource owner.
* Doing that is an O(N^2) operation, so if isTopLevel then we can just
* leave the lock records as they are, knowing they will all get released
* by the top level commit using ProcReleaseLocks(). We only optimize
* this for commit; aborts may need to do other cleanup.
*/
ResourceOwnerRelease(s->curTransactionOwner,
RESOURCE_RELEASE_LOCKS,
true, isTopLevel);
true, false);
ResourceOwnerRelease(s->curTransactionOwner,
RESOURCE_RELEASE_AFTER_LOCKS,
true, false);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment