Обсуждение: Fixed "Slony" related issues

Поиск
Список
Период
Сортировка

Fixed "Slony" related issues

От
Akshay Joshi
Дата:
Hi Dave 

While testing pgAdmin with "Slony" I have found couple of following issues
  1. Found crash (segmentation fault) when create a new schema using slony replication cluster. Crash is reproducible when user opens the "New Schema..." dialog and select an slony cluster from "Use Slony" combo box and click "OK".
  2. DDL Statements like ( "CREATE SCHEMA" , "ALTER TABLE" ..)  didn't work if user select an slony cluster from "Use Slony" combo box and click "OK".
I have analyze and fixed both the issues. Below is my analysis and solution

Analysis for 1: - We have used wxComboBox for "Use Slony" option in the dlgProperty dialog. To add an item into the combo box we have used "Append" method of wxControlWithItems (wxComboBox is derived from wxControlWithItems). 

According to the documentation of "wxControlWithItems" it is mention that in the same control all items must have client data of the same type (typed or untyped), if any. This type is determined by the first call to Append (the version with client data pointer) or SetClientData. Attached is the screenshot.

In pgAdmin we have appended the wxEmptyString without any client data first in the "Use Slony" combo box and then the slony cluster with client data. So when the first append call gets executed, type of the client data is determined as "Void *"  

Solution for 1:- There are two ways to solve this issue. 
  • Create a dummy object of client data(replClientData in our case) and passed it when we append the wxEmptyString".
  • Typecast the "replClientData" to (void *) while appending the slony cluster.
I have fixed it using the second option. 

Analysis for 2:- After fixing the above crash when we try to create the new schema or add any new column to the existing table it neither applied to the Master nor on Slave. As per the pgAdmin code if we select a slony cluster then following two statements runs:

SELECT _slonycluster.ddlscript_prepare(1, 0);
SELECT _slonycluster.ddlscript_complete(1, 'ALTER TABLE "Test" ADD COLUMN isSlony boolean; ', 0);

Where "p_only_on_node" parameter is set to 0. It is hard coded. Then I have googled and found some example where this parameter is set to -1. 

I have analyze the code of "Slony 2.1.3 (slonik.c file) " and found that it executes the following statement in sequence 
SELECT _slonycluster.ddlscript_prepare(1, -1);
ALTER TABLE "Test" ADD COLUMN isSlony boolean;
SELECT _slonycluster.ddlscript_complete(1, 'ALTER TABLE "Test" ADD COLUMN isSlony boolean; ', -1); 

Comparing it with pgAdmin code we execute only two statements(ddlscript_prepare and ddlscript_complete) which is being used for replication only, but there is no logic to execute the statement on Master itself. May be my understanding here is wrong, please correct me.       

 
Solution for 2:- To solve the above issue, First I have set the value of "p_only_on_node" to -1 instead of 0 and then added the SQL which is going to be executed on Master.

Attached is the patch file. Please review it and if it looks good to you then can you please commit it.

--
Akshay Joshi
Senior Software Engineer 
EnterpriseDB Corporation
The Enterprise PostgreSQL Company
Phone: +91 20-3058-9522
Mobile: +91 976-788-8246
Вложения

Re: Fixed "Slony" related issues

От
Dave Page
Дата:
Hi

On Mon, Aug 5, 2013 at 1:21 PM, Akshay Joshi
<akshay.joshi@enterprisedb.com> wrote:
> Hi Dave
>
> While testing pgAdmin with "Slony" I have found couple of following issues
>
> Found crash (segmentation fault) when create a new schema using slony
> replication cluster. Crash is reproducible when user opens the "New
> Schema..." dialog and select an slony cluster from "Use Slony" combo box and
> click "OK".
> DDL Statements like ( "CREATE SCHEMA" , "ALTER TABLE" ..)  didn't work if
> user select an slony cluster from "Use Slony" combo box and click "OK".
>
> I have analyze and fixed both the issues. Below is my analysis and solution
>
> Analysis for 1: - We have used wxComboBox for "Use Slony" option in the
> dlgProperty dialog. To add an item into the combo box we have used "Append"
> method of wxControlWithItems (wxComboBox is derived from
> wxControlWithItems).
>
> According to the documentation of "wxControlWithItems" it is mention that in
> the same control all items must have client data of the same type (typed or
> untyped), if any. This type is determined by the first call to Append (the
> version with client data pointer) or SetClientData. Attached is the
> screenshot.
>
> In pgAdmin we have appended the wxEmptyString without any client data first
> in the "Use Slony" combo box and then the slony cluster with client data. So
> when the first append call gets executed, type of the client data is
> determined as "Void *"
>
> Solution for 1:- There are two ways to solve this issue.
>
> Create a dummy object of client data(replClientData in our case) and passed
> it when we append the wxEmptyString".
> Typecast the "replClientData" to (void *) while appending the slony cluster.
>
> I have fixed it using the second option.

OK.

> Analysis for 2:- After fixing the above crash when we try to create the new
> schema or add any new column to the existing table it neither applied to the
> Master nor on Slave. As per the pgAdmin code if we select a slony cluster
> then following two statements runs:
>
> SELECT _slonycluster.ddlscript_prepare(1, 0);
> SELECT _slonycluster.ddlscript_complete(1, 'ALTER TABLE "Test" ADD COLUMN
> isSlony boolean; ', 0);
>
> Where "p_only_on_node" parameter is set to 0. It is hard coded. Then I have
> googled and found some example where this parameter is set to -1.
>
> I have analyze the code of "Slony 2.1.3 (slonik.c file) " and found that it
> executes the following statement in sequence
> SELECT _slonycluster.ddlscript_prepare(1, -1);
> ALTER TABLE "Test" ADD COLUMN isSlony boolean;
> SELECT _slonycluster.ddlscript_complete(1, 'ALTER TABLE "Test" ADD COLUMN
> isSlony boolean; ', -1);
>
> Comparing it with pgAdmin code we execute only two
> statements(ddlscript_prepare and ddlscript_complete) which is being used for
> replication only, but there is no logic to execute the statement on Master
> itself. May be my understanding here is wrong, please correct me.
>
>
> Solution for 2:- To solve the above issue, First I have set the value of
> "p_only_on_node" to -1 instead of 0 and then added the SQL which is going to
> be executed on Master.

Did you check that the modified version of the SQL is appropriate for
all versions of Slony? We currently support back to 1.2 iirc.

Thanks.

--
Dave Page
Blog: http://pgsnake.blogspot.com
Twitter: @pgsnake

EnterpriseDB UK: http://www.enterprisedb.com
The Enterprise PostgreSQL Company


Re: Fixed "Slony" related issues

От
Akshay Joshi
Дата:



On Mon, Aug 5, 2013 at 6:52 PM, Dave Page <dpage@pgadmin.org> wrote:
Hi

On Mon, Aug 5, 2013 at 1:21 PM, Akshay Joshi
<akshay.joshi@enterprisedb.com> wrote:
> Hi Dave
>
> While testing pgAdmin with "Slony" I have found couple of following issues
>
> Found crash (segmentation fault) when create a new schema using slony
> replication cluster. Crash is reproducible when user opens the "New
> Schema..." dialog and select an slony cluster from "Use Slony" combo box and
> click "OK".
> DDL Statements like ( "CREATE SCHEMA" , "ALTER TABLE" ..)  didn't work if
> user select an slony cluster from "Use Slony" combo box and click "OK".
>
> I have analyze and fixed both the issues. Below is my analysis and solution
>
> Analysis for 1: - We have used wxComboBox for "Use Slony" option in the
> dlgProperty dialog. To add an item into the combo box we have used "Append"
> method of wxControlWithItems (wxComboBox is derived from
> wxControlWithItems).
>
> According to the documentation of "wxControlWithItems" it is mention that in
> the same control all items must have client data of the same type (typed or
> untyped), if any. This type is determined by the first call to Append (the
> version with client data pointer) or SetClientData. Attached is the
> screenshot.
>
> In pgAdmin we have appended the wxEmptyString without any client data first
> in the "Use Slony" combo box and then the slony cluster with client data. So
> when the first append call gets executed, type of the client data is
> determined as "Void *"
>
> Solution for 1:- There are two ways to solve this issue.
>
> Create a dummy object of client data(replClientData in our case) and passed
> it when we append the wxEmptyString".
> Typecast the "replClientData" to (void *) while appending the slony cluster.
>
> I have fixed it using the second option.

OK.

> Analysis for 2:- After fixing the above crash when we try to create the new
> schema or add any new column to the existing table it neither applied to the
> Master nor on Slave. As per the pgAdmin code if we select a slony cluster
> then following two statements runs:
>
> SELECT _slonycluster.ddlscript_prepare(1, 0);
> SELECT _slonycluster.ddlscript_complete(1, 'ALTER TABLE "Test" ADD COLUMN
> isSlony boolean; ', 0);
>
> Where "p_only_on_node" parameter is set to 0. It is hard coded. Then I have
> googled and found some example where this parameter is set to -1.
>
> I have analyze the code of "Slony 2.1.3 (slonik.c file) " and found that it
> executes the following statement in sequence
> SELECT _slonycluster.ddlscript_prepare(1, -1);
> ALTER TABLE "Test" ADD COLUMN isSlony boolean;
> SELECT _slonycluster.ddlscript_complete(1, 'ALTER TABLE "Test" ADD COLUMN
> isSlony boolean; ', -1);
>
> Comparing it with pgAdmin code we execute only two
> statements(ddlscript_prepare and ddlscript_complete) which is being used for
> replication only, but there is no logic to execute the statement on Master
> itself. May be my understanding here is wrong, please correct me.
>
>
> Solution for 2:- To solve the above issue, First I have set the value of
> "p_only_on_node" to -1 instead of 0 and then added the SQL which is going to
> be executed on Master.

Did you check that the modified version of the SQL is appropriate for
all versions of Slony? We currently support back to 1.2 iirc.

   I have tested my logic with Slony v2.1.3 and v2.0.7. For v1.2 I have taken the source code and compare the slonik.c file with the v2.1.3 and it seems to be working on that as well.  

Thanks.

--
Dave Page
Blog: http://pgsnake.blogspot.com
Twitter: @pgsnake

EnterpriseDB UK: http://www.enterprisedb.com
The Enterprise PostgreSQL Company



--
Akshay Joshi
Senior Software Engineer 
EnterpriseDB Corporation
The Enterprise PostgreSQL Company
Phone: +91 20-3058-9522
Mobile: +91 976-788-8246

Re: Fixed "Slony" related issues

От
Dave Page
Дата:
Thanks - patch applied.

On Tue, Aug 6, 2013 at 10:54 AM, Akshay Joshi
<akshay.joshi@enterprisedb.com> wrote:
>
>
>
> On Mon, Aug 5, 2013 at 6:52 PM, Dave Page <dpage@pgadmin.org> wrote:
>>
>> Hi
>>
>> On Mon, Aug 5, 2013 at 1:21 PM, Akshay Joshi
>> <akshay.joshi@enterprisedb.com> wrote:
>> > Hi Dave
>> >
>> > While testing pgAdmin with "Slony" I have found couple of following
>> > issues
>> >
>> > Found crash (segmentation fault) when create a new schema using slony
>> > replication cluster. Crash is reproducible when user opens the "New
>> > Schema..." dialog and select an slony cluster from "Use Slony" combo box
>> > and
>> > click "OK".
>> > DDL Statements like ( "CREATE SCHEMA" , "ALTER TABLE" ..)  didn't work
>> > if
>> > user select an slony cluster from "Use Slony" combo box and click "OK".
>> >
>> > I have analyze and fixed both the issues. Below is my analysis and
>> > solution
>> >
>> > Analysis for 1: - We have used wxComboBox for "Use Slony" option in the
>> > dlgProperty dialog. To add an item into the combo box we have used
>> > "Append"
>> > method of wxControlWithItems (wxComboBox is derived from
>> > wxControlWithItems).
>> >
>> > According to the documentation of "wxControlWithItems" it is mention
>> > that in
>> > the same control all items must have client data of the same type (typed
>> > or
>> > untyped), if any. This type is determined by the first call to Append
>> > (the
>> > version with client data pointer) or SetClientData. Attached is the
>> > screenshot.
>> >
>> > In pgAdmin we have appended the wxEmptyString without any client data
>> > first
>> > in the "Use Slony" combo box and then the slony cluster with client
>> > data. So
>> > when the first append call gets executed, type of the client data is
>> > determined as "Void *"
>> >
>> > Solution for 1:- There are two ways to solve this issue.
>> >
>> > Create a dummy object of client data(replClientData in our case) and
>> > passed
>> > it when we append the wxEmptyString".
>> > Typecast the "replClientData" to (void *) while appending the slony
>> > cluster.
>> >
>> > I have fixed it using the second option.
>>
>> OK.
>>
>> > Analysis for 2:- After fixing the above crash when we try to create the
>> > new
>> > schema or add any new column to the existing table it neither applied to
>> > the
>> > Master nor on Slave. As per the pgAdmin code if we select a slony
>> > cluster
>> > then following two statements runs:
>> >
>> > SELECT _slonycluster.ddlscript_prepare(1, 0);
>> > SELECT _slonycluster.ddlscript_complete(1, 'ALTER TABLE "Test" ADD
>> > COLUMN
>> > isSlony boolean; ', 0);
>> >
>> > Where "p_only_on_node" parameter is set to 0. It is hard coded. Then I
>> > have
>> > googled and found some example where this parameter is set to -1.
>> >
>> > I have analyze the code of "Slony 2.1.3 (slonik.c file) " and found that
>> > it
>> > executes the following statement in sequence
>> > SELECT _slonycluster.ddlscript_prepare(1, -1);
>> > ALTER TABLE "Test" ADD COLUMN isSlony boolean;
>> > SELECT _slonycluster.ddlscript_complete(1, 'ALTER TABLE "Test" ADD
>> > COLUMN
>> > isSlony boolean; ', -1);
>> >
>> > Comparing it with pgAdmin code we execute only two
>> > statements(ddlscript_prepare and ddlscript_complete) which is being used
>> > for
>> > replication only, but there is no logic to execute the statement on
>> > Master
>> > itself. May be my understanding here is wrong, please correct me.
>> >
>> >
>> > Solution for 2:- To solve the above issue, First I have set the value of
>> > "p_only_on_node" to -1 instead of 0 and then added the SQL which is
>> > going to
>> > be executed on Master.
>>
>> Did you check that the modified version of the SQL is appropriate for
>> all versions of Slony? We currently support back to 1.2 iirc.
>
>
>    I have tested my logic with Slony v2.1.3 and v2.0.7. For v1.2 I have
> taken the source code and compare the slonik.c file with the v2.1.3 and it
> seems to be working on that as well.
>>
>>
>> Thanks.
>>
>> --
>> Dave Page
>> Blog: http://pgsnake.blogspot.com
>> Twitter: @pgsnake
>>
>> EnterpriseDB UK: http://www.enterprisedb.com
>> The Enterprise PostgreSQL Company
>
>
>
>
> --
> Akshay Joshi
> Senior Software Engineer
> EnterpriseDB Corporation
> The Enterprise PostgreSQL Company
> Phone: +91 20-3058-9522
> Mobile: +91 976-788-8246



--
Dave Page
Blog: http://pgsnake.blogspot.com
Twitter: @pgsnake

EnterpriseDB UK: http://www.enterprisedb.com
The Enterprise PostgreSQL Company