[Rt-devel] Memory 'leak' in Ticket/Display.html

Curtis Bruneau curtisb at vianet.ca
Thu Jul 23 09:37:56 EDT 2009


I also have this issue but have worked around it by keeping the searches 
small. We have a lot of tickets and large searches will basically have 
apache grow until it runs out of memory after you click display. I have 
reported it before but wasn't able to detail it like this, hopefully 
there is a workable solution for it.

Bram wrote:
> Hi,
>
>
> When a large search is done and the user clicks the link to display  
> the ticket then apache starts using a lot more memory.
> This is due to a memory 'leak' in share/html/Ticket/Display.html:
>
> http://github.com/bestpractical/rt/blob/90546414c8887e344f995da5f20f53a58939bbd8/share/html/Ticket/Display.html
> lines 200-206:
>
> if (defined $session{'tickets'} and ($ARGS{'Query'} or  
> $session{'CurrentSearchHash'}->{'Query'})) {
>      my $item_map = $session{'tickets'}->ItemMap;
>      $link_rel{first} = "Ticket/Display.html?id=" . $item_map->{first}  
>                 if $item_map->{$TicketObj->Id}{prev};
>      $link_rel{prev}  = "Ticket/Display.html?id=" .  
> $item_map->{$TicketObj->Id}{prev} if $item_map->{$TicketObj->Id}{prev};
>      $link_rel{next}  = "Ticket/Display.html?id=" .  
> $item_map->{$TicketObj->Id}{next} if $item_map->{$TicketObj->Id}{next};
>      $link_rel{last}  = "Ticket/Display.html?id=" . $item_map->{last}   
>                 if $item_map->{$TicketObj->Id}{next};
> }
>
>
> This code will execute the query in $session{'tickets'} and store the  
> results of the search in $session{'tickets'}->....
> Meaning: the session object now contains the query + the results of  
> the search. Which obviously results in a lot higher memory usage when  
> the search is large.
>
> (When I run a search which returns 13000 tickets apache jumps from  
> 40/60 mb of memory to 200mb of memory.
> Since it is in the session it also means every later request from the  
> same session will result in another process using 200mb of memory.)
>
>
> I modified the code a bit and added Dumper($session{tickets});
> I then did a search for 2 tickets. (truncated Dumper output at the end).
>
> A (truncated) diff from the dumper output:
>
> (- is before, + is after)
> -                 'must_redo_search' => 1,
> +                 'must_redo_search' => 0,
>
> +                 'items_array' => [],
>
> +                 'dbix_sb_unique_cache' => {
> +                                             '37737' => 1,
> +                                             '39447' => 1
> +                                           },
>
> +                 'item_map' => {
> +                                 '37737' => {
> +                                            'next' => '39447',
> +                                            'prev' => 0,
> +                                            'defined' => 1
> +                                          },
> +                                 'first' => '37737',
> +                                 '39447' => {
> +                                              'prev' => '37737',
> +                                              'defined' => 1
> +                                            },
> +                                 'last' => '39447'
> +                               },
>
> +                 'items' => [
> +                              bless( {
> +                                       '_Class' => 'RT::Ticket',
> +                                       'original_user' => undef,
> +                                        
> '_SB_Record_Primary_RecordCache_key' => 'id=37737',
> +                                       'user' => $VAR1->{'user'},
> +                                       'table' => 'Tickets',
> +                                       'values' => {
> +                                                      # [snipped]
> +                                                   },
> +                                       'fetched' => {
> +                                                      # [snipped]
> +                                                    }
> +                                     }, 'RT::Ticket' ),
> +                              bless( {
> +                                       '_Class' => 'RT::Ticket',
> +                                       'original_user' => undef,
> +                                        
> '_SB_Record_Primary_RecordCache_key' => 'id=39447',
> +                                       'user' => $VAR1->{'user'},
> +                                       'table' => 'Tickets',
> +                                       'values' => {
> +                                                      # [snipped]
> +                                                   },
> +                                       'fetched' => {
> +                                                      # [snipped]
> +                                     }, 'RT::Ticket' )
> +                            ]
>
>
> This means that after the display it contains extra data in items,  
> item_map and dbix_sb_unique_cache.
> Clearing items is simple and can be done by adding:
>      $session{'tickets'}->PrepForSerialization();
>
> in the code (which is what Search/Results.html calls).
>
>
> But that still leaves item_map and dbix_sb_unique_cache in the session.
> Any advice on clearing those?
>
>
> Best regards,
>
> Bram
>
>
>
> (Truncated) Dumper output:
>
> [Thu Jul 23 12:49:59 2009] [info]: BEFORE  
> (/opt/rt3/local/html/Ticket/Display.html:223)
> [Thu Jul 23 12:49:59 2009] [info]: $VAR1 = bless( {
>                   '_open_parens' => {},
>                   'alias_count' => 0,
>                   'table' => 'Tickets',
>                   'where_clause' => '',
>                   'order_by' => [
>                                   {
>                                     'FIELD' => 'id',
>                                     'ORDER' => 'ASC'
>                                   }
>                                 ],
>                   'RecalcTicketLimits' => 0,
>                   '_sql_trattachalias' => undef,
>                   '_sql_object_cfv_alias' => undef,
>                   'is_limited' => 1,
>                   'order' => '',
>                   '_sql_watcher_join_users_alias' => undef,
>                   'user' => bless( {
>                                      # [ snipped ]
>                                    }, 'RT::CurrentUser' ),
>                   'restriction_index' => 1,
>                   '_sql_query' => 'id = 37737 OR id = 39447',
>                   '_sql_transalias' => undef,
>                   'DBIxHandle' => bless( {
>                                            'dsn' =>  
> 'dbi:Pg:dbname=ayuda;host=db',
>                                            'StatementLog' => [],
>                                            'DisconnectHandleOnDestroy' => undef
>                                          }, 'RT::Handle' ),
>                   'limit_clause' => '',
>                   'restrictions' => {
>                                       'main.Status' => [
>                                                          {
>                                                            'value' =>  
> '\'deleted\'',
>                                                            'field' =>  
> 'main.Status',
>                                                            'op' => '!='
>                                                          }
>                                                        ],
>                                       'ticketsql' => [
>                                                        {
>                                                          'value' =>  
> '\'37737\'',
>                                                          'field' => 'main.id',
>                                                          'op' => '='
>                                                        },
>                                                        'OR',
>                                                        {
>                                                          'value' =>  
> '\'39447\'',
>                                                          'field' => 'main.id',
>                                                          'op' => '='
>                                                        }
>                                                      ],
>                                       'main.EffectiveId' => [
>                                                               {
>                                                                  
> 'value' => 'main.id',
>                                                                  
> 'field' => 'main.EffectiveId',
>                                                                 'op' => '='
>                                                               }
>                                                             ],
>                                       'main.Type' => [
>                                                        {
>                                                          'value' =>  
> '\'ticket\'',
>                                                          'field' =>  
> 'main.Type',
>                                                          'op' => '='
>                                                        }
>                                                      ]
>                                     },
>                   'primary_key' => 'id',
>                   'count_all' => '2',
>                   'must_redo_search' => 1,
>                   'looking_at_effective_id' => 0,
>                   'itemscount' => 0,
>                   'show_rows' => 0,
>                   '_sql_cf_alias' => undef,
>                   'left_joins' => {},
>                   'aliases' => [],
>                   'subclauses' => {
>                                     'generic_restrictions' =>  
> '(main.Status != \'deleted\') AND (main.id = \'37737\' OR main.id =  
> \'39447\') AND (main.Type = \'ticket\') AND (main.EffectiveId =  
> main.id)'
>                                   },
>                   'first_row' => 0,
>                   'looking_at_type' => 0,
>                   '_sql_looking_at' => {
>                                          'id' => 1
>                                        }
>                 }, 'RT::Tickets' );  
> (/opt/rt3/local/html/Ticket/Display.html:224)
>
>
> [Thu Jul 23 12:50:00 2009] [info]: AFTER  
> (/opt/rt3/local/html/Ticket/Display.html:233)
> [Thu Jul 23 12:50:00 2009] [info]: $VAR1 = bless( {
>                   '_open_parens' => {},
>                   'table' => 'Tickets',
>                   '_sql_trattachalias' => undef,
>                   '_sql_object_cfv_alias' => undef,
>                   'is_limited' => 1,
>                   'order' => '',
>                   '_sql_watcher_join_users_alias' => undef,
>                   'user' => bless( {
>                                      # [ snipped ]
>                                    }, 'RT::CurrentUser' ),
>                   '_sql_query' => 'id = 37737 OR id = 39447',
>                   'restrictions' => {
>                                       'main.Status' => [
>                                                          {
>                                                            'value' =>  
> '\'deleted\'',
>                                                            'field' =>  
> 'main.Status',
>                                                            'op' => '!='
>                                                          }
>                                                        ],
>                                       'ticketsql' => [
>                                                        {
>                                                          'value' =>  
> '\'37737\'',
>                                                          'field' => 'main.id',
>                                                          'op' => '='
>                                                        },
>                                                        'OR',
>                                                        {
>                                                          'value' =>  
> '\'39447\'',
>                                                          'field' => 'main.id',
>                                                          'op' => '='
>                                                        }
>                                                      ],
>                                       'main.EffectiveId' => [
>                                                               {
>                                                                  
> 'value' => 'main.id',
>                                                                  
> 'field' => 'main.EffectiveId',
>                                                                 'op' => '='
>                                                               }
>                                                             ],
>                                       'main.Type' => [
>                                                        {
>                                                          'value' =>  
> '\'ticket\'',
>                                                          'field' =>  
> 'main.Type',
>                                                          'op' => '='
>                                                        }
>                                                      ]
>                                     },
>                   'primary_key' => 'id',
>                   'count_all' => '2',
>                   'items_array' => [],
>                   'must_redo_search' => 0,
>                   'looking_at_effective_id' => 0,
>                   'subclauses' => {
>                                     'generic_restrictions' =>  
> '(main.Status != \'deleted\') AND (main.id = \'37737\' OR main.id =  
> \'39447\') AND (main.EffectiveId = main.id) AND (main.Type =  
> \'ticket\')'
>                                   },
>                   '_sql_looking_at' => {
>                                          'id' => 1
>                                        },
>                   'alias_count' => 0,
>                   'dbix_sb_unique_cache' => {
>                                               '37737' => 1,
>                                               '39447' => 1
>                                             },
>                   'order_by' => [
>                                   {
>                                     'FIELD' => 'id',
>                                     'ORDER' => 'ASC'
>                                   }
>                                 ],
>                   'where_clause' => '',
>                   'RecalcTicketLimits' => 0,
>                   '_sql_transalias' => undef,
>                   'restriction_index' => 1,
>                   'item_map' => {
>                                   '37737' => {
>                                              'next' => '39447',
>                                              'prev' => 0,
>                                              'defined' => 1
>                                            },
>                                   'first' => '37737',
>                                   '39447' => {
>                                                'prev' => '37737',
>                                                'defined' => 1
>                                              },
>                                   'last' => '39447'
>                                 },
>                   'limit_clause' => '',
>                   'DBIxHandle' => bless( {
>                                            'dsn' =>  
> 'dbi:Pg:dbname=ayuda;host=db',
>                                            'StatementLog' => [],
>                                            'DisconnectHandleOnDestroy' => undef
>                                          }, 'RT::Handle' ),
>                   'itemscount' => 0,
>                   '_sql_cf_alias' => undef,
>                   'show_rows' => 0,
>                   'left_joins' => {},
>                   'aliases' => [],
>                   'first_row' => 0,
>                   'looking_at_type' => 0,
>                   'items' => [
>                                bless( {
>                                         '_Class' => 'RT::Ticket',
>                                         'original_user' => undef,
>                                          
> '_SB_Record_Primary_RecordCache_key' => 'id=37737',
>                                         'user' => $VAR1->{'user'},
>                                         'table' => 'Tickets',
>                                         'values' => {
>                                                       # [snipped]
>                                                     },
>                                         'fetched' => {
>                                                       # [snipped]
>                                                      }
>                                       }, 'RT::Ticket' ),
>                                bless( {
>                                         '_Class' => 'RT::Ticket',
>                                         'original_user' => undef,
>                                          
> '_SB_Record_Primary_RecordCache_key' => 'id=39447',
>                                         'user' => $VAR1->{'user'},
>                                         'table' => 'Tickets',
>                                         'values' => {
>                                                       # [snipped]
>                                                     },
>                                         'fetched' => {
>                                                       # [snipped]
>                                                      }
>                                       }, 'RT::Ticket' )
>                              ]
>                 }, 'RT::Tickets' );  
> (/opt/rt3/local/html/Ticket/Display.html:234)
>
>
>
> _______________________________________________
> List info: http://lists.bestpractical.com/cgi-bin/mailman/listinfo/rt-devel
>
>
>   



More information about the Rt-devel mailing list