代码之家  ›  专栏  ›  技术社区  ›  Sean McMains

Ruby-net/ldap模块内存泄漏

  •  5
  • Sean McMains  · 技术社区  · 16 年前

    这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP的调用时,内存使用情况稳定得很好。此外,正在扩散的物体是 Net::BER::BerIdentifiedString Net::BER::BerIdentifiedArray ,都是LDAP库的一部分。

    以下是我的代码的相关部分:

    require 'net/ldap'
    require 'pp'
    
    class User < ActiveRecord::Base
      validates_presence_of :name, :login, :email
    
      # This method is resonsible for populating the User table with the
      # login, name, and email of anybody who might be using the system.
      def self.import_all
        # initialization stuff. set bind_dn, bind_pass, ldap_host, base_dn and filter
    
        ldap = Net::LDAP.new
        ldap.host = ldap_host
        ldap.auth bind_dn, bind_pass
        ldap.bind
    
        begin
          # Build the list
          records = records_updated = new_records = 0
          ldap.search(:base => base_dn, :filter => filter ) do |entry|
            name = entry.givenName.to_s.strip + " " + entry.sn.to_s.strip
            login = entry.name.to_s.strip
            email = login + "@txstate.edu"
            user = User.find_or_initialize_by_login :name => name, :login => login, :email => email
            if user.name != name
              user.name = name
              user.save
              logger.info( "Updated: " + email )
              records_updated = records_updated + 1
            elsif user.new_record?
              user.save
              new_records = new_records + 1
            else
              # update timestamp so that we can delete old records later
              user.touch
            end
            records = records + 1
          end
    
          # delete records that haven't been updated for 7 days
          records_deleted = User.destroy_all( ["updated_at < ?", Date.today - 7 ] ).size
    
          logger.info( "LDAP Import Complete: " + Time.now.to_s )
          logger.info( "Total Records Processed: " + records.to_s )
          logger.info( "New Records: " + new_records.to_s )
          logger.info( "Updated Records: " + records_updated.to_s ) 
          logger.info( "Deleted Records: " + records_deleted.to_s )
    
        end
    
      end
    end
    

    提前感谢您的帮助/指点!

    顺便说一句,我在net/ldap支持论坛上也问过这个问题,但是没有得到任何有用的提示。

    1 回复  |  直到 16 年前
        1
  •  8
  •   Daniel Abrahamsson    16 年前

    需要注意的一件非常重要的事情是,您从不使用方法调用的结果。那意味着你应该通过考试 :return_result => false ldap.search :

    ldap.search(:base => base_dn, :filter => filter, :return_result => false ) do |entry|
    

    从文档中:

    换句话说,如果您不使用这个标志,所有条目都将存储在内存中,即使您不需要它们在块外!所以,使用这个选项。

    推荐文章