You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudberry.apache.org by ma...@apache.org on 2024/12/24 02:38:21 UTC
(cloudberry) 24/38: Remove palloc() call in ResWaitOnLock (#13701)
This is an automated email from the ASF dual-hosted git repository.
maxyang pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/cloudberry.git
commit 73da0f32f3860cb9ca128221761bc49929586deb
Author: dh-cloud <60...@users.noreply.github.com>
AuthorDate: Wed Jul 20 09:02:52 2022 +0800
Remove palloc() call in ResWaitOnLock (#13701)
If palloc() failed in ResWaitOnLock due to OOM, it will trigger
a PANIC "Waiting on lock already held" because partitionLock is
not released correctly.
The first attempt is to add a try/catch surrounding for this
palloc() call, and release the partitionLock before rethrowing
error. But it is not good as ResIncrementRemove is not called.
So use local char new_status[160], length 160 is enough.
----
Steps to reproduce:
Add a fault at the palloc() position:
SIMPLE_FAULT_INJECTOR("reslock_acquire_before_wait");
```sql
-- superuser:
-- test user session 1:
> SELECT pg_sleep(120);
-- test user session 2:
> SELECT version();
PANIC: Waiting on lock already held! (lwlock.c:668)
server closed the connection unexpectedly
```
---
src/backend/utils/resscheduler/resqueue.c | 14 ++++++++------
1 file changed, 8 insertions(+), 6 deletions(-)
diff --git a/src/backend/utils/resscheduler/resqueue.c b/src/backend/utils/resscheduler/resqueue.c
index fa3c985b89..7ee6afbe6f 100644
--- a/src/backend/utils/resscheduler/resqueue.c
+++ b/src/backend/utils/resscheduler/resqueue.c
@@ -1085,18 +1085,21 @@ ResWaitOnLock(LOCALLOCK *locallock, ResourceOwner owner, ResPortalIncrement *inc
{
uint32 hashcode = locallock->hashcode;
LWLockId partitionLock = LockHashPartitionLock(hashcode);
+ char new_status[160];
const char *old_status;
- char *new_status = NULL;
int len;
/* Report change to waiting status */
if (update_process_title)
{
+ /* We should avoid using palloc() here */
old_status = get_real_act_ps_display(&len);
- new_status = (char *) palloc(len + 8 + 1);
- memcpy(new_status, old_status, len);
- strcpy(new_status + len, " queuing");
- set_ps_display(new_status); /* truncate off " queuing" */
+ len = Min(len, sizeof(new_status) - 9);
+ snprintf(new_status, sizeof(new_status), "%.*s queuing",
+ len, old_status);
+ set_ps_display(new_status);
+
+ /* Truncate off " queuing" */
new_status[len] = '\0';
}
@@ -1123,7 +1126,6 @@ ResWaitOnLock(LOCALLOCK *locallock, ResourceOwner owner, ResPortalIncrement *inc
if (update_process_title)
{
set_ps_display(new_status);
- pfree(new_status);
}
return;
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@cloudberry.apache.org
For additional commands, e-mail: commits-help@cloudberry.apache.org