SSI 2PC coverage

Started by Kevin Grittnerover 14 years ago15 messages
#1Kevin Grittner
Kevin.Grittner@wicourts.gov
2 attachment(s)

[resending after gzip of test patch]

In reviewing the recent fix to 2PC coverage in SSI, I found some
cases which didn't seem to be covered. Dan bit the bullet and came
up with an additional isolation test to rigorously cover all the
permutations, to find *all* 2PC statement orderings which weren't
working right. Because it was so big, he pared out tests which were
redundant, in that they exercised the same code paths and pointed at
the same issues. A patch to add this test is attached. Run against
HEAD it shows the errors. It's kinda big, but I think it's worth
having.

Attached is also a patch to fix those, so that all permutations
work.

I hope that this one be committed for beta3.

-Kevin

Attachments:

ssi-2pc-test.patch.gzapplication/octet-stream; name=ssi-2pc-test.patch.gzDownload
�Y-Nssi-2pc-test.patch���+�u��7�)`96D�gx���%{#hy�`,%����������;����l�
}�-4�@�2OV��B6)�N�*�y�}����_}������>|��������������/�������_?X��f���?~�<�7�O����<�~�o����O������������\�����w_�~�W?[-���������O�����_�xn�^�>��~������y;d�G��}~�zy��������//o��������r����j��[l���j���{�h������������v&����������~��o����W����_����-�f�'�����l���5������������|���w���]����_��o����/���GW�?�:��U��n�����|�������w���������/~���?����[��e�����j�����o~���5�_>}\|~l?������������i?�������q���������e�����?\n��������������������_|�����7��cw�](=������O�?{^����c��mq�O�/���.��t�f��#�_�-��qp������gxY�������A�#XQ�j��0��>���@���o�i9��6P�X L������"H�0"gfEE�����{g&aD��`E���0�$�������i�����O�ZP##1D
@@!�"4;P L�cqs�{P@���,�EaL������H���NH����b�����Q0XY>�^�
 �o�@@@b��"$@��h�5R�����@�56'�0(X�X `��A`e�cR�����)+�!A@ ����i"���rsXS��AnNfA'X�X `� ��0�#haI�HV��X�X `� P5�U�Ah#�do�Kk4�{�'���s\Z#@`��H|��]/�n$� ��@ Y>����@��S� ��@@ �]Y�+�j@�,OX���R�(/�Fn��' D�F��|��+��"�G8��{S�3|* ��@�}?�7���XxW���~@@F���o �:��"x>�����G�G���r\k4��^�X�"[#@��,o8�=��"�
�:;:���I �Q@P�+E0�Cm^�l�a?�(B,��p��j@��1EE�����5' �CM
Fw����t����j������)zz��9�"�1/u�b��"�A�A�6�a�5� xYG�|:���� ������(�(B,P�3-���5= ���=<!�F~��]�[#@�[>]�{��I8���"�y� ���"�w� ��<Q�J��"�� �S���� D9���j�wG�<�wB�7o�V�@o������9�UA��0�!�F3�@��*��,����9)�AA��kt+�v@�zL�,�OXY	����e? L��V�����hrs2�:A��k��u�@`AK�F� ���b�@��k���������to�k4�����I�X#@�����"�;
�2^��H�@@b�@�|��j*@��S� ��@@ �ZY�+�j@������������K���q�)��������<��<�����c^$w`�����nc�y>�[1/����������Ve�[~��@��m��<�&�x�1�������3��UV��1�z��������Tl{<kR�1�����I]�ywkR>b�5��1�<�6���1��n&����������������_=��6ncos����w��_?�����<�|"�]��'�9Z-+���=��<�os1��6nco��y��&c��|v�;;Q�C���3�61��q�x�D�S�1��mn���a�{$�@3R����|4o(��6�1�^{��?_?�����<�|"�#���<�����x��h�k>�oS�x�1��I�<��d��mrc���NS�<g:������K�y��x������<~>�������g�|�^b�1O/�$1��q�x�D�G�%v��g����o��EO=x�������y�M"�����y�6�1tv�����c�
��C���V)�1?2�n@�b&��J*W�����^����,�A��� ��r������nq= ��u�����)���!���A0���";dg�#ES��A!���� �������� �Y#��r�Z������<��<�����c�����<����g�O�|���A�����V�V�-�=�v���<��m��m1��1�x���7���9�i�7�os���S3��W_J���NfG-�I�0��`�-�]fm����Nf�> ��@�t���~A����"��"�EH�0��@hh���)�AY���A��O��Bxkq����[�P�"���A@!�"�E��0M�Ous�NP@��0�]0���������NI������b�����Q0XY>�^�
 �o�@@@b��"$@��h�5R�����@�56'�0(X�X `��A`e��^�MXY	����e? L��V�����hrs2�:A��k��u�@`AK�F� ���b�@��k���������to�Kk4��x������Kkl�	����+��e��dy!$�� x��6�sja!(B�+��A`eY
-��Q�dydt��E�}�$�� D�FA���@�l��E��!B�d�"9x<Ehi�H�4?+X�B�F�@�%@��k�Bs�@��J6?+�p����e�jV�`�
�,����3G����zA�,��E����o�(T��@�}?�Fn��~�� `�b��5:����@�~�� ��@@ �=�. �t������0�i�X�� `�b��5J��:�XG�����@���b�@��k��������d��-����b�@�l�"��5:��v@`?B}P�X �	��#x�u�,��%
���\�F� `�b��5J��5��(�|M
|Y��m9G01���=
�s�� �#$@��#x�!��m�@�$ `�b��5J��
��ag�pl@�Il����h�Q,�F	����Q.�,O{������6�����7�ia\�1#�^u�����o�U�����Nt����Q�=G8����y_#������N,ktE�U�sLl��������K����}@�EH���!"�h���� ������)�vAo�!n��t�2��~�@ds5�pb+���ea��j��NP@���� ��<^v��A8\�I�,|��V�@o������9�UA��0�!�F:�����,����9)�AA��kt+�v@����h���rHP��,���O�@hkjX�Q ����#�k�Q�t��= X�1�&*�X��F�@�%@�j��F7��F���7�h�7b���� ��F��g#�!E�wve����,��"��d�o;�T��?�F@@b��"$@p��lV����R�+EL�GF�E^4\}I^���\P������|�X{�����c�y�m�3�'b>bb� �ER�x�|s��x����z����y������$boc2��6�1��u�zb���R�#�W��{[�R���m�gM�4���yb�5�+1�nM�G��&U?�����<�|"�}�m��<u����w�������C���<��m��m�c��y�Nb�����<����g�O�������<G�e��������'��m.�<��m��m1O}�d�S���yg'�{�y�r&�f ��6nco��y�6&c����18<b���hFJ�x�����m�<��<����k�y����<����g�O�|������>���t�y�g}�m
co�6��6������y�Mn��;�i���L'C1�761{�5O��O���|����'b>��w�������K�:��%�$��6nco������b�^���?�V�mr���Go3�x�1��I�<u�1O�&7����Nz�R0�����]���V)�1/1�&���YR�
�|}�7�����\dI'�M> (aD�kw�GV6v��ad��U^��L�e� ��@�t��}��@�!;s)�"��l� �	��8A���� lV��Q�dydt��E�
�r>��QD�F� �,�������"�EH�=Y��uY 4�4k$Q
���Q!X�X `� `����5����U��+ ���Y�.m�?���p�q.3�a��:Ap�#�� ������~�	@���M�h!T��A��b��m�(�(B,P�n�,��~5 �X��]�����!��������<��<�����c�
�c�y�m�3�'b>bb� �����y+W���n����<��m��m1��1�x���7q������+1�K`���%����)�!�Y�����V��A��z������"�EH�����@pvFV]L���5*k�Q���F� x:#kv8#�"����-�Im�������|�t X����c>�2���gE�~�3���y��D�G��8�y�9Y1�l��|�kn����<��m��m1��1�x������k��g����o��["����[s�'&��H&p�I�9� ����o������C�`n)�t�0�I��<�?�8�1������5����o+�wOb+�x��IN|> H�j�����a����&D�G��e����AP^�a(���`c�" ��pj�� ��@@ X9���% tX���Iy	
�(X�s���cr���� ��@@ 4�wQ� L��������07rS=�� `�b��5J��:�XG�aI���V��X�X `� P5�U��A��u*������:?/�G�Bdk��9�G�����"�EH�}��#d��;�k4�b�Ny�Q!X�X `� `����5���i�F@��v� �}m�&�z���!r�r��sO �#d�@�
h���Q,�F	��a{�6�,�
�X#���vx�
��5��(U#? P5����i����@����%���Q&n0��(-1�" �S1��?�yO0�<{-��<����g�O���
O�������nt2�����1��q�x����tO����J��1�<�6���1���3V������.Z�����&��6nco��y��&c��|v�;���%���;I��m��<�&��mL�<u��c���c�2���)=�4�61���y��y���������y�y�1�<�����y1O}>+���rtN�|��=��o3�x�1��I�<��d��mrc���L��|��wH���������'pz����h~>P���1��;�y�|v���%V��O�x�1��I�|�^b1O/qV�[+�6�[������y������$b������n��A�a'=~)P������@��y�.*;�C�a0&F���?��.B� ���>(B,P�njA�@�(�f��&`�$.n���Q!X�X `� `����5��������� ���Y�3N���#X8�����1)�8����Lf!�Y����nc�y>��*<Nb�bNV�;;lS>�=����<��m��m1��1�x������k��g�����M���J'o�=���B"�|@��'A���=�@:�B���z ��f�c9��+�I
c�t�m���1��7�����X���yj��b��;�v�B���IN|> H�j�����q��������\�8
.*<��l�7P���������Apt9�k��/76��5��(��k���@����&P�M7x�
��5��(U#? P5���6��A`��E�}�V�M�@��<I�GI�<�?��������g�|��a1�*�$1��q�x�D�GZ�u���f�����o��y���4����y������$b������n����w�%�9��P�o�g;D��u����m��!���� ���wHrA��Yz5����Hg9<-���<������'b�o2�1��1��_��Gj��b����r1����@�t��� X�D��.�U�m�/��?G1GC��f�F��_e�������!�*Ie/���*<�`�Q���s�(�����| P����AhVs-�:aL�>/+(�(B,P�3-
�Ada�+
@������ Q^T���OO@�l�!j�t����^iW�:'�hg�<)B��JAp��t��e���(B,(����~A�"��P�P�X �	t/�9�55 l�G����~�yq~�GsA�b�s�AS`�1/�;0�_�y�y�1�<������������o�oS��x
�o3�x�1��I�<��d��mrc~���<$����q{�����+���`Bt2{h�������N<��@����
/���}@@b�@-���A����"��"�EH��|u�'�������BK��
+vn�!Y�!�5����e; �#�>(B,P���eO �_�BsH�F���Y���5��(��X�\v7t�T�d��]��{�� uu<'����p�����~�=��#L��6l�F ��@�jt��5 �o�F@@b��"$@p��`	�#���U@�~$)[��|4(�1<�14��l(����nc�y>�[1O/\V���b`���|�4��0��6nco��y����������+��<WX��]���,����L9
!�BU>.L> �z�
���+� ��U!(B7� @�@���3���`�D�Q!X�X `� `����5���Y���YA8�mAMjS��he�,?�#��b����,�<+b�c�y�m�3�'b>Z��I�S���yg���c^s�?��0��6nco��y����������M^��<���|������N��{<1�� D2����O���{�t ��}k�@�o�(�6rsKa��1O:�6�q�������yL~n�����<5[1�x[��+�E @H�p��A�T��?{�o#|7�������g���|�<<r'�p�� ��|
�7���$����NJ*<��Q���s�Jb[z$������e�z>(B,�/�A������� ��@@ �.
B�ZlV4��<a!8#�AR�8��)�vAo�!n��m�eE0�@0C�b+B�cE0�4>7g��E�A����]�D��hh����dy|��To��-�,�����s�5���a!(Bz�f�^#U ,YY�
�YcsR���5���V���0&��hY��"��!+�~@�&���,7�55��(��d�t��5��(�3��:�6�T�dA0Qa�
��5��(U#? P5���9��O��p�<�w���N\Z#@`��H|��=��#���H�@@b�@�|��j���beY'(B,P�nW�5����6���0�$��������	�� D.���
����������(�8|������:��"��P�� x>�����w��O��G�����F�p�������7������&�m��M(�
1�b:!�nE� �R#;����ec�@@b��~�sL�P����9(�(B,P��w�9�jz@X���0�K!�F~��K3�A!~��K3���@�OE0���LL�G�	#<�~�( ��?E��ty/�� n$Y�;a��@z��Ao������9�UA��0�!�F3�@��*��,����9)�AA��kt+�v@�zL�,�OXY	����e? L��V�����hrs2�:A��k��u�@`AK�F� ���b�@��k��������p8���\F~#���y?	�kz6�R�aW�����(B,H��A��CM�sja!(BW+�V@`eY
���p1Y�y��06�<E^\��\P������|�X{�����c�y�m�3�'b>bb� �ER�x�|s��x����z����y������$boc2��6�1��u�zb���R�#�W��{[�R���m�gM�4���yb�5�+1�nM�G��&U?�����<�|"�}�m��<u����w�������C���<��m��m�c��y�Nb�����<����g�O�������<G�e��������'��m.�<��m��m1O}�d�S���yg'�{�y�r&�f ��6nco��y�6&c����18<b���hFJ�x�����m�<��<����k�y����<����g�O�|������>���t�y�g}�m
co�6��6������y�Mn��;�i���L'C1�761{�5O��O���|����'b>��w�������K�:��%�$��6nco������b�^���?�V�mr���Go3�x�1��I�<u�1O�&7����Nz�R0��������[�4�������n&jdI�*x��!���7s�%� �6����Q���AX��-����nWy��3%�5:��"��Z�9&��[Ad���u�h�`b�9 H��"$@��:����V��9e!.#KA��8��)����B�������"��u�	�E8��"��	���	@���@�t!�O�A������(�(B,P�n�,����N�V�f��_��]E�c>�
�����k�y�*����nc�y>�[1�9Y1o����b���qx�������y�M"��6&co��&�������=�W���nu|��E����5������8F��RBt2�n����BDl���� ��/����>C ��@_�� ���:�Q�P�X �	�W��~��p�BpF���xqP5�S>���B���� �;������P�|P@����P� L���g[R�=( ��?Eh����0&�EC�}�����	����[,XY!�5
+�� �kT�-(�(B,P����F�@X��|����k��9�,�aL�1���?E`e9$(BV���0M��[YnkjX�Q ����#�k�Q�f�um ,���`���5k�Q�F~@�jt#�C��{s\Z����'���s\Z#@`��H|��]/�n$� ��@ Y>����@��S� ��@@ �]Y�+�j@h)���'�#�{/��$Y�!�5����e; ��(�EP�X �	�'��@���)BsH�F���Y���5��(��X�\���(B�U��Y�V�W-{^P���m�gA��9 ��6�j�@`A�>(B,P�~�F�@�j������0r+4�#Tk��9��G��#�E�����IwA���,���`�)O��]k�Q����:B6��Gp�l�k4�(X�T���@��v'�Go�=�H�k4Bdk��9�G�����"�EH�}��#d����/QL��5*k�Q���F� �>�kj8��"M�h��9����6�i@��#D�!B���� ��m��'k�Q��m��@�
;�c*�Hb��^�F `�b��5J�@��T�rA`ey�3$�g ������v�IM3�����������}c�J|�E�t��;G� ��r�9������z@��w���wbY�(B,���`b��5D6�\\��&6��4(B��A)�;`E�,A��-D��O��Bxkq���;�Q�"��Q�� ��[L\/F�T��t��"�� �S�;�A����Cm��JM�e�����X��<BxkV��A����[,P�P�X �	�5�y^pV���de�6f��I1
�(X�sXY����mDSV�C��"$@`e��}�BsXS��AnNfA'X�X `� ����t������9�@0Qa�
��5��(U#? P5������7�h�7b���� ��F��g#�!E�wve����,��"��d�o;�T��?�F@@b��"$@p��lV����R�+EL�GF�E^4\}I^���\P������|�X{�����c�y�m�3�'b>bb� �ER�x�|s��x����z����y������$boc2��6�1��u�zb���R�#�W��{[�R���m�gM�4���yb�5�+1�nM�G��&U?�����<�|"�}�m��<u����w�������C���<��m��m�c��y�Nb�����<����g�O�������<G�e��������'��m.�<��m��m1O}�d�S���yg'�{�y�r&�f ��6nco��y�6&c����18<b���hFJ�x�����m�<��<����k�y����<����g�O�|������>���t�y�g}�m
co�6��6������y�Mn��;�i���L'C1�761{�5O��O���|����'b>��w�������K�:��%�$��6nco������b�^���?�V�mr���Go3�x�1��I�<u�1O�&7����Nz�R0�����]���V)�1/1�&���YR�
�|}�7�����\dI'�M> (aD�kw�GV6v��ad��U^��L�e� ��@�t��}��@�!;s)�"��l� �	��8A���� ��9Z�.#�{/VH��A�l�"��5:�d���V!(B����'����9�	X#�R���`�
A��k�k��Q.�]G��*���B�6����G�a�8������ ��aJ|�G���k?� xi��j4��F� xj�P��6la!(B7��@`?�Z
�\�.���V�yq~�GsA�b�s�AS`�1����1�<�6���11�u���e�����g�y�o�mbo�6��6������y�Mn���b@s�s�����%�����HLK����,T������W� xZ��KZ�A@b��"$@pS
Dy 8;#�.&ND���5��(��X�\<��5;��e���@���6Ej�V���c>R:,�q��1p��B��"V?�����<�|"��Ux��<����w��K>�57��m
co�6��6������y�Mn�{��5K����P�7�=���|������_B$�8�$���gHrA��V����pl�!G0�F:P��nc���y��������|���l�S�����'�_��\�$'>�K5L�Zb���ugd���x�2���� (���0�}�A��]FF85�BP�X �	,������:,������k��9��E0��a$+(�(B,P���]�:�D����a'�#�
��T�:B!X�X `� �����AXR52�l�k4�(X�T���@��v6w�
jdk4��������Ekt����~�� ��@@ D_G��Y �,����X�SkT�(X�X#? `�rA�qZ�8��"{_D����6�i@��#D�!B���� ��m��'k�Q��m��@�
;�c*�Hb��^�F `�b��5J�@��T�rA`ey�3$�g� �oI�uu����%JK��H��T����c��LG1�^��1�<�6���1���+�)������L��l9l~��m��<��<�=���(����~�3���y��D��i����jf�����,�<w*��y������$b������>�����z�yv�N�x�1��I�<u�1O����o��X���mF~J%M��@�G�6�bos�A����<���c�y�m�3�'b>b}�A�S����6���%�#BO�����<��m��m1��1�x���o�:S=1_e�R�%���&f/��	�^�ib>�����D�G��b?��1{�U�<����<��m��m1���A��K����J�M�=�h�mbo�6��6���nc2�����|�u�I�@
T��n���7Pbf�����Pl������ ���A����;l-��!��Z P ��Y��	X#����gkT�(X�X#? `�rAh)x��v6;#�p~V�����"���e��~�GJ��<��<�.�Y�yV���<����g�O�|�
�����������y��61��q�x�D��mL�<�&7�=m��%���e(�w�|�����[s�'&��H&p�I�9� ����o������C�`��u����'p�8�D���M�<&?7���ec�����o�N����P k.B����&=1\�rt����=W.N��
 (��
�}� �)���|]���q����� `�b��5J���G@�n�<6w��	�At��^�F `�b��5J�@��T�rA��M`v�&`�}E��e=,"O�Q���1��O�|$��(�1��1ki�D��
<I��m��<�&��|�<k�Y1�9����b^��/
h�mbo�6��6���nc2��������f�y�w0����Q�|�+y�t`�@�b��?B$����\��j��^M� 8;�YO�a�1O:�6�q�������yL~n���W�������wv��\�s�s8<�<)<1����6�g����bN�����|G�����Vu���1�W%��E�t�0U���0"�u�}� ����0��7l\�e>��_E�� 4�I|c�0&A��a!(B�)��Ara�+@8e!8#�AR�8��)�vAo�!n�tyrA0��~�@��c�"( �V�C���i"|�sEu��"�� �S�)O
� ��p��@X��A�<�wB�7o�V�@o������9�UA��0�!�F3�@��*��,����9)�AA��kt+�v@��@�h���rHP��,���)�@hkjX�Q ����#�k�Q�t��= ,���`���5k�Q�F~@�jt#���9.���]����y�����?��aW�����(B,H��A��Cm6���(�(B,P�nW�5����Z
�w�O�GF��;`I��A�l�"��5:�d�"��p!(B����'Dr�x�����D)h~V�F� `�b��5J��5��(���#
�P}�l~V����U����d�b�YP+�g�,������3XP��!���Q<�����~; ��
���A��kt��������A@b��"$@p{�]@8�.��#�a����FA��k��u? ���
���\� [a�
��5��(U#? P5������[,D�3Re�
��Ekt����~�� ��@@ D_G��Y x?�K��`�
A��k�k��Q.�����B�=�(r�`b��
{"�A GH�=G�9B6�a��6�I@��k�!z�'h������5��(i���X�X `� P5�U�\XY����Y�-Ow������(�M������A G8��VM@������"�EH���j��_+J@0ru�{d�'H��A��kt����a��h�`��(@�EH����ty/���\���R�(X��#��u�l,�Y�,O�(X�T���@��v]U3����P���("X�s��`�#�E���!�:�'XG����Q*@pu �h�Q,�F	�F~@���`��/+ p��E]US=m���9G�9B��9�'��A�
��aO�(X����=�@vV���3]T�
A��k���������2WGE�Y�^��"G�f�5��<
.r@P6��� ���!G+��A`ey�F�@�%@p���,���le�f����5��(U#? P5������ ��l�]E��q5m�C���Jdb� 6eW�88��r@P9�9�E��\!(B�	�F�P�Fy tX���Iy	
�(X�s��P� L��.�"�A@b��"$@���\������NXG����u�B�F�@�%@`��#d�0��e@�|o,U�B�F�@�%@�j��F��p�������3�#�!�5����#����A@b��"$@����	��@8^��5��n���Q!X�X `� `����5�a�����_A��"��ML��aOB�!"�	���@ G��6l ��=	X�X `� Do��m�Y L~u�U�taP5*k�Q�F~@�j�+���!1?+���
�'wWG����(X`Wf��w����������
��b����c�y�m�3�'b�M�'V�S���y_7:��y�r�������y��y�{���Q�s%S��g�w�����w��+�����yg-Y�y�TR�x�1��I�<�y�1O}>;�m������$��6nco��y�6&c����1����+�y����CIo3���M������|��y�1O�|��g�w������X�w����b�
�'G�D�����So��61��q�x�D��mL�<�&7����TO�W�{�h������K�y��x������<~>�������g�|�^b�1O/�$1��q�x�D�G�%v��g����o��EO=x�������y�M"�����y�6�1tv���1���_}�
�������s=�Apa�a48�s<�"�[���"�EH�����@h)xu��U�a8?+X�B�F�@�%@��k�Bs�@(aD��
 ��pr7P���9������H�@������|�e21��X��g�w������V�q�s�b��a��1�a�#�f ��6nco��y����������M^��<����n���V:yk��������?	B4����\�����5� �x�2Z�m$��1O:�6�q�������yL~n�����<5[1���V;�y�@�\�$'>�K5L�zb�����vE�u{�\�@P6�(�tApS�jA� 8���5���A��k���5�����y l�\m����
�`�@��k��������i��� �M�"�>�X+�&z XD�$���c����H��Q�c��c>�����gx������y�M"�#-�:�y�v�b~s��������m_����<��m��m1O��d�S���yO�;���`(�7������W���6�������H��;�� �����FApv�����Hb�t�m���1��7�����V��p�#5S1��Hg���H�p x:�yR,x"b���m���]�+��M���(��e���e@�e�s�vH_y2o���_�!���@�wG�.V���a�/'�%(X�X `��A8���A�tI$�"�A@b��"$@Px
 �^ ps4�;;9`an��z�
A��k��u? ���
���!s���Q!X�X `� P5�U��A�t+�����{��P���("X�s��`�#�E���!�:�'XG�aO�H��y~V�F� `�b��5J��5��(������-�p��,z�`b��
{"�A GH�=G�9B6�a��6�I@��k�!z�'h������5���
�`�@��k����������������� ��\��"G�f�5��<
.r@P6��� ���!G+��A`ey�F�@�%@p���,���le�f����5��(U#? P5������ ��l�-ZW��Et&b
����I@��#+�3��/GV�'A��2 ��<X�X `� �[Y��/+���,���:U�B�F�@�%@�j��F� �\Y�
+�Ah��)����8����%�������y�"�#9G1�����XK�&b�U�Ibo�6��6������(�Y������{��mz1?�k�Go3�x�1��I�<u�1O�&7���TO���#B)���n�r?/1y{�m�������H��;�� �����FA8.u�#d�����t` �I��<�?�8�1�����`5����o+���j'1/���@������t���_Q�/5_<&���^���w�Ux�-�� �,��vEA��o7l���Q,�F	l������`�H�IA0s�'U�B�F�@�%@�j��F� ��&��	�����Z|������_>}��7�|�����S�a;�����OoT|X��f���?~x�o�?�?������v�������������������_������������Gi���s;��'�Y�����b����L[X�4j�lQ������'��^����������?�?��!c�����c^�o�q�g�n�[���3K�%I���|�yb��|Wo����o�jL	��U�=����/�kO}�U���z3�U&	����/�V����o�2)�z�wO�]��Ub�JW���<�/�+[��m�w�]���Y��1%��V���/����=�mV��������2I����E}��2��o|K�_o�j9�@��k��}��+;y��i���[�\mv��6����!�:}��@���9��(z�(:��E�:�����7��t��%}dA�5��f��	�����t�{��Ms
��6��(:��E�:�n���f�
:@o=3Xwy��j*�����t�;���^t��}[b:�z�������4t�;���^t������
s�����{��K�^#>8���V}��4���	_l�8��o��_��C}���_����z>��!��
g��J����y,��	_���n���Wu�jx�P��fyB0���|2%`����<�/�+;��w��G��5.�E}�������"|Q_q|}�?=7�:��N�/����=��|��C|9��M����/�q�T_�;��W��5��
�=k��<��|��0����<��E���[p�VO�����)�����>|��/������i��e�>�;
��/�������i��5�]���/��.6��S_[�m���<��$�_��m��/�\�����b���������O������u��I�u_�w"|gP_���/�+���m��e���_�|Q_{�;_���E��
+�;_��������Lm��_�6��)����Q%fJ�t5
���3�R��e�����_�yF}���_�����wL;��E�����w�c��7��o|g:�|���1��]�w-P������f��/�>�E�������������Y??/>~Y/^O���^�^��f�Yn#�yh�����6n��2�����zx�
�z@��W�>jS�kk��2����@G�]
�(z���t�����%�/�#�����4�uO��ut5�c�+�No�S�
�����@G�]
�(z��wt�6��o�zs������nWSYGwf���c�]
�X�:����s������T�m��o�^t�;���^t������
s���;=Q��u�Q!��!���C�Z��f����LM�r��;
��/��������-���V8SWT
����c_����u�u��f�T���|7�}�����^E�lOSBP|1��K���y��K����s_����/���J��/�+��teP}�C��yv���)��<�������<�������lE}�����3|��0������6��ZQ�i�c�b�$A������R|�}+���m�7���}Q�z�������O}}U���J�jx�P�����5�[!<�0�	|1��K���y�w��s|� �M����/� �T_W�1���kX�u���ncE��UJ�}M�g�7��V|1�u�e�|u�C�n���������key
�\_�3�V��\_*��;j�5^��;Bi��A��-Fa����y_k��������5l�Q�z�����!������/�}
���c������X��1|1��[_�s|1��{�i0�V���1���1���;g6*AM��x����%�_6Z�}����/��/��[�SBP|1����A���
����A��7a�g�WQk&�g�y�]�E}����T_*��{�i�<[Q_��<�K��C|[j_e����rjD�
S����;;��V�Ww���%��we��:����=Q�p��F���/����=�5qT�N���V���Qu��_�����}��c�jx�P���
������U�=M	A��<�/�+K����2����s_����/���J��/�+��teP}�����xG`����y_{�"�g+�,����b���������:����3�����������z���i���9r_�
�/��8����u�/Q�i�E}�����36M��V�X����36M�o(|Q�:�����Z�e������Ub�JW���<�/�+[�yw���kh���U��Q�=����/�kO}7�����%�7�/����E}���,�|�w:�k�|W�]�������������o���~z��������i�����_����������������Yo����m�h��������L<y`����f��1�@�����1�L'(z=�Qt@W:�^tz�]wo���D	�K��*�>k 3�`��c�]
�X�
����t�m0(z=�Qt@W:�^t��]��6�t��zf������T���Y�#�Xw@W:�������6�t��%Uw���[������j@�����;��6��}���o�NO�pi���{{��1�GT`��������&|������sn|�B��_�|Q_{������j+��+*S_�����&|Q�:���_�y��IB�-���3���K�3W�=M	A��<�/�+K�y�/�+S��}Q�z�����"+���������A�m�/��}���6����g���/����g�=���g#���u|�;
�14~v|w�����s���z,^��#(�>s_�U�/�o|]�m�����/�[_�|]������3�j�S
OJ��}[���VO��s_�3�R��f�}���_.�A}�����-�&���}�����x�:��8��>3�!��z�b���2���:������!V7I������1���<�y��/�|+��y��/�g��5�����4M�,L1�0����<�����h��~_S�6��o=|Q_���OT_�}�������1�F�UwP,����g���/����g���v�����v���v��6����}U���4ir�z����/-��|�}��
�F��
������)!(��g�e��A���A�e��I|���0������	�\_�3�zP���K�|�����t]E���+'���>�7l�8V�����i~�;#��V�Ww���%��we��:����1Q�p��F���/����=�5qT�N���V���Qu��_�����}��c�jx����)���5�����yN��<�/�+[����+���-Gm��	|Q_�E}��������/-��o_�|+�����W�i�����x
���O��te&O?�4�_>}|���������?��M�~~^|��^�<.���?�>=���z���Fn��F���m�te���]��6����!�:}��@���Ye:A�������Q�:���
��{�
O'J@_�GV�Y�i����j@��W��4��n�A�������Q�:�����m�a�����3�u���������A������u@g����!�=�/�����"���Xw@W:���T�]�6���%��D	7��FLpD��B���n9�j��-���05��z��4�������S_o'�8�W[�L]Q)��z;�|�������Uw���S
O
�m���)]�P�UT��4%�����,�����L�k8�E}��������4��R�_JW��9���g����2l�s=|1��[_�s|1��{�i0�V����0�:�w�i����l�������=/�L_?�/�*�������6|�kx����/��.�J���W�|����'	%����Y���)���������g7+;��bP���/�r�I�uu��1��5^��6V��]�d���yvxc1�j��\_�}�W�=��&	=�:�]8�V��0����<�oe|1�u����s�fX��{�#����(�b����g����M}��k
_�����/��������/������z<������<������<�������lE}������sf����G�k_r_�e������/�/��a����a�8� �;%���l4h��0�l4��q��yv|�fRy6a�7�E_�|�+z@�������������3�t]9�w'�������a9������FM���D�[_��/�:���W�������[c�D
���U���/�������Qu�;-j��ZQ_G���|Q�:��_�_�y��IB�����L�����
L�\��4%�����,�����L�k8�E}��������4��R�_JW��9���������3l�s=|1��[_�s|1��{f�1�F��e�U�~_�5�������m�}�����8S�����7�o��|'���W���}'��
���4�������S��M�6�5�u�����_K:��7��/�����$����x�����U�=M	A��<�/�+K�y�/�+S��}Q�z�����"+���������A�=���yvyd���\_�3�V��\_�3��~���5q�/��Nb�i�����V��iWT��{����$(��r_��_r�
��m�����u_����/��(*�S���g��;O5<I��7�1���UwP,����g���/����g���v�����p�rL�+|G=��1�U��:��A�%�_�6,��;|i�0���u_����/��(*�S_*��K��A��|��������y6�/�|]���d�#�����a_}���_N�p�o���O�k���������|]�3��}����/[l�/[����o����}��k�����������&)���M���/��&��u_���������l���IJW��{���/��a�����qg��=�R��.5&�!�h�	����3�����s|m���������qX��������u_�u���$���!|-,�0%`��b�����5��;(�����D�o�I���/����E}���,�|�w:�k�|w���o�3+�*%��&��_�3�V��\_�}�w�4<I��wI��6�V��0����<�oe|1�u����s�fX������a���1�s1�0����<�����h��~_S�6��o=|Q_���OT_�}�����ww�3�yf|��y6�/�|+��y��/�|� ����� |�$�14^�{�����n����fv������|�0h)�=�K��l4��l4�o�N	A��<�/
�g6�/M�{�t�yV���}M��z�b�����T_*��K��M���*
�t]���E��������LQ���6�}��/����%���o��rl�k��
����/��(*�S���g��;O5<I(��C0���k�����_�3�R��f�;����|YvF}����[_���1w���F�����w'�������R��k�<��<�/g]�T_�}������o�����key
�\_�3�r��A���+��5�������y����-Fa����y_k��������5l�Q�z�����!������/�}
�o��S�c���l5e���z�b���2���:�b�����`���os�`�u��4��x���3���Y)��8"���/�/��a�R�{���|�0hT}�0h�
�����y_64�l_6������<;��Z3�<�0����/���=��Ry��OC�����u�_��|��������(�[�7k���������}�wb|�}+�����>m���/��.�J��7f�|��S
O:�mV��/���Vsg���z�b���2���:�b�����c���o��k���p�N�d�W����2�6�����u_r�z����/m�r��;BQ_�^�E}��������R<�����mT��w��o�x0����<�������s�;����6��o��6B��in��I/[$���,�s�C������|]�3��}����/[l�/[����o����}��k�����������&)���M���/��&��u_�������{X;��W5���&��$�_�%�6���g�.h�Y�"�-Va��l�x�g��_*�u��Yy�����$��w���(� �;%������<���90���t��x�n����U���g	Py6a�7wq����GE��T�����6�7�~�p��k��|���t])�^��tr_c����/]W�r�����K��Q����8�V�60����<�/]W�3]W�K��I|7��r0���[#�5M	��z�b�����T_*��{�i�<[Q��'M��W��v�[���{�$�o|I��������%����������|�qdS}�q_vy�7�
�v�5�
B�[_r_�uQ���F�a|����'	5����_�}=���A���f�������a|�a� ����-��=�sT������L:���DF��"�3T��7�T���}#���o�K�kN�����E}������j��+�U�]WV�w�/��.*���L]W��_�������`�����)�\�/�|)]�0�;��?�����q��������������^|Q_q|��m���u_�w|Q_�E}�����
��^�E}��������x���m|
���'	�n�����fXlUT��4%�����,�����L�k8�E}��������4��R�_JW��9���g��4e���z�b���2���:�b�����`����|�����$6��������z��[��j����$��	|�����_r_q|���U�/Q�i�E}�������&��k��
���/��.�t����u_�����$�����n���=�s�H�hJ�/�|)]Y2�;|)]���p������_Yi<��t����osH1�����;��<�������<����g�lD}�����c|�a2����o����}��{C�)����A���7^���K�+�o������A�w|Q_�E}��o��I����B}�������%�x�s�|��S
O
�uy�o|�qd8��<������,�g���z��p������_Yi<��t�������}�����A��1|1��[_�s|1��{�i0�V�������������"���5�wG3IP|����;1����
��a_����o=|Q_�uQT���1+��;w�jx���o�c�����X��1|1��[_�s|1���1�6�7�1�����vW��z�mc��5u*9�=��K���mX�}w���a
_����o=|Q_�uQT���T����
�������U���l_�3�����<G>m|9m����=m#�������c����	8F ���/�/��hg���%�_�,�T_�,D��-��=�=�����hg5�o=|�}��EM8R����$�_�}M�/����e��3�;v)]��W5���&��$�_�%���������o:���{���#=W	n���\R#<�t"W��-�<�/�rX���$����P3|��[_�|Q_{�+pT�z3�t]YQ_����|�����oi��z���+��<!88�5��L	����7�y_JW�����oK0�kg������ZU���/�����������w��s�I���/����E}���,�|�w:�k�|�w-P������f��/�>�E�������������Y??/>~Y/^O���^�^��f�Yn#�yh�����6n��2�����zx�
�z@��W�>jS�kk��2����@G�]
�(z���t�����%�/�#�����4�uO��ut5�c�+�No�S�
�����@G�]
�(z��wt�6��o�zs������nWSYGwf���c�]
�X�:����s������T�m��o�^t�;���^t������
s������
�s_�;�GT`��������&|������sn|�B��_�|Q_{������j+��+*S_�����&|Q�:���_�y��IB���	��;[����y.���������
��wf�����_�����E}���}����r�0�;
��/������������7�/����iR}��_�F���+����
�<[�cJ�<����=�����L��
���A�0��o=|u�/�:�����iF�e�>�;
��/�������i�;-j��aE}M����E}�����
�����$4��4��w|�,3%`���7��K���y^���k_6�������/�kO}M���iQ3�(�������E}����/�z4��5^����JWv�������e�fwAo�]��
��Gm
tm��U���(:��E�:�����7��t��%}dA�5��f��	�����t�{��Ms
��6��(:��E�:�n���f�
:@o=3Xwy��j*�����t�;���^t��}[b:�����m��-�a����ut5�c���N��u`��an�7�kl�d\#&8�Bb!C^_7�|�������
����
=�w|Q_�E}�����[����p���L}����Z�E}����;|����'	�nV��3������������b�����%������)|
���o=|Q_�u���S_JW�K����6�����SQS��y��/�|+��y��/�|Oo���m�:������x?;�;����iEe�y���9���O��J�%������
��^�E}��������R<��Uy_+y��IB	��nk��o��dJ�<'��<�/�+k����������7�/����lR}]���f��a��������kW)Y�5a��X�Z��<���u_��}��IB��n�����)�s=|1��[_�s|�<����x���ir1���y��/�|=�%GS_������!G}�������|:�������5���i7����b1����<�oe|1�u��<�����y�����i_�i����9�aP	j��#�5�/�/��a�R�{���|�0hT}�0h�
�����y_64�l_6������<;��Z3�<�0����/���=��Ry����������3�t]9�w'���s�V�Q$L��$5j�fg'r�����}��������lUg��'jN�����E}�����&���iQc�����8�|�����W��/�z�S
O
�����-V2%`����<�/�+3����[0�����"�
�����7���/�k]}�mL�/����4�������S��m6�5�������_+���7f������$��y/>S��a�UQ5���_�3�R��d�w�R�2�������/��.��x�K�
|)]T��E�g��4e���z�b���2���:�b������<[Q_�����$6�����j������[��������o��6��+w�3���}��-�}�|i��_����;j���P�z�������S_��I�uftY����M���Zj����x�|������=%88�5��L	����7�y_JW������;���m�)����|Q_�E}��o�#����D����[_�|+������Y�0���t��x
����(]��S�O3���O�"�y��p���O��}������/�������O/�_���?���<��z��c7�G�x��f�=��t=�c�+�N�)��5bV�NP�z�����t���f���l�������U}�@f���'@������@�7�)���`P�z�����t�����n�m�7��9��`��A�����;��G�����t�{�YG�9lm��D�K���A����u�:�����u�:Uw@�m�
���A��a�=Q��u�r��
��hCQ�!���KC����f��������
=�w|Q_�E}�����[���p���L}=�����E}����;|U���'	��������f.��\��4%�����,�����L�k8�E}��������4��R�_JW��9���g�]�sg���z�b���2���:�b�����c���os�`�u��4L�������f��O��F;��x1g�����}�W����u���_����o=|Q_�uQT���~+���9O5<I(���m�s�[!<�0�	|1��K���y�}��C|� �M����/� �T_��1��j�kX�u���n����4�`����y���b�����/����X�$�_�����������g���/���T��w�k�|w��49�0�X��<��������/�}M�k������E}��C>P}Y�_��T_����W�A��gc�b���2���:�b���c�m���c���c����t�z&�U������}��K��l����%�_6U_6��v����b���
��3��
�&�=n:�<�����&�s=|1���A��/�g�������u_������������Xy�{CL��n�����D�[_��/�:���W�������[c�D
���U���/�������Qu�;-j��ZQ_G���|Q�:��_�_�y��IB����H�?S�9�ox����l����P_k����&�E}�������g����\��	|Q_���/�[_��m��G�kX�5��z?%����<u�4�<~���-���O����^�7���y���z���xZ��������5���s��C��?<�q�}��'lv=���l@�:����Q�][#f��E�:��j@G���No6����6<�(}IYE�g
d��{t�;���^tz���n�
E�:��j@G���N������}���C��]t���:�3�~��j@����ut@�����N�����nt�xX�z�c�]
�X�:�Sut���o������n�{����
��8y=|�r���/6[_7`j��+�P�i�E}������Nnq�������R0��v�j�������0�5���$����+>S��������iJ�/�|)]Y2�;|)]���p������_Yi<��t����osH1�.;5e���z�b���2���:�b������<[Q���#����i8�����������VTf��X��3IP|�����_r�
��k�����u_����/��(*�S__�g�����$�����fM�VO��s_�3�R��f�����_.�A}�����-�&���}�k���x�:��X�v��u_�������_�s|Y�_����$����v�x�ZY��<�������<����3����a�W����P�&g�x�Q��z�b����Zr4�e��)|
r����/�z���/����~_�����v#��>(�l_�3�V��\_�3�����g+����v�������3����@<r_c����/-��|�}��
�F��
������)!(��g�e��A���A�e��I|���0�����5���	���.����k^��/�g�=���<[Q_��<�K��C|w���+;���H�n�Ij����N��������|�}��]�8��(�5vO�0���Q�=����/�kO}MU�������5qT�:������u_�����$����j��E��`r�j��)!(��g��te�<���te
_��/�[_�|]d������R�2���!��<���4L��ac����y���b����y�3��y6���]G���1��0C����E�)�~��L�vtfr���r_��_r_q|���_6�������/�kO}�6M���p��[_�|],��S�����;w�jx�P�o��S���3��WT��4%�����,�����L�k8�E}��������4��R�_JW��xC7������2l�s=|1��[_�s|1��{�{c������}�WuO���wW��|L��z��[��$A����������V�7l��M|
������E}��EQ)����<���y��IB���iW����b1����<�oe|1�u��<�/���T�������c�]�{8�����
����h��/�/���a)���K��)|
������E}��EQ)��Ry_�6�o��6f�W�~_��1|1���b'n$���
���
������r��[|��MG���N�1z(�o=|�}��E;c����/�/��e����e!
�lY���������F;��}��K��.j��r�}�$�/���kR}Y���/������K������t5)�'�/��/�z|
wF��s.�-�Rc����&���*�<��}|�<W���a9�;)j��ZQ_����}|Q�:�X�_�y��IB	������S�9�/�|)]Y3���b�P_+�N����$P�z����[_�����]��|�C�����w'���V:���R��k�<��<�oe|1�u�e�|�PJ���|�T�m�key
�\_�3�V��\_*��;j�5^������y��
1c1
�\_�3�zXK�����5��aC�����_�t@�e�|��kP}wG=c�g�W����gc�b���2���:�b���Bm���B��JBC���w�l���.mJif��o=|�}��
��r�������A����A��V����_�3��a��yf� ��a�$��MG�gU�z���y��/�|=(z@����t]�T_����K��|[d�=!��!��W>m�����r_��_r�
��=,�&��O�@}��������R<��Yy���T���|;��8�V�M	A��<�/�+k������Z��eg�7�/����E}��s���mt
k�|w���o|�*%��&��_�3�r��I�e�|9����F=��
�V��0����<�/g]4�Q����Q3��
�m�=�a�'>J9�b����g����M}��k
_�����/��������/��������>E=�}�[�&�PS��y��/�|+��y��/�|Oo���m�:������x���sf���;C4+��G����%�_6Z�}����/��/��[�SBP|1����A���
����A��7a�g�WQk&�g�y�]�E}����T_*��{�{Sy���t]y���+���t�5�a9������!��3(��r_��_r�
��=,�&��O�@}��������R<��Yy���T���|��{��yv���6����g���/����g�=���g#�����m#��0C�������
A|�_{fx��������K�������P�����}Q�z�������O}�<�/m�7�G3���s=|1���b'n$���#���
������r��[|w�����i4K���P����%�_��ar������������(��e����gr_;���&���/�/���	G�}�}�������I�e��3���z�����F�U�$��I�=I�|��
�{���ZyV��s��U���<�7^�|'���s|cV��wn�4<I����`�5�o�N	A��<�oe|1�u�m��;j�5^�����}U�;�YT�M���]�����Q��/�g�e��M�
��7�������}�$]WJ�("�������K������/�/��ueT}��2����
�s=|1��K��A�L���ue����������fMS����g�������3����T���o��&C���T;�-�w�=f�����$u�vFr�z����oe|�}��K���8����8��/;�����A��m!���/�/���	G�}#�0�s�l���|Y���/�����|��]|U3I�jR|��0��0h������d;�'�<�}�L�^�ew"��\��*��_*�����l3�[����0���Q�=����/�kO}���]W�k���ueE}��������"��N�u���������Ub�JW���<�/�+[��m�w�{���Y������U���/����������Z��Nm�7�/����E}��;�G�k_�82����nnJWf����L�������{^?=�z��zq�4�����/�����i}������K���7��m�6m������M�Q&�<���@o�]��
��Gm
tm��U���(:��E�:�����7��t��%}dA�5��f��	�����t�{��Ms
��6��(:��E�:�n���f�
:@o=3Xwy��j*�����t�;���^t��}[b:�����m��-�a����ut5�c���N��u`��an�7g'J���3���4�N��KC����f��������
=�w|Q_�E}�����[���p���L}=�����E}����;|U���'	��������f.��\��4%�����,�����L�k8�E}��������4��R�_JW��9���g�]�sg���z�b���2���:�b�����c���os�`�u��4L�������f��O��F;��x1g�����}�W����u���_����o=|Q_�uQT���~+���9O5<I(���m�s�[!<�0�	|1��K���y�}��C|� �M����/� �T_��1��j�kX�u���n����4�`����y���b�����/����X�$�_�����������g���/���T��w�k�|w��49�0�X��<��������/�}M�k������E}��C>P}Y�_��T_����W�A��gc�b���2���:�b���c�m���c���c����t�z&�U������}��K��l����%�_6U_6��v����b���
��3��
�&�=n:�<�����&�s=|1���A��/�g�������u_�������t���PXN
3��
�z6���;�_���V���a9�;�w��lD}M���E}�������T���|;��8�V�M	A��<�/�+k��s� �k_��Q���/�V������G�����x����u�:��UJ�}M��#��g���+����/�r��Q��p��N�!ewJ�/�|9���y�p��z�O6��
��t��0�c�px�
M����t��_�k��������5l�Q�z�����!������/�}
������������\_�3�V��\_�3�rL�M�5qL;��Ihch�|�s�����:�4�����������AK��_r_�e��Q�e��q|+@`wJ�/�|�0h�<�a|�0h���#��*|=�k�<����=��Ry_��l�/]WQ�������xGh��wm^CJ�k�x�/��ue6���3������$���]Wn�����y��/�|��2h��v]�����x�F��R����
�s=|1���A��/�g���������
�/]W��uL�{6���LQ�c�L�����IyA��(������V�w�+������T�����W��o\|Q�:�NXy_�Ry�����W_+�������b�����5��<����Z���>P���/�V������;�����82��NzY����]�d���y>��y_��2�����/g]U�I��_Rv����b�������I��_�Ry������&o89��164M4�'�b����Zr4�e��)|
r����/�z���/����~_����;�1��;_�9w��y��/�|+��y��/�|9����N{L;�z_x���
��;g6���:�4�����������AK��_r_�e��Q�e��q|+@`wJ�/�|�0h�<�a|�0h���#��*|=�k�<����=��Ry_��l�/]WQ�����-�O�������g��+
��A�[�x�/�N�/�o|��c_��m����E}��EQ)����<���y��IB	���W_+�������b�����5��Y�E}-���3���������u����|�6��5^�;�e���v��u_���/�|9��������ueT}��u�_+�S��z�b��������g]�����x�n�:kG����R���y��/�|=�%GS_������!G}�������|:�������5��-�OQ�i���I8��ac����y���b����y����lE}�����3|��0��+�w���0x���Jif��o=|�}��
��r�������A����A��V����_�3��a��yf� ��a�$��MG����U��I���y�t}Q_�5�����3���6T���/]W�����'�;�}
|X�"����F�;���o��|'�����a������6P�z�������O}cV��w�<��$������m������3l�s=|1��[_�s|1��{f�1�F����0�:�w&ch�|w����!�o�k���������|i�������������/�[_�|]���/�g��m���F��hf|���y��/�|]���d�#�q���a_}���_N�p��Nz�� y6�fI������������1L�{���|��`S}��_�,x����L�k_�������%�_5�H���o��|Y�5����z��u_��6���������t5)�'�/��/�|�=wA+��yn��
��gc���<����Ry��o��3�����'	=���F����)!(��g���/����A��|�C�����wsw��j|g>K���	������|=*z@���������a����W]�����o���J��E������|������%�_����/]W������y��/�|��2h���_��L��9���y����iJ�<����=��Ry�������
{�d|U�j�%�n��L����W�����H�[_r_���/�o|�}��G6��GQ�e��7|#�0h_�� ����%�_5�H�o��wn�mx�P�/����e��3��o���j&)]M�o�������|��le���<��{�<����A��\y_�Ry����E_����D��u_#����_K:�����/���S
OJ�����VO��s_�3�R��f���`����V��	|Q_���/�[_��<��M�kX�u���^�}��kW)Y�5a���b���M�/����
�F���
�����<�y��/�|�a��y�� �����5^�����y$�3�~cx1
�\_�3�zXK�����5��aC�����_�t@�e�|��kP}���b���W�U��g[�b���2���:�b���Bm���B�WQBC���w�lTx9�����}��K��l����%�_6U_6��v����b���
��3��
�&�=n:�<�����&�s=|1���A��/�g�������u_������{�#4f�;
�6�!%�5�o��|��2��v�������Jix���o��+7�Zi��<����t]4�Q���wn�k�|#w]���c�����g�������3��ueS}�v]����+'���m!v�u������c��o=|
���k_r�:��}����6<I���|�Ut|��m`����y_���g�]W�k���x���������
�s=|1���A��/�g���������_M�5��+������+=;��N�k_r_����R�{���|��2��t]��J�����g�����y��
|��2�����`������fMS����g�������3��>5�g+��t|��;
��4^����Ar_;g���H�[_r_���/�o|�}��G6��GQ�e��7|����v�5�
B�[_r_�uQ�����%���>��$�_�}=����g|���#����j&)]M��I���K�m���o���|�B�f�%�gc�Ry_���Sy^��Z�<�/g]YT_��2�o�N	A��<�/g]4��u��ue_nT���+�0����<��E��T�����6����Q�U���I|�����������v������=��xn���O���7��G���N������_��-����������������������\����/�`��U�?}�����������7���_>�<l>��yz|�������j�m?������5G���?_?�����?�z����������{?}���)�'����o7�f��I������������?���6������������-~�����?���o���<���������}���~������\�����i���y���g�^\�o~������o��k�h���O���'������_��o�a�?������?w��_���m��7��O�_>����n#|;���w��_������hy���������G?x���?��~�������E�o�����������'�W����_~����f���_�������������B�O�
���������w��>��/�����������_�/O�Z����7������K�����Gzzz|������������}�m��~���W��g�p��]��r��A��������Q����>��ixJ��4��S�O��]2���-�����������}������~�����/Z]�
u����e�{��~������l=m������o�����������_,���������_W_����u��?���������&��z���i}������g�����������O/��_/��������_k�w���x|j����^�����?><����_�M;��������n���m����t��������z������������8���i}�����o���/��l�������?���f�J��f����~���?�?�����������?o��x�����x���Z���������
��?�����O�}�E������a��>?�����}^������>����i�������x|���@����w�q�4M�{��
�?�����/�����?<��<���qm���(o���GX�������WzxZ��o�<�����C�����Zg��O���_�����xm�f��m<yz������>��]�=���~�}�7h������������?��5�?�O��v���~�{��
��e��\���O��?q��t���%"�C�1��o~���C�M�?_����~�����W�I�6�x����������~���t�����o�z�����������oz��!�k3�y7���&2��N��h��������l��d:�����Z��R��y��u_j�~�U�������Z�'X����`��	���`U�'x]����(�y�����N�n�~��������������-v����Q�������9���k� �������[���������_>}\|^�3G;�|yj���N�_���5m����v:;U����6	�f�������G���������y���#�,�=����oG�o�����?��E��������_+6o��^�~�����������k�3��_�e��V/�jz|�?�*�����O��Yh����~�*Z��m�����]R����s�������������'��M�o~���?���2�6��?��Own�������y{��o������(h�=.���&������oC��[O~�7?w�������>����Vf�_�}yx����?l����G����Wm�|����~�c�-��m��?l+��a[G\,~��]k�[���{���_/�[n����?���@�o�
�����=�]�mGN�s���y���O?<|�����m��?~����M�������y�������?�����6���K�
�����\���}�]�>�G`�x���j�|���?�����=������G�F�
����N�v"�S��l����L��w��N�v���\P>��3p�����RO�R�)���2Oy2��S6w��oryi`�!^�������?��S6��e��dH��l��g�q���Q�y��,x���.g|hH��,g������Y���o]N����O)DO���OY���S�M?��^�;���w^6�������8������'C�8�+C�<e��~eH��,��K����Cf�xw0ye������W��y�b��2��S���#�z��!o{��0�/��G
Y������!e��`V5��Sf���!�f�QC�}���v�/��,~��P�aH���
���|�C=1���e�,x�NDfY���y�,kp���Oy�5H�5�B�
Y���o]�����OY�x���34d��w�u9=CCJ>�=���,}�����!�����B/�y��/���C�ve��?R��]R�)�g�+CJ>e=]k�����gp���)�y��|J������OY���!E_���M���~�C���Y�eo��P�<��S�|�~^Q�/�Y��2�����OY�6�3e���2d����!���B����|��%,rp���)4_)���q�������!K_\����'�,3�
��[��,�-���xrR��e&��D�38d���L2_���e��]t*D����21dw>z���2OY g���|��������QC���P!b���O)�y����!K_��m\nR�u��<M�C+o�?���rh���r��2O���!%�����yq`�!^���=�^���!e�2��3~H�������<��CC�x�[�3>4��S�3�y2)z��,~���)�ghH�����$:~��/)�^��+�)��������.�b��2d���)���)������!%�������~���38d��w��<�CJ>���i��h��'�,}����/����[�������2d�o��<�/)��%_��������/.�/�)��%n�?S���+C�������/.�//Y��[�b �����B�����OY��	��\�����AoH!kp��2������e�������'��!�^\fr�J�=�C�����!����\=���QRP�5�m�eb��|.���!e��@�F
)��Yqy2���e�,x��:T���!e�� I5��Sf��'C�s���34d����u9�CCJ>e9���G����,~���.�ghH����8�5d�����C�E�!�^���Y_|��7K�2��O��qnW��y��Y����OY@O�Z�4K�2����%�)��B���Yr���/^�,yq��f���k?9-	��Cf���!�C����OY��{�X�/�Y��2�����OY�6�3e���2d����!���B����|��%,rp���)4_)���q�������!K_\����'�,3�
��[��,�-���xrR��e&��D�38d���L2_���e��}�����o����21dw>z���2OY g���|����W5�VF
�����:2O)�y�C
}����QC��xq���j[��{�
@�p;j�����JE�S���W��2OY���qy%��q�����B�G�p{yH��S����������!��e��Y�+C����!�C����OY����[�+C����5�0
�A��	��W���-�C
�����OY������W�,}q�Y}(�(����'4m��[��,�-��x�hz/�[&�,�-O���-�F(.��	}����{�~xw�,�3��_|`��3��S�����S��=j�������S,f�q�7V�-u�[��x�b��!���x1{��B/�y��/~������C��xwH��rpH��,����Vb�Y���9���%f��)��,3�
��[��,�-���xrR��e&��D�38d���L2_����s��e���!s~����BqeH��,�����Rc}e������,6��k�Y3Q��W�=W�,}q!c=T���B��r}���'��J�2������q98��S�e��R���+��}���`���|{�o98d�o��������mpH�������B_<1d���L2_������,�+C����!������OY����S�C^����*0Cr[�C�����*���B�.��q��/.��?f���DC%��Y]j������*���B���*��!K��U��!E��|`��U�D��fW����CC|�!�2�+C
�x�e�2�~^V<_^����J�C	i��iM���!��D)����[��=Csd=����������B�x�^ 4
��[&������a�g�����rnCC
��B�m��$�y
�[?
�������or��3��S���y��B�
CJ>�����C�y��w_���?��!���4�G
)���>jH���
�>7%����DoQ��R�)�>OAI��!K_��$zy�,��x�D	�`�3���e���r��2OY��!%�2/.{�o�j�
C��xb����)��B��`���!K_�`����Y�sw�D��t��2d�oy2��|yeH��,����OY�����_�2������!%�R�����1C��x����_v?��5�2d�o��8��)��_��M�5�2d��Y��	��t=���~e��������!%����7R�0d����C�D��^�Hu����eq#��!����F��,�-��.)��q���q9n���O�:�%Y9��C^��W����BO�R�)o�����|�����4���/���~cb�S���y��"|�S�)���[���M��gh���}�r����|�r�{XJ}����/�����
)��B�4��/}����/��0�q��CI���C
�x�e����1�qnW��y��}-���)������!%����.�Y�T7�����d���!��R�_^R�)�����OY2_�`(������O��;<��!���tV5��S�����|��Y�d���Y����,�/G
)�����!%�2k��7�����,x���.g|hH��,g���}����/�����
)��B�����,}��||p���(:���w^6��o���Tt����'C�8�+C�<e��~eH��,��k���6n2����nR�)�>OV���C��xV���!o\O��~�C���Y�eo��P�<��S�|�~^Q�/�Y��2�����OY�6�3e���2d����!���B����|��%,rp���)4_)���q�������!K_\����'�,3�
��[��,�-���xrR��e&��D�38d���L2_���e��}&���QC��[&����BO�R�)�l���O��}V�WKG
���W?r�r�zJ�S�����u�S���Z��S���-���jnCC
}����!�>O��5d����M*����8�^":-o��u����!���[��y�[��uH���CC^Xv���*���S���y�[���)�����!;O&����/�����
)����w�L���!�_�k`��R�)������:d���U����E�z���f}��%��s^���9/~2��s�2��S��W��|�z������?����/�R��)��B������/�����C��x���n���2����Y�eo��P�<��S�|�^,��+C�����2��S����LY�/�Y��B�rH"������,d_�o	��2���C
���CJ>eq\v'�rkpy�����!����+�Ln�C����!����.���zq���+B�Y��'�����rY��W�z�]P�5�m�eb��|.���!e��@�F
)��Yqy2���e�,x��:T���!e�� I5��Sf��'C�s���34d����u9�CCJ>e9���G����,~���.�ghH����8�5d�����C�E�!�^���Y_���Y,�W��y��!e���!e��xV�2��S���Vy������%���)��B�'�Y��!K_<�Yr�����E�~rZ�����-{C����!%�����b��_^���e���!%���m�g�Rye����C!�����e!+��}KX����/�Rh�R�)���;��[��C����5�
)d
N^Yfr2���Y�[��u��68����Ln]��gp��?�<d�x������L'��=�.;�m�eb��|.���!e��@�F
)��Yq��j7��2���ud�R�����<�
+��,}��������%�n�P�v��9���������/�T�e����!��J����B���!�>�P����B��8;5d��ggCC�����W���-�C���!%������)�W�,}q!k04aX��g�����[v�
��!%����w�)���Y��B��P.Q<�w�Oh�2���Y�[�?L����^��LY�[�`)�[v?�P\v�<�o�������~YB1f�����%B1fH��������`1{���/��;��,X���o��Z���.}�����C
�e�b��!�^���_�$E��/�����B�����OY��	�������s��!K�`�Sv_Yfr2���Y�[��u��68����Ln]��gp��?�<d�x��+������+C����!������OY��]������/>��OYl�/��f�D�T{�Y��B�z�r)�������j�O�;�98d����/��rpH��,��~�����W�/)��%���������rp����?d�o��������B/.3���/��xb��?�<d�x��+�'�9X*W���-�C��!%�����U�8��2d��U`��� ���+u�U��!�B]j����_\j���/.���J�����*��!�K�U��!��
�U�1C������C��e�*������� /�(������,��CtdW�z���fe���x��2d������ ��=�C����Rx�o9X�zqz���z���/.��
)�����~�@h&2��L����e���D�9Z�o)�����-���P�I���8��q�����U����!G��!W��z���2O�W�?��S�JO���Y�����[r?��S�-��R�)o�D�!;O&����/�����
)����w�L���!�_�����R�)��)iX?d���4�\��+�)��������I��^2��7���)e�[��Y����OY@O�Z�,f�2��+���gpH���<%����,}�����C��6�Cv_V�_^2���
Y����|��/���bye�����W��|����)K���!K_\�_I���������'�J�2���
!�q98��S�e��@��������/.d
�kS���������
����Ln�C
�����_���%�#���%���`C�>YB1j��~��!�b���O���C,;d������,0�������C�QC��x��2_{F
)�����R�X�2������!%��8.����!K_��X
)d
����!�K!c=8���&d�/Y<�	�QC��x���������-���[
Y�[&�,����B/^JOwH!z�Y��B��������I�e��n�Y79���<d���aH�����90����/���7�D7)��7�DCC��7Y��i��!s���!�^<G{�C��7����i�
CJ>eq\��7Y��i��!��AqZz����eqZzeH���8-3d��V���0d����C���G�X��!s~����BqeH��,��'C,;d���h�S��!f���B�����/.d�C�j��!�^�T{�����2���C
���CJ>eq\v'��_���C��xwH�o��3��+�Ln�C����!����.���zq���+B�Y��'�����r�t�L�se����?d�P\R�)�x_u�s�+C���PfHnr�nv+�����[ZB��
����_|P.J_\�

)��B�z������!������e��O�iM(.�,�-O���-�F(.��	}���.x�D��fW����CC|�!�2�+C
�x�e�2�~^V<_^����J�C	i��iM���!��D)����[��=Csd=����������B�x�^ 4
��[&������a�g�����rnCC
��B�m��$�y����8�T���!o��C���c��|����90����/���y:>fH����������c�,}��e��!���!�^���u����3d��K�_�R�)��R��r���/^^���v����3d�o)�94���&�yq���M��r���/^^����������2d�o94d�o����+C
�x)=�!���2d��������`B
������<d�o98d>=��z�|z�C�3j��/�ghH!z�F
��[
-()C�����!��ZP5d��/(\�.Y%���/(�2��ZPRh&ZP5d�oY��p�`	�e���e�V���4�%_���Y_|`��/��X{.)�����R��]�����[o�+����d�m��'
ssi-2pc-fix.patchtext/plain; name=ssi-2pc-fix.patchDownload
*** a/src/backend/storage/lmgr/predicate.c
--- b/src/backend/storage/lmgr/predicate.c
***************
*** 244,249 ****
--- 244,257 ----
  
  #define SxactIsOnFinishedList(sxact) (!SHMQueueIsDetached(&((sxact)->finishedLink)))
  
+ /*
+  * Note that a sxact is marked "prepared" once it has passed
+  * PreCommit_CheckForSerializationFailure, even if it isn't using
+  * 2PC. This is the point at which it can no longer be aborted.
+  *
+  * The PREPARED flag remains set after commit, so SxactIsCommitted
+  * implies SxactIsPrepared.
+  */
  #define SxactIsCommitted(sxact) (((sxact)->flags & SXACT_FLAG_COMMITTED) != 0)
  #define SxactIsPrepared(sxact) (((sxact)->flags & SXACT_FLAG_PREPARED) != 0)
  #define SxactIsRolledBack(sxact) (((sxact)->flags & SXACT_FLAG_ROLLED_BACK) != 0)
***************
*** 3165,3170 **** ReleasePredicateLocks(bool isCommit)
--- 3173,3185 ----
  		 */
  		MySerializableXact->flags |= SXACT_FLAG_DOOMED;
  		MySerializableXact->flags |= SXACT_FLAG_ROLLED_BACK;
+ 		/*
+ 		 * If the transaction was previously prepared, but is now failing due
+ 		 * to a ROLLBACK PREPARED or (hopefully very rare) error after the
+ 		 * prepare, clear the prepared flag.  This simplifies conflict
+ 		 * checking,
+ 		 */
+ 		MySerializableXact->flags &= ~SXACT_FLAG_PREPARED;
  	}
  
  	if (!topLevelIsDeclaredReadOnly)
***************
*** 4381,4387 **** OnConflict_CheckForSerializationFailure(const SERIALIZABLEXACT *reader,
  		{
  			SERIALIZABLEXACT *t2 = conflict->sxactIn;
  
! 			if (SxactIsCommitted(t2)
  				&& (!SxactIsCommitted(reader)
  					|| t2->commitSeqNo <= reader->commitSeqNo)
  				&& (!SxactIsCommitted(writer)
--- 4396,4402 ----
  		{
  			SERIALIZABLEXACT *t2 = conflict->sxactIn;
  
! 			if (SxactIsPrepared(t2)
  				&& (!SxactIsCommitted(reader)
  					|| t2->commitSeqNo <= reader->commitSeqNo)
  				&& (!SxactIsCommitted(writer)
***************
*** 4400,4406 **** OnConflict_CheckForSerializationFailure(const SERIALIZABLEXACT *reader,
  	}
  
  	/*------------------------------------------------------------------------
! 	 * Check whether the reader has become a pivot with a committed writer:
  	 *
  	 *		T0 ------> R ------> W
  	 *			 rw		   rw
--- 4415,4422 ----
  	}
  
  	/*------------------------------------------------------------------------
! 	 * Check whether the reader has become a pivot with a writer
! 	 * that's committed or prepared:
  	 *
  	 *		T0 ------> R ------> W
  	 *			 rw		   rw
***************
*** 4411,4417 **** OnConflict_CheckForSerializationFailure(const SERIALIZABLEXACT *reader,
  	 * - T0 is READ ONLY, and overlaps the writer
  	 *------------------------------------------------------------------------
  	 */
! 	if (!failure && SxactIsCommitted(writer) && !SxactIsReadOnly(reader))
  	{
  		if (SxactHasSummaryConflictIn(reader))
  		{
--- 4427,4433 ----
  	 * - T0 is READ ONLY, and overlaps the writer
  	 *------------------------------------------------------------------------
  	 */
! 	if (!failure && SxactIsPrepared(writer) && !SxactIsReadOnly(reader))
  	{
  		if (SxactHasSummaryConflictIn(reader))
  		{
*** a/src/test/regress/expected/prepared_xacts.out
--- b/src/test/regress/expected/prepared_xacts.out
***************
*** 131,142 **** SELECT * FROM pxtest1;
   ddd
  (2 rows)
  
- INSERT INTO pxtest1 VALUES ('fff');
  -- This should fail, because the two transactions have a write-skew anomaly
! PREPARE TRANSACTION 'foo5';
  ERROR:  could not serialize access due to read/write dependencies among transactions
! DETAIL:  Canceled on commit attempt with conflict in from prepared pivot.
  HINT:  The transaction might succeed if retried.
  SELECT gid FROM pg_prepared_xacts;
   gid  
  ------
--- 131,142 ----
   ddd
  (2 rows)
  
  -- This should fail, because the two transactions have a write-skew anomaly
! INSERT INTO pxtest1 VALUES ('fff');
  ERROR:  could not serialize access due to read/write dependencies among transactions
! DETAIL:  Cancelled on identification as a pivot, during write.
  HINT:  The transaction might succeed if retried.
+ PREPARE TRANSACTION 'foo5';
  SELECT gid FROM pg_prepared_xacts;
   gid  
  ------
*** a/src/test/regress/expected/prepared_xacts_1.out
--- b/src/test/regress/expected/prepared_xacts_1.out
***************
*** 134,141 **** SELECT * FROM pxtest1;
   aaa
  (1 row)
  
- INSERT INTO pxtest1 VALUES ('fff');
  -- This should fail, because the two transactions have a write-skew anomaly
  PREPARE TRANSACTION 'foo5';
  ERROR:  prepared transactions are disabled
  HINT:  Set max_prepared_transactions to a nonzero value.
--- 134,141 ----
   aaa
  (1 row)
  
  -- This should fail, because the two transactions have a write-skew anomaly
+ INSERT INTO pxtest1 VALUES ('fff');
  PREPARE TRANSACTION 'foo5';
  ERROR:  prepared transactions are disabled
  HINT:  Set max_prepared_transactions to a nonzero value.
*** a/src/test/regress/sql/prepared_xacts.sql
--- b/src/test/regress/sql/prepared_xacts.sql
***************
*** 74,82 **** SELECT gid FROM pg_prepared_xacts;
  
  BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE;
  SELECT * FROM pxtest1;
- INSERT INTO pxtest1 VALUES ('fff');
  
  -- This should fail, because the two transactions have a write-skew anomaly
  PREPARE TRANSACTION 'foo5';
  
  SELECT gid FROM pg_prepared_xacts;
--- 74,82 ----
  
  BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE;
  SELECT * FROM pxtest1;
  
  -- This should fail, because the two transactions have a write-skew anomaly
+ INSERT INTO pxtest1 VALUES ('fff');
  PREPARE TRANSACTION 'foo5';
  
  SELECT gid FROM pg_prepared_xacts;
#2Heikki Linnakangas
heikki.linnakangas@enterprisedb.com
In reply to: Kevin Grittner (#1)
Re: SSI 2PC coverage

On 05.07.2011 20:06, Kevin Grittner wrote:

[resending after gzip of test patch]

In reviewing the recent fix to 2PC coverage in SSI, I found some
cases which didn't seem to be covered. Dan bit the bullet and came
up with an additional isolation test to rigorously cover all the
permutations, to find *all* 2PC statement orderings which weren't
working right. Because it was so big, he pared out tests which were
redundant, in that they exercised the same code paths and pointed at
the same issues. A patch to add this test is attached. Run against
HEAD it shows the errors. It's kinda big, but I think it's worth
having.

Attached is also a patch to fix those, so that all permutations
work.

I think that needs some explanation, why only those SxactIsCommitted()
tests need to be replaced with SxactIsPrepared()? What about the first
SxactIsCommitted() test in OnConflict_CheckForSerializationFailure(),
for instance?

--
Heikki Linnakangas
EnterpriseDB http://www.enterprisedb.com

#3Kevin Grittner
Kevin.Grittner@wicourts.gov
In reply to: Heikki Linnakangas (#2)
Re: SSI 2PC coverage

Heikki Linnakangas <heikki.linnakangas@enterprisedb.com> wrote:

Attached is also a patch to fix those, so that all permutations
work.

I think that needs some explanation, why only those
SxactIsCommitted() tests need to be replaced with
SxactIsPrepared()? What about the first SxactIsCommitted() test in
OnConflict_CheckForSerializationFailure(), for instance?

Well, that's covered in the other patch. This one has the minimum
required to get all the permutations of 2PC working correctly. It
was looking at just such questions as you pose here that led us to
the other patch. Neither macro has quite the right semantics
without the lower level work in the "atomic commit" patch.

-Kevin

#4Dan Ports
drkp@csail.mit.edu
In reply to: Heikki Linnakangas (#2)
Re: SSI 2PC coverage

On Tue, Jul 05, 2011 at 09:14:30PM +0300, Heikki Linnakangas wrote:

I think that needs some explanation, why only those SxactIsCommitted()
tests need to be replaced with SxactIsPrepared()?

Here is the specific problem this patch addresses:

If there's a dangerous structure T0 ---> T1 ---> T2, and T2 commits
first, we need to abort something. If T2 commits before both conflicts
appear, then it should be caught by
OnConflict_CheckForSerializationFailure. If both conflicts appear
before T2 commits, it should be caught by
PreCommit_CheckForSerializationFailure. But that is actually run before
T2 *prepares*.

So the problem occurs if T2 is prepared but not committed when the
second conflict is detected. OnConflict_CFSF deems that OK, because T2
hasn't committed yet. PreCommit_CFSF doesn't see a problem either,
because the conflict didn't exist when it ran (before the transaction
prepared)

This patch fixes that by having OnConflict_CFSF declare a serialization
failure in this circumstance if T2 is already prepared, not just if
it's committed.

Although it fixes the situation described above, I wasn't initially
confident that there weren't other problematic cases. I wrote the
attached test case to convince myself of that. Because it tests all
possible sequences of conflict/prepare/commit that should lead to
serialization failure, the fact that they do all fail (with this patch)
indicates that these are the only checks that need to be changed.

What about the first
SxactIsCommitted() test in OnConflict_CheckForSerializationFailure(),
for instance?

That one only comes up if the SERIALIZABLEXACT for one of the
transactions involved has been freed, and the RWConflict that points to
it has been replaced by a flag. That only happens if "writer" has
previously called ReleasePredicateLocks.

Dan

--
Dan R. K. Ports MIT CSAIL http://drkp.net/

#5Heikki Linnakangas
heikki.linnakangas@enterprisedb.com
In reply to: Kevin Grittner (#1)
Re: SSI 2PC coverage

On 05.07.2011 20:06, Kevin Grittner wrote:

[resending after gzip of test patch]

In reviewing the recent fix to 2PC coverage in SSI, I found some
cases which didn't seem to be covered. Dan bit the bullet and came
up with an additional isolation test to rigorously cover all the
permutations, to find *all* 2PC statement orderings which weren't
working right. Because it was so big, he pared out tests which were
redundant, in that they exercised the same code paths and pointed at
the same issues. A patch to add this test is attached. Run against
HEAD it shows the errors. It's kinda big, but I think it's worth
having.

I agree it'd be very nice to have this test, but 2.3 MB of expected
output is a bit excessive. Let's try to cut that down into something
more palatable.

There's two expected output files for this, one for max_prepared_xacts=0
and another for the "normal" case. The max_prepared_xacts=0 case isn't
very interesting, since all the PREPARE TRANSACTION commands fail. I
think we should adjust the test harness to not run these tests at all if
max_prepared_xacts=0. It would be better to skip the test and print out
a notice pointing out that it was not run, it'll just give a false sense
of security to run the test and report success, when it didn't test
anything useful.

That alone cuts the size of the expected output to about 1 MB. That's
much better, although it's still a lot of weight just for expected
output. However, it compresses extremely well, to about 16 KB, so this
isn't an issue for the size of distribution tarballs and such, only for
git checkouts and on-disk size of extracted tarballs. I think that would
be acceptable, although we could easily cut it a bit further if we want
to. For example leaving out the word "step" from all the lines of
executed test steps would cut it by about 80 KB.

Attached is also a patch to fix those, so that all permutations
work.

Thanks, committed the bug fix with some additional comments.

--
Heikki Linnakangas
EnterpriseDB http://www.enterprisedb.com

#6Kevin Grittner
Kevin.Grittner@wicourts.gov
In reply to: Heikki Linnakangas (#5)
Re: SSI 2PC coverage

Heikki Linnakangas <heikki.linnakangas@enterprisedb.com> wrote:

On 05.07.2011 20:06, Kevin Grittner wrote:

In reviewing the recent fix to 2PC coverage in SSI, I found some
cases which didn't seem to be covered. Dan bit the bullet and
came up with an additional isolation test to rigorously cover all
the permutations, to find *all* 2PC statement orderings which
weren't working right. Because it was so big, he pared out tests
which were redundant, in that they exercised the same code paths
and pointed at the same issues. A patch to add this test is
attached. Run against HEAD it shows the errors. It's kinda big,
but I think it's worth having.

I agree it'd be very nice to have this test, but 2.3 MB of
expected output is a bit excessive. Let's try to cut that down
into something more palatable.

OK

There's two expected output files for this, one for
max_prepared_xacts=0 and another for the "normal" case. The
max_prepared_xacts=0 case isn't very interesting, since all the
PREPARE TRANSACTION commands fail. I think we should adjust the
test harness to not run these tests at all if
max_prepared_xacts=0. It would be better to skip the test and
print out a notice pointing out that it was not run, it'll just
give a false sense of security to run the test and report success,
when it didn't test anything useful.

That alone cuts the size of the expected output to about 1 MB.

OK. I'll work on this tonight unless Dan jumps in to claim it.

That's much better, although it's still a lot of weight just for
expected output. However, it compresses extremely well, to about
16 KB, so this isn't an issue for the size of distribution
tarballs and such, only for git checkouts and on-disk size of
extracted tarballs. I think that would be acceptable, although we
could easily cut it a bit further if we want to. For example
leaving out the word "step" from all the lines of executed test
steps would cut it by about 80 KB.

That seems simple enough. Any other ideas?

Attached is also a patch to fix those, so that all permutations
work.

Thanks, committed the bug fix with some additional comments.

Thanks!

-Kevin

#7Heikki Linnakangas
heikki.linnakangas@enterprisedb.com
In reply to: Kevin Grittner (#6)
Re: SSI 2PC coverage

On 07.07.2011 18:43, Kevin Grittner wrote:

Heikki Linnakangas<heikki.linnakangas@enterprisedb.com> wrote:

On 05.07.2011 20:06, Kevin Grittner wrote:

There's two expected output files for this, one for
max_prepared_xacts=0 and another for the "normal" case. The
max_prepared_xacts=0 case isn't very interesting, since all the
PREPARE TRANSACTION commands fail. I think we should adjust the
test harness to not run these tests at all if
max_prepared_xacts=0. It would be better to skip the test and
print out a notice pointing out that it was not run, it'll just
give a false sense of security to run the test and report success,
when it didn't test anything useful.

That alone cuts the size of the expected output to about 1 MB.

OK. I'll work on this tonight unless Dan jumps in to claim it.

Committed. I removed the second expected output file, and marked the
prepared-transactions tests in the schedule as "ignore" instead. That
way if max_prepared_transactions=0, you get a notice that the test case
failed, but pg_regress still returns 0 as exit status.

That's much better, although it's still a lot of weight just for
expected output. However, it compresses extremely well, to about
16 KB, so this isn't an issue for the size of distribution
tarballs and such, only for git checkouts and on-disk size of
extracted tarballs. I think that would be acceptable, although we
could easily cut it a bit further if we want to. For example
leaving out the word "step" from all the lines of executed test
steps would cut it by about 80 KB.

That seems simple enough. Any other ideas?

I think it's good enough as it is. I did change the lexer slightly, to
trim whitespace from the beginning and end of SQL blocks. This cuts the
size of expected output a bit, and makes it look nicer anyway.

--
Heikki Linnakangas
EnterpriseDB http://www.enterprisedb.com

#8Tom Lane
tgl@sss.pgh.pa.us
In reply to: Heikki Linnakangas (#7)
Re: SSI 2PC coverage

Heikki Linnakangas <heikki.linnakangas@enterprisedb.com> writes:

On 07.07.2011 18:43, Kevin Grittner wrote:

OK. I'll work on this tonight unless Dan jumps in to claim it.

Committed. I removed the second expected output file, and marked the
prepared-transactions tests in the schedule as "ignore" instead. That
way if max_prepared_transactions=0, you get a notice that the test case
failed, but pg_regress still returns 0 as exit status.

Why did you only commit on 9.1 branch?

regards, tom lane

#9Heikki Linnakangas
heikki.linnakangas@enterprisedb.com
In reply to: Tom Lane (#8)
Re: SSI 2PC coverage

On 18.08.2011 17:07, Tom Lane wrote:

Heikki Linnakangas<heikki.linnakangas@enterprisedb.com> writes:

On 07.07.2011 18:43, Kevin Grittner wrote:

OK. I'll work on this tonight unless Dan jumps in to claim it.

Committed. I removed the second expected output file, and marked the
prepared-transactions tests in the schedule as "ignore" instead. That
way if max_prepared_transactions=0, you get a notice that the test case
failed, but pg_regress still returns 0 as exit status.

Why did you only commit on 9.1 branch?

I did "git push origin master REL9_1_STABLE", and didn't notice that it
failed on master. Rebased and pushed, thanks!

--
Heikki Linnakangas
EnterpriseDB http://www.enterprisedb.com

#10Kevin Grittner
Kevin.Grittner@wicourts.gov
In reply to: Heikki Linnakangas (#7)
1 attachment(s)
Re: SSI 2PC coverage

Heikki Linnakangas <heikki.linnakangas@enterprisedb.com> wrote:

Committed. I removed the second expected output file, and marked
the prepared-transactions tests in the schedule as "ignore"
instead. That way if max_prepared_transactions=0, you get a notice
that the test case failed, but pg_regress still returns 0 as exit
status.

Thanks! Sorry I didn't get to it. Things got really busy here.

I did change the lexer slightly, to trim whitespace from the
beginning and end of SQL blocks. This cuts the size of expected
output a bit, and makes it look nicer anyway.

OK. You missed the alternative outputs for a couple files. These
are needed to get successful tests with
default_transaction_isolation = 'serializable' or 'repeatable read'.
Patch attached.

-Kevin

Attachments:

isolation-test-ws-1.patchtext/plain; name=isolation-test-ws-1.patchDownload
*** a/src/test/isolation/expected/fk-deadlock2_1.out
--- b/src/test/isolation/expected/fk-deadlock2_1.out
***************
*** 1,110 ****
  Parsed test spec with 2 sessions
  
  starting permutation: s1u1 s1u2 s1c s2u1 s2u2 s2c
! step s1u1:  UPDATE A SET Col1 = 1 WHERE AID = 1; 
! step s1u2:  UPDATE B SET Col2 = 1 WHERE BID = 2; 
! step s1c:  COMMIT; 
! step s2u1:  UPDATE B SET Col2 = 1 WHERE BID = 2; 
! step s2u2:  UPDATE B SET Col2 = 1 WHERE BID = 2; 
! step s2c:  COMMIT; 
  
  starting permutation: s1u1 s1u2 s2u1 s1c s2u2 s2c
! step s1u1:  UPDATE A SET Col1 = 1 WHERE AID = 1; 
! step s1u2:  UPDATE B SET Col2 = 1 WHERE BID = 2; 
! step s2u1:  UPDATE B SET Col2 = 1 WHERE BID = 2;  <waiting ...>
! step s1c:  COMMIT; 
  step s2u1: <... completed>
  ERROR:  could not serialize access due to concurrent update
! step s2u2:  UPDATE B SET Col2 = 1 WHERE BID = 2; 
  ERROR:  current transaction is aborted, commands ignored until end of transaction block
! step s2c:  COMMIT; 
  
  starting permutation: s1u1 s2u1 s1u2 s2u2 s1c s2c
! step s1u1:  UPDATE A SET Col1 = 1 WHERE AID = 1; 
! step s2u1:  UPDATE B SET Col2 = 1 WHERE BID = 2; 
! step s1u2:  UPDATE B SET Col2 = 1 WHERE BID = 2;  <waiting ...>
! step s2u2:  UPDATE B SET Col2 = 1 WHERE BID = 2; 
  step s1u2: <... completed>
  ERROR:  deadlock detected
! step s1c:  COMMIT; 
! step s2c:  COMMIT; 
  
  starting permutation: s1u1 s2u1 s1u2 s2u2 s2c s1c
! step s1u1:  UPDATE A SET Col1 = 1 WHERE AID = 1; 
! step s2u1:  UPDATE B SET Col2 = 1 WHERE BID = 2; 
! step s1u2:  UPDATE B SET Col2 = 1 WHERE BID = 2;  <waiting ...>
! step s2u2:  UPDATE B SET Col2 = 1 WHERE BID = 2; 
  step s1u2: <... completed>
  ERROR:  deadlock detected
! step s2c:  COMMIT; 
! step s1c:  COMMIT; 
  
  starting permutation: s1u1 s2u1 s2u2 s1u2 s1c s2c
! step s1u1:  UPDATE A SET Col1 = 1 WHERE AID = 1; 
! step s2u1:  UPDATE B SET Col2 = 1 WHERE BID = 2; 
! step s2u2:  UPDATE B SET Col2 = 1 WHERE BID = 2;  <waiting ...>
! step s1u2:  UPDATE B SET Col2 = 1 WHERE BID = 2; 
  ERROR:  deadlock detected
  step s2u2: <... completed>
! step s1c:  COMMIT; 
! step s2c:  COMMIT; 
  
  starting permutation: s1u1 s2u1 s2u2 s1u2 s2c s1c
! step s1u1:  UPDATE A SET Col1 = 1 WHERE AID = 1; 
! step s2u1:  UPDATE B SET Col2 = 1 WHERE BID = 2; 
! step s2u2:  UPDATE B SET Col2 = 1 WHERE BID = 2;  <waiting ...>
! step s1u2:  UPDATE B SET Col2 = 1 WHERE BID = 2; 
  ERROR:  deadlock detected
  step s2u2: <... completed>
! step s2c:  COMMIT; 
! step s1c:  COMMIT; 
  
  starting permutation: s2u1 s1u1 s1u2 s2u2 s1c s2c
! step s2u1:  UPDATE B SET Col2 = 1 WHERE BID = 2; 
! step s1u1:  UPDATE A SET Col1 = 1 WHERE AID = 1; 
! step s1u2:  UPDATE B SET Col2 = 1 WHERE BID = 2;  <waiting ...>
! step s2u2:  UPDATE B SET Col2 = 1 WHERE BID = 2; 
  step s1u2: <... completed>
  ERROR:  deadlock detected
! step s1c:  COMMIT; 
! step s2c:  COMMIT; 
  
  starting permutation: s2u1 s1u1 s1u2 s2u2 s2c s1c
! step s2u1:  UPDATE B SET Col2 = 1 WHERE BID = 2; 
! step s1u1:  UPDATE A SET Col1 = 1 WHERE AID = 1; 
! step s1u2:  UPDATE B SET Col2 = 1 WHERE BID = 2;  <waiting ...>
! step s2u2:  UPDATE B SET Col2 = 1 WHERE BID = 2; 
  step s1u2: <... completed>
  ERROR:  deadlock detected
! step s2c:  COMMIT; 
! step s1c:  COMMIT; 
  
  starting permutation: s2u1 s1u1 s2u2 s1u2 s1c s2c
! step s2u1:  UPDATE B SET Col2 = 1 WHERE BID = 2; 
! step s1u1:  UPDATE A SET Col1 = 1 WHERE AID = 1; 
! step s2u2:  UPDATE B SET Col2 = 1 WHERE BID = 2;  <waiting ...>
! step s1u2:  UPDATE B SET Col2 = 1 WHERE BID = 2; 
  ERROR:  deadlock detected
  step s2u2: <... completed>
! step s1c:  COMMIT; 
! step s2c:  COMMIT; 
  
  starting permutation: s2u1 s1u1 s2u2 s1u2 s2c s1c
! step s2u1:  UPDATE B SET Col2 = 1 WHERE BID = 2; 
! step s1u1:  UPDATE A SET Col1 = 1 WHERE AID = 1; 
! step s2u2:  UPDATE B SET Col2 = 1 WHERE BID = 2;  <waiting ...>
! step s1u2:  UPDATE B SET Col2 = 1 WHERE BID = 2; 
  ERROR:  deadlock detected
  step s2u2: <... completed>
! step s2c:  COMMIT; 
! step s1c:  COMMIT; 
  
  starting permutation: s2u1 s2u2 s1u1 s2c s1u2 s1c
! step s2u1:  UPDATE B SET Col2 = 1 WHERE BID = 2; 
! step s2u2:  UPDATE B SET Col2 = 1 WHERE BID = 2; 
! step s1u1:  UPDATE A SET Col1 = 1 WHERE AID = 1;  <waiting ...>
! step s2c:  COMMIT; 
  step s1u1: <... completed>
! step s1u2:  UPDATE B SET Col2 = 1 WHERE BID = 2; 
  ERROR:  could not serialize access due to read/write dependencies among transactions
! step s1c:  COMMIT; 
--- 1,110 ----
  Parsed test spec with 2 sessions
  
  starting permutation: s1u1 s1u2 s1c s2u1 s2u2 s2c
! step s1u1: UPDATE A SET Col1 = 1 WHERE AID = 1;
! step s1u2: UPDATE B SET Col2 = 1 WHERE BID = 2;
! step s1c: COMMIT;
! step s2u1: UPDATE B SET Col2 = 1 WHERE BID = 2;
! step s2u2: UPDATE B SET Col2 = 1 WHERE BID = 2;
! step s2c: COMMIT;
  
  starting permutation: s1u1 s1u2 s2u1 s1c s2u2 s2c
! step s1u1: UPDATE A SET Col1 = 1 WHERE AID = 1;
! step s1u2: UPDATE B SET Col2 = 1 WHERE BID = 2;
! step s2u1: UPDATE B SET Col2 = 1 WHERE BID = 2; <waiting ...>
! step s1c: COMMIT;
  step s2u1: <... completed>
  ERROR:  could not serialize access due to concurrent update
! step s2u2: UPDATE B SET Col2 = 1 WHERE BID = 2;
  ERROR:  current transaction is aborted, commands ignored until end of transaction block
! step s2c: COMMIT;
  
  starting permutation: s1u1 s2u1 s1u2 s2u2 s1c s2c
! step s1u1: UPDATE A SET Col1 = 1 WHERE AID = 1;
! step s2u1: UPDATE B SET Col2 = 1 WHERE BID = 2;
! step s1u2: UPDATE B SET Col2 = 1 WHERE BID = 2; <waiting ...>
! step s2u2: UPDATE B SET Col2 = 1 WHERE BID = 2;
  step s1u2: <... completed>
  ERROR:  deadlock detected
! step s1c: COMMIT;
! step s2c: COMMIT;
  
  starting permutation: s1u1 s2u1 s1u2 s2u2 s2c s1c
! step s1u1: UPDATE A SET Col1 = 1 WHERE AID = 1;
! step s2u1: UPDATE B SET Col2 = 1 WHERE BID = 2;
! step s1u2: UPDATE B SET Col2 = 1 WHERE BID = 2; <waiting ...>
! step s2u2: UPDATE B SET Col2 = 1 WHERE BID = 2;
  step s1u2: <... completed>
  ERROR:  deadlock detected
! step s2c: COMMIT;
! step s1c: COMMIT;
  
  starting permutation: s1u1 s2u1 s2u2 s1u2 s1c s2c
! step s1u1: UPDATE A SET Col1 = 1 WHERE AID = 1;
! step s2u1: UPDATE B SET Col2 = 1 WHERE BID = 2;
! step s2u2: UPDATE B SET Col2 = 1 WHERE BID = 2; <waiting ...>
! step s1u2: UPDATE B SET Col2 = 1 WHERE BID = 2;
  ERROR:  deadlock detected
  step s2u2: <... completed>
! step s1c: COMMIT;
! step s2c: COMMIT;
  
  starting permutation: s1u1 s2u1 s2u2 s1u2 s2c s1c
! step s1u1: UPDATE A SET Col1 = 1 WHERE AID = 1;
! step s2u1: UPDATE B SET Col2 = 1 WHERE BID = 2;
! step s2u2: UPDATE B SET Col2 = 1 WHERE BID = 2; <waiting ...>
! step s1u2: UPDATE B SET Col2 = 1 WHERE BID = 2;
  ERROR:  deadlock detected
  step s2u2: <... completed>
! step s2c: COMMIT;
! step s1c: COMMIT;
  
  starting permutation: s2u1 s1u1 s1u2 s2u2 s1c s2c
! step s2u1: UPDATE B SET Col2 = 1 WHERE BID = 2;
! step s1u1: UPDATE A SET Col1 = 1 WHERE AID = 1;
! step s1u2: UPDATE B SET Col2 = 1 WHERE BID = 2; <waiting ...>
! step s2u2: UPDATE B SET Col2 = 1 WHERE BID = 2;
  step s1u2: <... completed>
  ERROR:  deadlock detected
! step s1c: COMMIT;
! step s2c: COMMIT;
  
  starting permutation: s2u1 s1u1 s1u2 s2u2 s2c s1c
! step s2u1: UPDATE B SET Col2 = 1 WHERE BID = 2;
! step s1u1: UPDATE A SET Col1 = 1 WHERE AID = 1;
! step s1u2: UPDATE B SET Col2 = 1 WHERE BID = 2; <waiting ...>
! step s2u2: UPDATE B SET Col2 = 1 WHERE BID = 2;
  step s1u2: <... completed>
  ERROR:  deadlock detected
! step s2c: COMMIT;
! step s1c: COMMIT;
  
  starting permutation: s2u1 s1u1 s2u2 s1u2 s1c s2c
! step s2u1: UPDATE B SET Col2 = 1 WHERE BID = 2;
! step s1u1: UPDATE A SET Col1 = 1 WHERE AID = 1;
! step s2u2: UPDATE B SET Col2 = 1 WHERE BID = 2; <waiting ...>
! step s1u2: UPDATE B SET Col2 = 1 WHERE BID = 2;
  ERROR:  deadlock detected
  step s2u2: <... completed>
! step s1c: COMMIT;
! step s2c: COMMIT;
  
  starting permutation: s2u1 s1u1 s2u2 s1u2 s2c s1c
! step s2u1: UPDATE B SET Col2 = 1 WHERE BID = 2;
! step s1u1: UPDATE A SET Col1 = 1 WHERE AID = 1;
! step s2u2: UPDATE B SET Col2 = 1 WHERE BID = 2; <waiting ...>
! step s1u2: UPDATE B SET Col2 = 1 WHERE BID = 2;
  ERROR:  deadlock detected
  step s2u2: <... completed>
! step s2c: COMMIT;
! step s1c: COMMIT;
  
  starting permutation: s2u1 s2u2 s1u1 s2c s1u2 s1c
! step s2u1: UPDATE B SET Col2 = 1 WHERE BID = 2;
! step s2u2: UPDATE B SET Col2 = 1 WHERE BID = 2;
! step s1u1: UPDATE A SET Col1 = 1 WHERE AID = 1; <waiting ...>
! step s2c: COMMIT;
  step s1u1: <... completed>
! step s1u2: UPDATE B SET Col2 = 1 WHERE BID = 2;
  ERROR:  could not serialize access due to read/write dependencies among transactions
! step s1c: COMMIT;
*** a/src/test/isolation/expected/fk-deadlock2_2.out
--- b/src/test/isolation/expected/fk-deadlock2_2.out
***************
*** 1,110 ****
  Parsed test spec with 2 sessions
  
  starting permutation: s1u1 s1u2 s1c s2u1 s2u2 s2c
! step s1u1:  UPDATE A SET Col1 = 1 WHERE AID = 1; 
! step s1u2:  UPDATE B SET Col2 = 1 WHERE BID = 2; 
! step s1c:  COMMIT; 
! step s2u1:  UPDATE B SET Col2 = 1 WHERE BID = 2; 
! step s2u2:  UPDATE B SET Col2 = 1 WHERE BID = 2; 
! step s2c:  COMMIT; 
  
  starting permutation: s1u1 s1u2 s2u1 s1c s2u2 s2c
! step s1u1:  UPDATE A SET Col1 = 1 WHERE AID = 1; 
! step s1u2:  UPDATE B SET Col2 = 1 WHERE BID = 2; 
! step s2u1:  UPDATE B SET Col2 = 1 WHERE BID = 2;  <waiting ...>
! step s1c:  COMMIT; 
  step s2u1: <... completed>
  ERROR:  could not serialize access due to concurrent update
! step s2u2:  UPDATE B SET Col2 = 1 WHERE BID = 2; 
  ERROR:  current transaction is aborted, commands ignored until end of transaction block
! step s2c:  COMMIT; 
  
  starting permutation: s1u1 s2u1 s1u2 s2u2 s1c s2c
! step s1u1:  UPDATE A SET Col1 = 1 WHERE AID = 1; 
! step s2u1:  UPDATE B SET Col2 = 1 WHERE BID = 2; 
! step s1u2:  UPDATE B SET Col2 = 1 WHERE BID = 2;  <waiting ...>
! step s2u2:  UPDATE B SET Col2 = 1 WHERE BID = 2; 
  step s1u2: <... completed>
  ERROR:  deadlock detected
! step s1c:  COMMIT; 
! step s2c:  COMMIT; 
  
  starting permutation: s1u1 s2u1 s1u2 s2u2 s2c s1c
! step s1u1:  UPDATE A SET Col1 = 1 WHERE AID = 1; 
! step s2u1:  UPDATE B SET Col2 = 1 WHERE BID = 2; 
! step s1u2:  UPDATE B SET Col2 = 1 WHERE BID = 2;  <waiting ...>
! step s2u2:  UPDATE B SET Col2 = 1 WHERE BID = 2; 
  step s1u2: <... completed>
  ERROR:  deadlock detected
! step s2c:  COMMIT; 
! step s1c:  COMMIT; 
  
  starting permutation: s1u1 s2u1 s2u2 s1u2 s1c s2c
! step s1u1:  UPDATE A SET Col1 = 1 WHERE AID = 1; 
! step s2u1:  UPDATE B SET Col2 = 1 WHERE BID = 2; 
! step s2u2:  UPDATE B SET Col2 = 1 WHERE BID = 2;  <waiting ...>
! step s1u2:  UPDATE B SET Col2 = 1 WHERE BID = 2; 
  ERROR:  deadlock detected
  step s2u2: <... completed>
! step s1c:  COMMIT; 
! step s2c:  COMMIT; 
  
  starting permutation: s1u1 s2u1 s2u2 s1u2 s2c s1c
! step s1u1:  UPDATE A SET Col1 = 1 WHERE AID = 1; 
! step s2u1:  UPDATE B SET Col2 = 1 WHERE BID = 2; 
! step s2u2:  UPDATE B SET Col2 = 1 WHERE BID = 2;  <waiting ...>
! step s1u2:  UPDATE B SET Col2 = 1 WHERE BID = 2; 
  ERROR:  deadlock detected
  step s2u2: <... completed>
! step s2c:  COMMIT; 
! step s1c:  COMMIT; 
  
  starting permutation: s2u1 s1u1 s1u2 s2u2 s1c s2c
! step s2u1:  UPDATE B SET Col2 = 1 WHERE BID = 2; 
! step s1u1:  UPDATE A SET Col1 = 1 WHERE AID = 1; 
! step s1u2:  UPDATE B SET Col2 = 1 WHERE BID = 2;  <waiting ...>
! step s2u2:  UPDATE B SET Col2 = 1 WHERE BID = 2; 
  step s1u2: <... completed>
  ERROR:  deadlock detected
! step s1c:  COMMIT; 
! step s2c:  COMMIT; 
  
  starting permutation: s2u1 s1u1 s1u2 s2u2 s2c s1c
! step s2u1:  UPDATE B SET Col2 = 1 WHERE BID = 2; 
! step s1u1:  UPDATE A SET Col1 = 1 WHERE AID = 1; 
! step s1u2:  UPDATE B SET Col2 = 1 WHERE BID = 2;  <waiting ...>
! step s2u2:  UPDATE B SET Col2 = 1 WHERE BID = 2; 
  step s1u2: <... completed>
  ERROR:  deadlock detected
! step s2c:  COMMIT; 
! step s1c:  COMMIT; 
  
  starting permutation: s2u1 s1u1 s2u2 s1u2 s1c s2c
! step s2u1:  UPDATE B SET Col2 = 1 WHERE BID = 2; 
! step s1u1:  UPDATE A SET Col1 = 1 WHERE AID = 1; 
! step s2u2:  UPDATE B SET Col2 = 1 WHERE BID = 2;  <waiting ...>
! step s1u2:  UPDATE B SET Col2 = 1 WHERE BID = 2; 
  ERROR:  deadlock detected
  step s2u2: <... completed>
! step s1c:  COMMIT; 
! step s2c:  COMMIT; 
  
  starting permutation: s2u1 s1u1 s2u2 s1u2 s2c s1c
! step s2u1:  UPDATE B SET Col2 = 1 WHERE BID = 2; 
! step s1u1:  UPDATE A SET Col1 = 1 WHERE AID = 1; 
! step s2u2:  UPDATE B SET Col2 = 1 WHERE BID = 2;  <waiting ...>
! step s1u2:  UPDATE B SET Col2 = 1 WHERE BID = 2; 
  ERROR:  deadlock detected
  step s2u2: <... completed>
! step s2c:  COMMIT; 
! step s1c:  COMMIT; 
  
  starting permutation: s2u1 s2u2 s1u1 s2c s1u2 s1c
! step s2u1:  UPDATE B SET Col2 = 1 WHERE BID = 2; 
! step s2u2:  UPDATE B SET Col2 = 1 WHERE BID = 2; 
! step s1u1:  UPDATE A SET Col1 = 1 WHERE AID = 1;  <waiting ...>
! step s2c:  COMMIT; 
  step s1u1: <... completed>
! step s1u2:  UPDATE B SET Col2 = 1 WHERE BID = 2; 
  ERROR:  could not serialize access due to concurrent update
! step s1c:  COMMIT; 
--- 1,110 ----
  Parsed test spec with 2 sessions
  
  starting permutation: s1u1 s1u2 s1c s2u1 s2u2 s2c
! step s1u1: UPDATE A SET Col1 = 1 WHERE AID = 1;
! step s1u2: UPDATE B SET Col2 = 1 WHERE BID = 2;
! step s1c: COMMIT;
! step s2u1: UPDATE B SET Col2 = 1 WHERE BID = 2;
! step s2u2: UPDATE B SET Col2 = 1 WHERE BID = 2;
! step s2c: COMMIT;
  
  starting permutation: s1u1 s1u2 s2u1 s1c s2u2 s2c
! step s1u1: UPDATE A SET Col1 = 1 WHERE AID = 1;
! step s1u2: UPDATE B SET Col2 = 1 WHERE BID = 2;
! step s2u1: UPDATE B SET Col2 = 1 WHERE BID = 2; <waiting ...>
! step s1c: COMMIT;
  step s2u1: <... completed>
  ERROR:  could not serialize access due to concurrent update
! step s2u2: UPDATE B SET Col2 = 1 WHERE BID = 2;
  ERROR:  current transaction is aborted, commands ignored until end of transaction block
! step s2c: COMMIT;
  
  starting permutation: s1u1 s2u1 s1u2 s2u2 s1c s2c
! step s1u1: UPDATE A SET Col1 = 1 WHERE AID = 1;
! step s2u1: UPDATE B SET Col2 = 1 WHERE BID = 2;
! step s1u2: UPDATE B SET Col2 = 1 WHERE BID = 2; <waiting ...>
! step s2u2: UPDATE B SET Col2 = 1 WHERE BID = 2;
  step s1u2: <... completed>
  ERROR:  deadlock detected
! step s1c: COMMIT;
! step s2c: COMMIT;
  
  starting permutation: s1u1 s2u1 s1u2 s2u2 s2c s1c
! step s1u1: UPDATE A SET Col1 = 1 WHERE AID = 1;
! step s2u1: UPDATE B SET Col2 = 1 WHERE BID = 2;
! step s1u2: UPDATE B SET Col2 = 1 WHERE BID = 2; <waiting ...>
! step s2u2: UPDATE B SET Col2 = 1 WHERE BID = 2;
  step s1u2: <... completed>
  ERROR:  deadlock detected
! step s2c: COMMIT;
! step s1c: COMMIT;
  
  starting permutation: s1u1 s2u1 s2u2 s1u2 s1c s2c
! step s1u1: UPDATE A SET Col1 = 1 WHERE AID = 1;
! step s2u1: UPDATE B SET Col2 = 1 WHERE BID = 2;
! step s2u2: UPDATE B SET Col2 = 1 WHERE BID = 2; <waiting ...>
! step s1u2: UPDATE B SET Col2 = 1 WHERE BID = 2;
  ERROR:  deadlock detected
  step s2u2: <... completed>
! step s1c: COMMIT;
! step s2c: COMMIT;
  
  starting permutation: s1u1 s2u1 s2u2 s1u2 s2c s1c
! step s1u1: UPDATE A SET Col1 = 1 WHERE AID = 1;
! step s2u1: UPDATE B SET Col2 = 1 WHERE BID = 2;
! step s2u2: UPDATE B SET Col2 = 1 WHERE BID = 2; <waiting ...>
! step s1u2: UPDATE B SET Col2 = 1 WHERE BID = 2;
  ERROR:  deadlock detected
  step s2u2: <... completed>
! step s2c: COMMIT;
! step s1c: COMMIT;
  
  starting permutation: s2u1 s1u1 s1u2 s2u2 s1c s2c
! step s2u1: UPDATE B SET Col2 = 1 WHERE BID = 2;
! step s1u1: UPDATE A SET Col1 = 1 WHERE AID = 1;
! step s1u2: UPDATE B SET Col2 = 1 WHERE BID = 2; <waiting ...>
! step s2u2: UPDATE B SET Col2 = 1 WHERE BID = 2;
  step s1u2: <... completed>
  ERROR:  deadlock detected
! step s1c: COMMIT;
! step s2c: COMMIT;
  
  starting permutation: s2u1 s1u1 s1u2 s2u2 s2c s1c
! step s2u1: UPDATE B SET Col2 = 1 WHERE BID = 2;
! step s1u1: UPDATE A SET Col1 = 1 WHERE AID = 1;
! step s1u2: UPDATE B SET Col2 = 1 WHERE BID = 2; <waiting ...>
! step s2u2: UPDATE B SET Col2 = 1 WHERE BID = 2;
  step s1u2: <... completed>
  ERROR:  deadlock detected
! step s2c: COMMIT;
! step s1c: COMMIT;
  
  starting permutation: s2u1 s1u1 s2u2 s1u2 s1c s2c
! step s2u1: UPDATE B SET Col2 = 1 WHERE BID = 2;
! step s1u1: UPDATE A SET Col1 = 1 WHERE AID = 1;
! step s2u2: UPDATE B SET Col2 = 1 WHERE BID = 2; <waiting ...>
! step s1u2: UPDATE B SET Col2 = 1 WHERE BID = 2;
  ERROR:  deadlock detected
  step s2u2: <... completed>
! step s1c: COMMIT;
! step s2c: COMMIT;
  
  starting permutation: s2u1 s1u1 s2u2 s1u2 s2c s1c
! step s2u1: UPDATE B SET Col2 = 1 WHERE BID = 2;
! step s1u1: UPDATE A SET Col1 = 1 WHERE AID = 1;
! step s2u2: UPDATE B SET Col2 = 1 WHERE BID = 2; <waiting ...>
! step s1u2: UPDATE B SET Col2 = 1 WHERE BID = 2;
  ERROR:  deadlock detected
  step s2u2: <... completed>
! step s2c: COMMIT;
! step s1c: COMMIT;
  
  starting permutation: s2u1 s2u2 s1u1 s2c s1u2 s1c
! step s2u1: UPDATE B SET Col2 = 1 WHERE BID = 2;
! step s2u2: UPDATE B SET Col2 = 1 WHERE BID = 2;
! step s1u1: UPDATE A SET Col1 = 1 WHERE AID = 1; <waiting ...>
! step s2c: COMMIT;
  step s1u1: <... completed>
! step s1u2: UPDATE B SET Col2 = 1 WHERE BID = 2;
  ERROR:  could not serialize access due to concurrent update
! step s1c: COMMIT;
*** a/src/test/isolation/expected/fk-deadlock_1.out
--- b/src/test/isolation/expected/fk-deadlock_1.out
***************
*** 1,71 ****
  Parsed test spec with 2 sessions
  
  starting permutation: s1i s1u s1c s2i s2u s2c
! step s1i:  INSERT INTO child VALUES (1, 1); 
! step s1u:  UPDATE parent SET aux = 'bar'; 
! step s1c:  COMMIT; 
! step s2i:  INSERT INTO child VALUES (2, 1); 
! step s2u:  UPDATE parent SET aux = 'baz'; 
! step s2c:  COMMIT; 
  
  starting permutation: s1i s1u s2i s1c s2u s2c
! step s1i:  INSERT INTO child VALUES (1, 1); 
! step s1u:  UPDATE parent SET aux = 'bar'; 
! step s2i:  INSERT INTO child VALUES (2, 1);  <waiting ...>
! step s1c:  COMMIT; 
  step s2i: <... completed>
  ERROR:  could not serialize access due to concurrent update
! step s2u:  UPDATE parent SET aux = 'baz'; 
  ERROR:  current transaction is aborted, commands ignored until end of transaction block
! step s2c:  COMMIT; 
  
  starting permutation: s1i s2i s1u s2u s1c s2c
! step s1i:  INSERT INTO child VALUES (1, 1); 
! step s2i:  INSERT INTO child VALUES (2, 1); 
! step s1u:  UPDATE parent SET aux = 'bar';  <waiting ...>
! step s2u:  UPDATE parent SET aux = 'baz'; 
  step s1u: <... completed>
  ERROR:  deadlock detected
! step s1c:  COMMIT; 
! step s2c:  COMMIT; 
  
  starting permutation: s1i s2i s2u s1u s2c s1c
! step s1i:  INSERT INTO child VALUES (1, 1); 
! step s2i:  INSERT INTO child VALUES (2, 1); 
! step s2u:  UPDATE parent SET aux = 'baz';  <waiting ...>
! step s1u:  UPDATE parent SET aux = 'bar'; 
  ERROR:  deadlock detected
  step s2u: <... completed>
! step s2c:  COMMIT; 
! step s1c:  COMMIT; 
  
  starting permutation: s2i s1i s1u s2u s1c s2c
! step s2i:  INSERT INTO child VALUES (2, 1); 
! step s1i:  INSERT INTO child VALUES (1, 1); 
! step s1u:  UPDATE parent SET aux = 'bar';  <waiting ...>
! step s2u:  UPDATE parent SET aux = 'baz'; 
  step s1u: <... completed>
  ERROR:  deadlock detected
! step s1c:  COMMIT; 
! step s2c:  COMMIT; 
  
  starting permutation: s2i s1i s2u s1u s2c s1c
! step s2i:  INSERT INTO child VALUES (2, 1); 
! step s1i:  INSERT INTO child VALUES (1, 1); 
! step s2u:  UPDATE parent SET aux = 'baz';  <waiting ...>
! step s1u:  UPDATE parent SET aux = 'bar'; 
  ERROR:  deadlock detected
  step s2u: <... completed>
! step s2c:  COMMIT; 
! step s1c:  COMMIT; 
  
  starting permutation: s2i s2u s1i s2c s1u s1c
! step s2i:  INSERT INTO child VALUES (2, 1); 
! step s2u:  UPDATE parent SET aux = 'baz'; 
! step s1i:  INSERT INTO child VALUES (1, 1);  <waiting ...>
! step s2c:  COMMIT; 
  step s1i: <... completed>
  ERROR:  could not serialize access due to concurrent update
! step s1u:  UPDATE parent SET aux = 'bar'; 
  ERROR:  current transaction is aborted, commands ignored until end of transaction block
! step s1c:  COMMIT; 
--- 1,71 ----
  Parsed test spec with 2 sessions
  
  starting permutation: s1i s1u s1c s2i s2u s2c
! step s1i: INSERT INTO child VALUES (1, 1);
! step s1u: UPDATE parent SET aux = 'bar';
! step s1c: COMMIT;
! step s2i: INSERT INTO child VALUES (2, 1);
! step s2u: UPDATE parent SET aux = 'baz';
! step s2c: COMMIT;
  
  starting permutation: s1i s1u s2i s1c s2u s2c
! step s1i: INSERT INTO child VALUES (1, 1);
! step s1u: UPDATE parent SET aux = 'bar';
! step s2i: INSERT INTO child VALUES (2, 1); <waiting ...>
! step s1c: COMMIT;
  step s2i: <... completed>
  ERROR:  could not serialize access due to concurrent update
! step s2u: UPDATE parent SET aux = 'baz';
  ERROR:  current transaction is aborted, commands ignored until end of transaction block
! step s2c: COMMIT;
  
  starting permutation: s1i s2i s1u s2u s1c s2c
! step s1i: INSERT INTO child VALUES (1, 1);
! step s2i: INSERT INTO child VALUES (2, 1);
! step s1u: UPDATE parent SET aux = 'bar'; <waiting ...>
! step s2u: UPDATE parent SET aux = 'baz';
  step s1u: <... completed>
  ERROR:  deadlock detected
! step s1c: COMMIT;
! step s2c: COMMIT;
  
  starting permutation: s1i s2i s2u s1u s2c s1c
! step s1i: INSERT INTO child VALUES (1, 1);
! step s2i: INSERT INTO child VALUES (2, 1);
! step s2u: UPDATE parent SET aux = 'baz'; <waiting ...>
! step s1u: UPDATE parent SET aux = 'bar';
  ERROR:  deadlock detected
  step s2u: <... completed>
! step s2c: COMMIT;
! step s1c: COMMIT;
  
  starting permutation: s2i s1i s1u s2u s1c s2c
! step s2i: INSERT INTO child VALUES (2, 1);
! step s1i: INSERT INTO child VALUES (1, 1);
! step s1u: UPDATE parent SET aux = 'bar'; <waiting ...>
! step s2u: UPDATE parent SET aux = 'baz';
  step s1u: <... completed>
  ERROR:  deadlock detected
! step s1c: COMMIT;
! step s2c: COMMIT;
  
  starting permutation: s2i s1i s2u s1u s2c s1c
! step s2i: INSERT INTO child VALUES (2, 1);
! step s1i: INSERT INTO child VALUES (1, 1);
! step s2u: UPDATE parent SET aux = 'baz'; <waiting ...>
! step s1u: UPDATE parent SET aux = 'bar';
  ERROR:  deadlock detected
  step s2u: <... completed>
! step s2c: COMMIT;
! step s1c: COMMIT;
  
  starting permutation: s2i s2u s1i s2c s1u s1c
! step s2i: INSERT INTO child VALUES (2, 1);
! step s2u: UPDATE parent SET aux = 'baz';
! step s1i: INSERT INTO child VALUES (1, 1); <waiting ...>
! step s2c: COMMIT;
  step s1i: <... completed>
  ERROR:  could not serialize access due to concurrent update
! step s1u: UPDATE parent SET aux = 'bar';
  ERROR:  current transaction is aborted, commands ignored until end of transaction block
! step s1c: COMMIT;
#11Alvaro Herrera
alvherre@commandprompt.com
In reply to: Kevin Grittner (#10)
Re: SSI 2PC coverage

Excerpts from Kevin Grittner's message of mar ago 23 15:07:33 -0300 2011:

Heikki Linnakangas <heikki.linnakangas@enterprisedb.com> wrote:

I did change the lexer slightly, to trim whitespace from the
beginning and end of SQL blocks. This cuts the size of expected
output a bit, and makes it look nicer anyway.

OK. You missed the alternative outputs for a couple files. These
are needed to get successful tests with
default_transaction_isolation = 'serializable' or 'repeatable read'.
Patch attached.

Thanks, applied.

--
Álvaro Herrera <alvherre@commandprompt.com>
The PostgreSQL Company - Command Prompt, Inc.
PostgreSQL Replication, Consulting, Custom Development, 24x7 support

#12Alvaro Herrera
alvherre@commandprompt.com
In reply to: Heikki Linnakangas (#7)
Re: SSI 2PC coverage

Excerpts from Heikki Linnakangas's message of jue ago 18 09:57:34 -0400 2011:

Committed. I removed the second expected output file, and marked the
prepared-transactions tests in the schedule as "ignore" instead. That
way if max_prepared_transactions=0, you get a notice that the test case
failed, but pg_regress still returns 0 as exit status.

After having to play with this, I didn't like it very much, because
regression.diffs gets spammed with the (rather massive and completely
useless) diff in that test. For the xml tests, rather than ignoring it
fail on an installation without libxml, we use an alternative output.

Unless there are objections, I will commit the alternative file proposed
by Dan.

--
Álvaro Herrera <alvherre@commandprompt.com>
The PostgreSQL Company - Command Prompt, Inc.
PostgreSQL Replication, Consulting, Custom Development, 24x7 support

#13Tom Lane
tgl@sss.pgh.pa.us
In reply to: Alvaro Herrera (#12)
Re: SSI 2PC coverage

Alvaro Herrera <alvherre@commandprompt.com> writes:

After having to play with this, I didn't like it very much, because
regression.diffs gets spammed with the (rather massive and completely
useless) diff in that test. For the xml tests, rather than ignoring it
fail on an installation without libxml, we use an alternative output.

Unless there are objections, I will commit the alternative file proposed
by Dan.

+1 ... "ignore" is a pretty ugly hack here.

Eventually we need some way of detecting that specific tests should be
skipped because they're irrelevant to the current system configuration.
contrib/sepgsql is already doing something of the sort, but it's rather
crude ...

regards, tom lane

#14Robert Haas
robertmhaas@gmail.com
In reply to: Tom Lane (#13)
Re: SSI 2PC coverage

On Wed, Aug 24, 2011 at 9:11 PM, Tom Lane <tgl@sss.pgh.pa.us> wrote:

Alvaro Herrera <alvherre@commandprompt.com> writes:

After having to play with this, I didn't like it very much, because
regression.diffs gets spammed with the (rather massive and completely
useless) diff in that test.  For the xml tests, rather than ignoring it
fail on an installation without libxml, we use an alternative output.

Unless there are objections, I will commit the alternative file proposed
by Dan.

+1 ... "ignore" is a pretty ugly hack here.

Eventually we need some way of detecting that specific tests should be
skipped because they're irrelevant to the current system configuration.
contrib/sepgsql is already doing something of the sort, but it's rather
crude ...

I'm fairly unhappy with the fact that we don't have a better way of
deciding whether we should even *build* sepgsql. The --with-selinux
flag basically doesn't do anything except enable the compile of that
contrib module, and that's kind of a lame use of a configure flag.

Not that I have a better idea...

--
Robert Haas
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

#15Alvaro Herrera
alvherre@commandprompt.com
In reply to: Tom Lane (#13)
Re: SSI 2PC coverage

Excerpts from Tom Lane's message of mié ago 24 22:11:58 -0300 2011:

Alvaro Herrera <alvherre@commandprompt.com> writes:

After having to play with this, I didn't like it very much, because
regression.diffs gets spammed with the (rather massive and completely
useless) diff in that test. For the xml tests, rather than ignoring it
fail on an installation without libxml, we use an alternative output.

Unless there are objections, I will commit the alternative file proposed
by Dan.

+1 ... "ignore" is a pretty ugly hack here.

Done.

--
Álvaro Herrera <alvherre@commandprompt.com>
The PostgreSQL Company - Command Prompt, Inc.
PostgreSQL Replication, Consulting, Custom Development, 24x7 support