Re: Sync Rep v17 - Mailing list pgsql-hackers

From Simon Riggs
Subject Re: Sync Rep v17
Date
Msg-id 1298918424.12992.1715.camel@ebony
Whole thread Raw
In response to Re: Sync Rep v17  (Fujii Masao <masao.fujii@gmail.com>)
Responses Re: Sync Rep v17
List pgsql-hackers
On Thu, 2011-02-24 at 22:08 +0900, Fujii Masao wrote:
> On Tue, Feb 22, 2011 at 2:38 PM, Fujii Masao <masao.fujii@gmail.com> wrote:
> > I've read about two-tenths of the patch, so I'll submit another comments
> > about the rest later. Sorry for the slow reviewing...
> 
> Here are another comments:

Thanks for your comments
Code available at git://github.com/simon2ndQuadrant/postgres.git

> +        {"synchronous_standby_names", PGC_SIGHUP, WAL_REPLICATION,
> +            gettext_noop("List of potential standby names to synchronise with."),
> +            NULL,
> +            GUC_LIST_INPUT | GUC_IS_NAME
> 
> Why did you add GUC_IS_NAME here? I don't think that it's reasonable
> to limit the length of this parameter to 63. Because dozens of standby
> names might be specified in the parameter.

OK, misunderstanding by me causing bug. Fixed

> SyncRepQueue->qlock should be initialized by calling SpinLockInit?

Fixed

> + * Portions Copyright (c) 2010-2010, PostgreSQL Global Development Group
>
> Typo: s/2010/2011

Fixed

> sync_replication_timeout_client would mess up the "wait-forever" option.
> So, when allow_standalone_primary is disabled, ISTM that
> sync_replication_timeout_client should have no effect.

Agreed, done.

> Please check max_wal_senders before calling SyncRepWaitForLSN for
> non-replication case.

SyncRepWaitForLSN() handles this

> SyncRepRemoveFromQueue seems not to be as short-term as we can
> use the spinlock. Instead, LW lock should be used there.
> 
> +            old_status = get_ps_display(&len);
> +            new_status = (char *) palloc(len + 21 + 1);
> +            memcpy(new_status, old_status, len);
> +            strcpy(new_status + len, " waiting for sync rep");
> +            set_ps_display(new_status, false);
> +            new_status[len] = '\0'; /* truncate off " waiting" */
> 
> Updating the PS display should be skipped if update_process_title is false.

Fixed.

> +        /*
> +         * XXX extra code needed here to maintain sorted invariant.
> 
> Yeah, such a code is required. I think that we can shorten the time
> it takes to find an insert position by searching the list backwards.
> Because the given LSN is expected to be relatively new in the queue.

Sure, just skipped that because of time pressure. Will add.

> +         * Our approach should be same as racing car - slow in, fast out.
> +         */
> 
> Really? Even when removing the entry from the queue, we need
> to search the queue as well as we do in the add-entry case.
> Why don't you make walsenders remove the entry from the queue,
> instead?

This models wakeup behaviour of LWlocks

> +    long        timeout = SyncRepGetWaitTimeout();
> <snip>
> +            bool timeout = false;
> <snip>
> +            else if (timeout > 0 &&
> +                TimestampDifferenceExceeds(GetCurrentTransactionStopTimestamp(),
> +                                            now, timeout))
> +            {
> +                release = true;
> +                timeout = true;
> +            }
> 
> You seem to mix up two "timeout" variables.

Yes, good catch. Fixed.

> +            if (proc->lwWaitLink == MyProc)
> +            {
> +                /*
> +                 * Remove ourselves from middle of queue.
> +                 * No need to touch head or tail.
> +                 */
> +                proc->lwWaitLink = MyProc->lwWaitLink;
> +            }
> 
> When we find ourselves, we should break out of the loop soon,
> instead of continuing the loop to the end?

Incorporated in Yeb's patch

-- Simon Riggs           http://www.2ndQuadrant.com/books/PostgreSQL Development, 24x7 Support, Training and Services



pgsql-hackers by date:

Previous
From: Simon Riggs
Date:
Subject: Re: Sync Rep v17
Next
From: Simon Riggs
Date:
Subject: Re: Sync Rep v17