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.