# File lib/mongo/gridfs/grid_file_system.rb, line 85
    def open(filename, mode, opts={})
      opts = opts.dup
      opts.merge!(default_grid_io_opts(filename))
      if mode == 'w'
        begin
          # Ensure there are the appropriate indexes, as state may have changed since instantiation of self.
          # Recall that index definitions are cached with ensure_index so this statement won't unneccesarily repeat index creation.
          @files.ensure_index([['filename', 1], ['uploadDate', -1]])
          @chunks.ensure_index([['files_id', Mongo::ASCENDING], ['n', Mongo::ASCENDING]], :unique => true)
          versions = opts.delete(:versions)
          if opts.delete(:delete_old) || (versions && versions < 1)
            versions = 1
          end
        rescue Mongo::ConnectionFailure => e
          raise e, "Failed to create necessary indexes and write data."
          return
        end
      end
      file = GridIO.new(@files, @chunks, filename, mode, opts)
      return file unless block_given?
      result = nil
      begin
        result = yield file
      ensure
        id = file.close
        if versions
          self.delete do
            @files.find({'filename' => filename, '_id' => {'$ne' => id}}, :fields => ['_id'], :sort => ['uploadDate', -1], :skip => (versions - 1))
          end
        end
      end
      result
    end