Loading ...
Sorry, an error occurred while loading the content.

some children not returning newly-inserted data

Expand Messages
  • Dave Boodman
    Hi, I m seeing an issue where I do an insert and upon subsequent requests, certain children are not returning the newly-inserted data (row), while others are.
    Message 1 of 7 , May 1, 2004
    • 0 Attachment
      Hi,

      I'm seeing an issue where I do an insert and upon subsequent requests,
      certain children are not returning the newly-inserted data (row), while
      others are. Restarting apache fixes this as does waiting for some length of
      time.
      I'm obviously not running -X nor do I want to (or should I have to).

      Here's the vitals:

      Apache/1.3.29 (Unix) with mod_perl as a DSO module.
      Apache::DBI (loaded first)
      Class::DBI
      autocommit=0
      mysql 4.1.1-alpha
      template toolkit

      Your help and time are greatly appreciated.

      -Dave


      --
      Report problems: http://perl.apache.org/bugs/
      Mail list info: http://perl.apache.org/maillist/modperl.html
      List etiquette: http://perl.apache.org/maillist/email-etiquette.html
    • Perrin Harkins
      ... Sounds like you have a scoping problem. You are probably accidentally creating a closure somewhere that is holding onto old values. If you can reduce
      Message 2 of 7 , May 1, 2004
      • 0 Attachment
        Dave Boodman wrote:
        > I'm seeing an issue where I do an insert and upon subsequent requests,
        > certain children are not returning the newly-inserted data (row), while
        > others are. Restarting apache fixes this as does waiting for some length
        > of time.

        Sounds like you have a scoping problem. You are probably accidentally
        creating a closure somewhere that is holding onto old values. If you
        can reduce your code down to an example small enough to post here, we
        can try to spot it for you.

        - Perrin

        --
        Report problems: http://perl.apache.org/bugs/
        Mail list info: http://perl.apache.org/maillist/modperl.html
        List etiquette: http://perl.apache.org/maillist/email-etiquette.html
      • Dave Boodman
        OK, here s some code: # systems my @statuses; my (@systems) = Lib::Systems- search( cid = $cid ); unless (@systems) { $self- model- log ( debug , systems
        Message 3 of 7 , May 1, 2004
        • 0 Attachment
          OK, here's some code:

              # systems
              my @statuses;
              my (@systems) = Lib::Systems->search( cid => $cid );
              unless (@systems) { $self->model->log(
          'debug', "systems for '$cid' not found"); $self->context->throw( 'systems.not_found', 'Systems not found' ); };
              my $systems_profile = Lib::Profiles->system;
              foreach my $sys (@systems) {
                 
          # reassign params from form names
                  my %tmp = map { $_ => $params{$_.'_'.$sys->sysid} } Lib::Systems->columns;
                  my ($data, $errors) = $self->model->validate($systems_profile, \%tmp);
                  if (@$errors) {
                      $self->context->throw(
          'required', { fields => [@$errors] } );
                  } else {
                      my (@relen_ips, @add_ips);
                     
          # establish status
                      my $status = 1;
                      if ($sys->cancel_date) { $status = 3; }
                      if ($sys->stop_date) { $status = 9; }

                     
          # process a change in status
                      my $newstatus;
                      if ($sys->cancel_date < 1 && $tmp{
          'cancel_date'}) {
                          $self->model->log(
          'info', 'cancelling system '.$sys->sysid);
                          $newstatus = 3;
                          $status = 3;
                      }
                      if ($sys->stop_date < 1 && $tmp{
          'stop_date'}) {
                          $self->model->log(
          'info', 'stopping system '.$sys->sysid);
                          $newstatus = 9;               
                          $status = 9;               
                      }

                     
          # store status so we can look at all and determine a cust status
                      push @statuses, $status;

                     
          # if status 9, add existing system's IPs to relen list
                      if ($newstatus == 9) {
                          my @ipobj = Lib::Ipmap->search( sysid => $sys->sysid, status => 1 );
                          foreach (@ipobj) { push @relen_ips, $_->ip; }
                      }

                      $self->model->log(
          'info', "updating values for system ".$sys->sysid);
                      while (my($key, $value) = each %$data) {
                         
          # we add this next line in case the client sends extra
                          # fields which we don't want to update. like the web
                          # client does
                          next unless ( Lib::Systems->find_column( $key ) );
                          $self->model->log(
          'info', "setting $key to $value" );

                          eval { $sys->$key( $value ) };
                          if ($@) { $self->context->throw(
          'set value', $@ ); }
                      }
          # end while
                      push @toupdate, $sys;

                     
          # IPs
                      # add new
                      if ($params{'ip_'.$sys->sysid.'_new'}) {
                          my $assign_date = $self->model->{
          'time'}->ymd;
                          my $relen_date = 0;
             
          # REMOVE WHEN WE GO LIVE AND ALL 2nd SYSTEMS ARE ADDED TO RECORDS #
                          $assign_date = $sys->start_date;
             
          # END REMOVE #
                          # if stopping server at same time assigning new ips
                          # we assume they were supposed to be there all the time so we set
                          # assign date to sys start date. also, set relen_date
                          if ($newstatus == 9) { $assign_date = $sys->start_date; $relen_date = $self->model->{'time'}->ymd; }
                          push @toupdate, update_ip($self, $sys->sysid, $cid, $assign_date, $relen_date, split /[\s\,]/, $params{
          'ip_'.$sys->sysid.'_new'});
                          $self->model->set(
          'ip_'.$sys->sysid.'_new','');
                      }
          # end new ip if

                      # get rid of ips
                      my $relen_date = $self->model->{'time'}->ymd;
                      push @relen_ips, $self->model->input(
          'ip_'.$sys->sysid);
                      push @toupdate, update_ip($self, $sys->sysid, $cid, undef, $relen_date, @relen_ips);
                  }
          # end update sys else
              } # end sys foreach

          ---SNIP---

              # process updates
              foreach my $obj (@toupdate) {
                  $self->model->log(
          'info', "updating obj:");
                  $self->model->log_dumper(
          'info', $obj);
                  eval { $obj->update };
                  if ($@) {
                      $self->model->log(
          'info', 'update failed, rolling back');
                      foreach my $o (@created) { $o->dbi_rollback; }
                      $self->context->throw(
          'update', $@ );
                  } else {
                      push @created, $obj;
                  }
              }

             
          # if we made it this far, commit everything
              foreach my $obj (@toupdate) { $obj->dbi_commit; }
             
              $self->model->set(
          'addsystem','');
              $self->model->set(
          'addcontact','');
              $self->model->set(
          'do_update','');
              return;

          Thanks!
          At 03:40 PM 5/1/2004, Perrin Harkins wrote:
          Dave Boodman wrote:
          I'm seeing an issue where I do an insert and upon subsequent requests, certain children are not returning the newly-inserted data (row), while others are. Restarting apache fixes this as does waiting for some length of time.

          Sounds like you have a scoping problem.  You are probably accidentally creating a closure somewhere that is holding onto old values.  If you can reduce your code down to an example small enough to post here, we can try to spot it for you.

          - Perrin
          -- Report problems: http://perl.apache.org/bugs/ Mail list info: http://perl.apache.org/maillist/modperl.html List etiquette: http://perl.apache.org/maillist/email-etiquette.html
        • petersm
          Dave Boodman wrote: As Perrin said, it sounds like it might be a scoping issue with some variables and how they are (not?) passed into subs. What could really
          Message 4 of 7 , May 2, 2004
          • 0 Attachment
            Dave Boodman wrote:
            As Perrin said, it sounds like it might be a scoping issue with some variables
            and how they are (not?) passed into subs. What could really help us spot it
            are your subs and calls to them. In fact if you can reduce it to a very simple
            test case that has the same experience, it would be easier to spot.

            Michael Peters
            Venzia

            > OK, here's some code:
            >
            > # systems
            > my @statuses;
            > my (@systems) = Lib::Systems->search( cid => $cid );
            > unless (@systems) { $self->model->log('debug', "systems for '$cid' not
            found"); $self->context->throw( 'systems.not_found', 'Systems not found' ); };

            >
            > Thanks!
            > At 03:40 PM 5/1/2004, Perrin Harkins wrote:
            > Dave Boodman wrote:
            > I'm seeing an issue where I do an insert and upon subsequent requests,
            certain children are not returning the newly-inserted data (row), while others
            are. Restarting apache fixes this as does waiting for some length of time.
            > Sounds like you have a scoping problem. You are probably accidentally
            creating a closure somewhere that is holding onto old values. If you can
            reduce your code down to an example small enough to post here, we can try to
            spot it for you.
            >
            > - Perrin
            > -- Report problems: http://perl.apache.org/bugs/ Mail list info:
            http://perl.apache.org/maillist/modperl.html List etiquette:
            http://perl.apache.org/maillist/email-etiquette.html
            ------- End of Original Message -------


            --
            Report problems: http://perl.apache.org/bugs/
            Mail list info: http://perl.apache.org/maillist/modperl.html
            List etiquette: http://perl.apache.org/maillist/email-etiquette.html
          • Aaron Ross
            Hi Dave, It looks like you are using Class::DBI. The behavior you describe is exactly what you would see if you had uncommitted changes. The changes would be
            Message 5 of 7 , May 2, 2004
            • 0 Attachment
              Hi Dave,

              It looks like you are using Class::DBI. The behavior you describe is
              exactly what you would see if you had uncommitted changes. The changes
              would be visible to the connections that made the changes, but not to
              the other processes or connections.

              If the problem is easy to reproduce, you could enable AutoCommit and see
              if it goes away.

              You've got all that nice logging in there, can you give us more details
              about the behavior your are seeing?

              HTH, Aaron

              On Sat, 2004-05-01 at 20:22, Dave Boodman wrote:
              > OK, here's some code:
              >
              > # systems
              > my @statuses;
              > my (@systems) = Lib::Systems->search( cid => $cid );
              > unless (@systems) { $self->model->log('debug',"systems for '$cid'
              > not found"); $self->context->throw('systems.not_found','Systems not
              > found' ); };
              > my $systems_profile = Lib::Profiles->system;
              > foreach my $sys (@systems) {
              > # reassign params from form names
              > my %tmp = map { $_ => $params{$_.'_'.$sys->sysid} }
              > Lib::Systems->columns;
              > my ($data, $errors) = $self->model->validate($systems_profile,
              > \%tmp);
              > if (@$errors) {
              > $self->context->throw('required', { fields => [@$errors] }
              > );
              > } else {
              > my (@relen_ips, @add_ips);
              > # establish status
              > my $status = 1;
              > if ($sys->cancel_date) { $status = 3; }
              > if ($sys->stop_date) { $status = 9; }
              >
              > # process a change in status
              > my $newstatus;
              > if ($sys->cancel_date < 1 && $tmp{'cancel_date'}) {
              > $self->model->log('info','cancelling system
              > '.$sys->sysid);
              > $newstatus = 3;
              > $status = 3;
              > }
              > if ($sys->stop_date < 1 && $tmp{'stop_date'}) {
              > $self->model->log('info','stopping system
              > '.$sys->sysid);
              > $newstatus = 9;
              > $status = 9;
              > }
              >
              > # store status so we can look at all and determine a cust
              > status
              > push @statuses, $status;
              >
              > # if status 9, add existing system's IPs to relen list
              > if ($newstatus == 9) {
              > my @ipobj = Lib::Ipmap->search( sysid => $sys->sysid,
              > status => 1 );
              > foreach (@ipobj) { push @relen_ips, $_->ip; }
              > }
              >
              > $self->model->log('info',"updating values for system
              > ".$sys->sysid);
              > while (my($key, $value) = each %$data) {
              > # we add this next line in case the client sends extra
              > # fields which we don't want to update. like the web
              > # client does
              > next unless ( Lib::Systems->find_column( $key ) );
              > $self->model->log('info',"setting $key to $value");
              >
              > eval { $sys->$key( $value ) };
              > if ($@) { $self->context->throw('set value', $@ ); }
              > }# end while
              > push @toupdate, $sys;
              >
              > # IPs
              > # add new
              > if ($params{'ip_'.$sys->sysid.'_new'}) {
              > my $assign_date = $self->model->{'time'}->ymd;
              > my $relen_date = 0;
              > # REMOVE WHEN WE GO LIVE AND ALL 2nd SYSTEMS ARE ADDED TO RECORDS
              > #
              > $assign_date = $sys->start_date;
              > # END REMOVE #
              > # if stopping server at same time assigning new ips
              > # we assume they were supposed to be there all the
              > time so we set
              > # assign date to sys start date. also, set relen_date
              > if ($newstatus == 9) { $assign_date =
              > $sys->start_date; $relen_date = $self->model->{'time'}->ymd; }
              > push @toupdate, update_ip($self, $sys->sysid, $cid,
              > $assign_date, $relen_date, split /[\s\,]/,
              > $params{'ip_'.$sys->sysid.'_new'});
              > $self->model->set('ip_'.$sys->sysid.'_new','');
              > } # end new ip if
              >
              > # get rid of ips
              > my $relen_date = $self->model->{'time'}->ymd;
              > push @relen_ips, $self->model->input('ip_'.$sys->sysid);
              > push @toupdate, update_ip($self, $sys->sysid, $cid, undef,
              > $relen_date, @relen_ips);
              > } # end update sys else
              > } # end sys foreach
              >
              > ---SNIP---
              >
              > # process updates
              > foreach my $obj (@toupdate) {
              > $self->model->log('info', "updating obj:");
              > $self->model->log_dumper('info', $obj);
              > eval { $obj->update };
              > if ($@) {
              > $self->model->log('info', 'update failed, rolling back');
              > foreach my $o (@created) { $o->dbi_rollback; }
              > $self->context->throw( 'update', $@ );
              > } else {
              > push @created, $obj;
              > }
              > }
              >
              > # if we made it this far, commit everything
              > foreach my $obj (@toupdate) { $obj->dbi_commit; }
              >
              > $self->model->set('addsystem','');
              > $self->model->set('addcontact','');
              > $self->model->set('do_update','');
              > return;
              >
              > Thanks!
              > At 03:40 PM 5/1/2004, Perrin Harkins wrote:
              > > Dave Boodman wrote:
              > > > I'm seeing an issue where I do an insert and upon subsequent
              > > > requests, certain children are not returning the newly-inserted
              > > > data (row), while others are. Restarting apache fixes this as does
              > > > waiting for some length of time.
              > >
              > > Sounds like you have a scoping problem. You are probably
              > > accidentally creating a closure somewhere that is holding onto old
              > > values. If you can reduce your code down to an example small enough
              > > to post here, we can try to spot it for you.
              > >
              > > - Perrin
              --
              Aaron Ross <aross@...>
              Plus Three


              --
              Report problems: http://perl.apache.org/bugs/
              Mail list info: http://perl.apache.org/maillist/modperl.html
              List etiquette: http://perl.apache.org/maillist/email-etiquette.html
            • Dave Boodman
              OK, here s some code: # systems my @statuses; my (@systems) = Lib::Systems- search( cid = $cid ); unless (@systems) { $self- model- log( debug , systems for
              Message 6 of 7 , May 3, 2004
              • 0 Attachment
                OK, here's some code:

                # systems
                my @statuses;
                my (@systems) = Lib::Systems->search( cid => $cid );
                unless (@systems) { $self->model->log('debug', "systems for '$cid' not
                found"); $self->context->throw( 'systems.not_found', 'Systems not found' ); };
                my $systems_profile = Lib::Profiles->system;
                foreach my $sys (@systems) {
                # reassign params from form names
                my %tmp = map { $_ => $params{$_.'_'.$sys->sysid} }
                Lib::Systems->columns;
                my ($data, $errors) = $self->model->validate($systems_profile, \%tmp);
                if (@$errors) {
                $self->context->throw( 'required', { fields => [@$errors] } );
                } else {
                my (@relen_ips, @add_ips);
                # establish status
                my $status = 1;
                if ($sys->cancel_date) { $status = 3; }
                if ($sys->stop_date) { $status = 9; }

                # process a change in status
                my $newstatus;
                if ($sys->cancel_date < 1 && $tmp{'cancel_date'}) {
                $self->model->log('info', 'cancelling system '.$sys->sysid);
                $newstatus = 3;
                $status = 3;
                }
                if ($sys->stop_date < 1 && $tmp{'stop_date'}) {
                $self->model->log('info', 'stopping system '.$sys->sysid);
                $newstatus = 9;
                $status = 9;
                }

                # store status so we can look at all and determine a cust status
                push @statuses, $status;

                # if status 9, add existing system's IPs to relen list
                if ($newstatus == 9) {
                my @ipobj = Lib::Ipmap->search( sysid => $sys->sysid,
                status => 1 );
                foreach (@ipobj) { push @relen_ips, $_->ip; }
                }

                $self->model->log('info', "updating values for system
                ".$sys->sysid);
                while (my($key, $value) = each %$data) {
                # we add this next line in case the client sends extra
                # fields which we don't want to update. like the web
                # client does
                next unless ( Lib::Systems->find_column( $key ) );
                $self->model->log('info', "setting $key to $value" );

                eval { $sys->$key( $value ) };
                if ($@) { $self->context->throw( 'set value', $@ ); }
                } # end while
                push @toupdate, $sys;

                # IPs
                # add new
                if ($params{'ip_'.$sys->sysid.'_new'}) {
                my $assign_date = $self->model->{'time'}->ymd;
                my $relen_date = 0;
                # REMOVE WHEN WE GO LIVE AND ALL 2nd SYSTEMS ARE ADDED TO RECORDS #
                $assign_date = $sys->start_date;
                # END REMOVE #
                # if stopping server at same time assigning new ips
                # we assume they were supposed to be there all the time so
                we set
                # assign date to sys start date. also, set relen_date
                if ($newstatus == 9) { $assign_date = $sys->start_date;
                $relen_date = $self->model->{'time'}->ymd; }
                push @toupdate, update_ip($self, $sys->sysid, $cid,
                $assign_date, $relen_date, split /[\s\,]/, $params{'ip_'.$sys->sysid.'_new'});
                $self->model->set('ip_'.$sys->sysid.'_new','');
                } # end new ip if

                # get rid of ips
                my $relen_date = $self->model->{'time'}->ymd;
                push @relen_ips, $self->model->input('ip_'.$sys->sysid);
                push @toupdate, update_ip($self, $sys->sysid, $cid, undef,
                $relen_date, @relen_ips);
                } # end update sys else
                } # end sys foreach

                ---SNIP---

                # process updates
                foreach my $obj (@toupdate) {
                $self->model->log('info', "updating obj:");
                $self->model->log_dumper('info', $obj);
                eval { $obj->update };
                if ($@) {
                $self->model->log('info', 'update failed, rolling back');
                foreach my $o (@created) { $o->dbi_rollback; }
                $self->context->throw( 'update', $@ );
                } else {
                push @created, $obj;
                }
                }

                # if we made it this far, commit everything
                foreach my $obj (@toupdate) { $obj->dbi_commit; }

                $self->model->set('addsystem','');
                $self->model->set('addcontact','');
                $self->model->set('do_update','');
                return;

                Thanks!
                At 03:40 PM 5/1/2004, Perrin Harkins wrote:
                >Dave Boodman wrote:
                >>I'm seeing an issue where I do an insert and upon subsequent requests,
                >>certain children are not returning the newly-inserted data (row), while
                >>others are. Restarting apache fixes this as does waiting for some length
                >>of time.
                >
                >Sounds like you have a scoping problem. You are probably accidentally
                >creating a closure somewhere that is holding onto old values. If you can
                >reduce your code down to an example small enough to post here, we can try
                >to spot it for you.
                >
                >- Perrin


                --
                Report problems: http://perl.apache.org/bugs/
                Mail list info: http://perl.apache.org/maillist/modperl.html
                List etiquette: http://perl.apache.org/maillist/email-etiquette.html
              • Perrin Harkins
                ... This is a little too much code to look at without any direction. The best thing to do would be to remove as much code as possible to get things down to
                Message 7 of 7 , May 3, 2004
                • 0 Attachment
                  On Mon, 2004-05-03 at 13:15, Dave Boodman wrote:
                  > OK, here's some code:

                  This is a little too much code to look at without any direction. The
                  best thing to do would be to remove as much code as possible to get
                  things down to the smallest example that demonstrates the problem. You
                  should also tell us which variables seem to be having the updating
                  problem.

                  I don't see any obvious scoping problems (closures) here, and you do
                  seem to be updating your Class::DBI objects. I did notice that you are
                  creating a new Template Toolkit object on every request, which is a bad
                  idea because it breaks the built-in template cache and slows things down
                  a lot, but that's not related to the problem you're having.

                  - Perrin


                  --
                  Report problems: http://perl.apache.org/bugs/
                  Mail list info: http://perl.apache.org/maillist/modperl.html
                  List etiquette: http://perl.apache.org/maillist/email-etiquette.html
                Your message has been successfully submitted and would be delivered to recipients shortly.