Ideas for improving Concurrency Tests

Поиск
Список
Период
Сортировка
От Amit Kapila
Тема Ideas for improving Concurrency Tests
Дата
Msg-id 004201ce29f3$e36b12c0$aa413840$@kapila@huawei.com
обсуждение исходный текст
Список pgsql-hackers

Ideas for improving Concurrency testing                              

1. Synchronization points in server code - To have better control for concurrency testing, define synchronization points in server code which can be used as follows:
                                   
                                    heap_truncate(..)
                                    {
                                        ....
                                   
                                    SYNC_POINT(procid,'before_heap_open')
                                    rel = heap_open(rid, AccessExclusiveLock);
                                    relations = lappend(relations, rel);
                                    }
                               
                                    exec_simple_query(..)
                                    {
                                        ...                                    
                                            finish_xact_command();
                                            SYNC_POINT(procid,'finish_xact_command')

                                        /*
                                         * If there were no parsetrees, return EmptyQueryResponse message.
                                         */
                                         if (!parsetree_list)
                                            NullCommand(dest);
                                         ...
                                     }  
                                         

                                   
                                    When code reaches at sync point it can either emit a signal
                                    or wait for a signal
                                   
                                    Signal
                                    A value of a shared memory variable that will be interpretted by different
                                    SYNC POINTS based on it's value.
                                   
                                    Emit a signal
                                    Assign the value (the signal) to the shared memory variable ("set a flag") and
                                    broadcast a global condition to wake those waiting for a signal.
                                   
                                    Wait for a signal
                                    Loop over waiting for the global condition until the global value matches
                                    the wait-for signal

                       To activate Synchronization points appropriate actions can be set.
                       For Example,
                            SET SYNC_POINT = 'before_heap_open WAIT_FOR commit';
                            SET SYNC_POINT = 'after_finish_xact_command SIGNAL commit';
                           
                       This above commands can activate the synchronization points named 'before_heap_open'
                       and 'after_finish_xact_command'.
                       
                       
                       session "s1"
                       step s11  {SET SYNC_POINT = 'before_heap_open WAIT_FOR commit';}
                       step s12  {Truncate tbl;}
                       session "s2"
                       step s21  {SET SYNC_POINT = 'after_finish_xact_command SIGNAL commit';}
                       step s22  {Insert into tbl values(1);}
                       
                       The first activation requests the synchronization point to wait for
                       another backend to emit the signal 'commit', and second activation requests
                       the synchronization point to emit the signal 'commit', when the process's execution runs through
                       the synchronization point.
                       
                       Above defined test will allow Truncate table to wait for Insert to finish

2. Enhance Isolation Framework - Currently, at most one step can be waiting at a time. Enhance Concurrency test framework (isolation tester) to make multiple sessions wait and then allow to release it serially.

                                                  This might help in generating complex dead lock scenario's.

 

 

Above ideas could be useful to improve concurrency testing and can also be helpful to generate test cases for some of the complicated bugs for which there is no direct test.

This work is not a patch for 9.3, I just wanted an initial feedback.

 

Feedback/Suggestions?

 

 

Reference : http://dev.mysql.com/doc/internals/en/debug-sync-facility.html

 

 

With Regards,

Amit Kapila.

В списке pgsql-hackers по дате отправления: