Print this page
3166 feed generation needs performance improvement
3306 feed returns invalid last-modified header
        
*** 33,48 ****
  import cStringIO
  import datetime
  import httplib
  import os
  import rfc822
  import time
  import urllib
  import xml.dom.minidom as xmini
  
  from pkg.misc import get_rel_path, get_res_path
! import pkg.catalog as catalog
  import pkg.fmri as fmri
  import pkg.Uuid25 as uuid
  
  MIME_TYPE = 'application/atom+xml'
  CACHE_FILENAME = "feed.xml"
--- 33,49 ----
  import cStringIO
  import datetime
  import httplib
  import os
  import rfc822
+ import sys
  import time
  import urllib
  import xml.dom.minidom as xmini
  
  from pkg.misc import get_rel_path, get_res_path
! import pkg.server.catalog as catalog
  import pkg.fmri as fmri
  import pkg.Uuid25 as uuid
  
  MIME_TYPE = 'application/atom+xml'
  CACHE_FILENAME = "feed.xml"
*** 199,209 ****
          "-": ["Removed", "%s was removed from the repository."],
          "U": ["Updated", "%s, an update to an existing package, was added to "
              "the repository."]
  }
  
! def add_transaction(request, scfg, rcfg, doc, feed, txn):
          """Each transaction is an entry.  We have non-trivial content, so we
          can omit summary elements.
          """
  
          e = doc.createElement("entry")
--- 200,210 ----
          "-": ["Removed", "%s was removed from the repository."],
          "U": ["Updated", "%s, an update to an existing package, was added to "
              "the repository."]
  }
  
! def add_transaction(request, scfg, rcfg, doc, feed, txn, fmris):
          """Each transaction is an entry.  We have non-trivial content, so we
          can omit summary elements.
          """
  
          e = doc.createElement("entry")
*** 227,244 ****
                  # non-well-formed document.)
                  op_title = "Unknown Operation"
                  op_content = "%s was changed in the repository."
  
          if txn["operation"] == "+":
-                 c = scfg.updatelog.catalog
                  # Get all FMRIs matching the current FMRI's package name.
!                 matches = catalog.extract_matching_fmris(c.fmris(),
!                     f.get_name(), matcher=fmri.exact_name_match)
! 
!                 if len(matches) > 1:
!                         # Get the oldest fmri (it's the last entry).
!                         of = matches[-1]
  
                          # If the current fmri isn't the oldest one, then this
                          # is an update to the package.
                          if f != of:
                                  # If there is more than one matching FMRI, and
--- 228,242 ----
                  # non-well-formed document.)
                  op_title = "Unknown Operation"
                  op_content = "%s was changed in the repository."
  
          if txn["operation"] == "+":
                  # Get all FMRIs matching the current FMRI's package name.
!                 matches = fmris[f.pkg_name]
!                 if len(matches["versions"]) > 1:
!                         # Get the oldest fmri.
!                         of = matches[str(matches["versions"][0])][0]
  
                          # If the current fmri isn't the oldest one, then this
                          # is an update to the package.
                          if f != of:
                                  # If there is more than one matching FMRI, and
*** 305,317 ****
          # The feed should be presented in reverse chronological order.
          def compare_ul_entries(a, b):
                  return cmp(ults_to_ts(a["timestamp"]),
                      ults_to_ts(b["timestamp"]))
  
          for txn in sorted(scfg.updatelog.gen_updates_as_dictionaries(feed_ts),
              cmp=compare_ul_entries, reverse=True):
!                 add_transaction(request, scfg, rcfg, d, feed, txn)
  
          d.writexml(cf)
  
  def __get_cache_pathname(scfg):
          return os.path.join(scfg.repo_root, CACHE_FILENAME)
--- 303,321 ----
          # The feed should be presented in reverse chronological order.
          def compare_ul_entries(a, b):
                  return cmp(ults_to_ts(a["timestamp"]),
                      ults_to_ts(b["timestamp"]))
  
+         # Get the entire catalog in the format returned by catalog.cache_fmri,
+         # so that we don't have to keep looking for possible matches.
+         fmris = {}
+         catalog.ServerCatalog.read_catalog(fmris,
+             scfg.updatelog.catalog.catalog_root)
+ 
          for txn in sorted(scfg.updatelog.gen_updates_as_dictionaries(feed_ts),
              cmp=compare_ul_entries, reverse=True):
!                 add_transaction(request, scfg, rcfg, d, feed, txn, fmris)
  
          d.writexml(cf)
  
  def __get_cache_pathname(scfg):
          return os.path.join(scfg.repo_root, CACHE_FILENAME)
*** 412,423 ****
                          cf.close()
  
                          # Now that the feed has been generated, set the headers
                          # correctly and return it.
                          response.headers['Content-type'] = MIME_TYPE
!                         response.headers['Last-Modified'] = \
!                             datetime.datetime.now().isoformat()
                          response.headers['Content-length'] = len(buf)
                          return buf
                  else:
                          # If the server isn't operating in readonly mode, the
                          # feed can be generated and cached in inst_dir.
--- 416,429 ----
                          cf.close()
  
                          # Now that the feed has been generated, set the headers
                          # correctly and return it.
                          response.headers['Content-type'] = MIME_TYPE
! 
!                         # Return the current time and date in GMT.
!                         response.headers['Last-Modified'] = rfc822.formatdate()
! 
                          response.headers['Content-length'] = len(buf)
                          return buf
                  else:
                          # If the server isn't operating in readonly mode, the
                          # feed can be generated and cached in inst_dir.