Don't do any caching logic if we are only serving payloads.
Currently, if we are only supposed to be serving images, the devserver
-at startup- might still try to clean its cache. This is unintended and
incorrect. If we are only supposed to be serving payloads, we shouldn't
have any additional side-effects.
BUG=chromium-os:34768
TEST=Ran w/ w/out archive_dir also ran unittests + pylint + --clear_cache w |
w/out data. A canary with vmtests and a paladin.
Change-Id: I7f97f9748f7eecac9da443b5881adac443f00fcd
Reviewed-on: https://gerrit.chromium.org/gerrit/39510
Commit-Ready: Chris Sosa <[email protected]>
Reviewed-by: Chris Sosa <[email protected]>
Tested-by: Chris Sosa <[email protected]>
diff --git a/devserver.py b/devserver.py
index 6a855e8..9c0b6a3 100755
--- a/devserver.py
+++ b/devserver.py
@@ -6,6 +6,7 @@
"""A CherryPy-based webserver to host images and build packages."""
+import cherrypy
import json
import logging
import optparse
@@ -18,8 +19,6 @@
import threading
import types
-import cherrypy
-
import autoupdate
import common_util
import downloader
@@ -617,12 +616,34 @@
return updater.HandleUpdatePing(data, label)
+def _CleanCache(cache_dir, wipe):
+ """Wipes any excess cached items in the cache_dir.
+
+ Args:
+ cache_dir: the directory we are wiping from.
+ wipe: If True, wipe all the contents -- not just the excess.
+ """
+ if wipe:
+ # Clear the cache and exit on error.
+ cmd = 'rm -rf %s/*' % cache_dir
+ if os.system(cmd) != 0:
+ _Log('Failed to clear the cache with %s' % cmd)
+ sys.exit(1)
+ else:
+ # Clear all but the last N cached updates
+ cmd = ('cd %s; ls -tr | head --lines=-%d | xargs rm -rf' %
+ (cache_dir, CACHED_ENTRIES))
+ if os.system(cmd) != 0:
+ _Log('Failed to clean up old delta cache files with %s' % cmd)
+ sys.exit(1)
+
+
def main():
usage = 'usage: %prog [options]'
parser = optparse.OptionParser(usage=usage)
parser.add_option('--archive_dir',
metavar='PATH',
- help='serve archived builds only')
+ help='Enables serve-only mode. Serves archived builds only')
parser.add_option('--board',
help='when pre-generating update, board for latest image')
parser.add_option('--clear_cache',
@@ -649,7 +670,9 @@
help='record history of host update events (/api/hostlog)')
parser.add_option('--image',
metavar='FILE',
- help='force update using this image')
+ help='Force update using this image. Can only be used when '
+ 'not in serve-only mode as it is used to generate a '
+ 'payload.')
parser.add_option('--logfile',
metavar='PATH',
help='log output to this file instead of stdout')
@@ -659,7 +682,9 @@
'(default: unlimited)')
parser.add_option('-p', '--pregenerate_update',
action='store_true', default=False,
- help='pre-generate update payload')
+ help='pre-generate update payload. Can only be used when '
+ 'not in serve-only mode as it is used to generate a '
+ 'payload.')
parser.add_option('--payload',
metavar='PATH',
help='use update payload from specified directory')
@@ -715,26 +740,21 @@
serve_only = True
cache_dir = os.path.join(static_dir, 'cache')
- _Log('Using cache directory %s' % cache_dir)
+ # If our devserver is only supposed to serve payloads, we shouldn't be mucking
+ # with the cache at all. If the devserver hadn't previously generated a cache
+ # and is expected, the caller is using it wrong.
+ if serve_only:
+ # Extra check to make sure we're not being called incorrectly.
+ if (options.clear_cache or options.exit or options.pregenerate_update or
+ options.board or options.image):
+ parser.error('Incompatible flags detected for serve_only mode.')
- if os.path.exists(cache_dir):
- if options.clear_cache:
- # Clear the cache and exit on error.
- cmd = 'rm -rf %s/*' % cache_dir
- if os.system(cmd) != 0:
- _Log('Failed to clear the cache with %s' % cmd)
- sys.exit(1)
-
- else:
- # Clear all but the last N cached updates
- cmd = ('cd %s; ls -tr | head --lines=-%d | xargs rm -rf' %
- (cache_dir, CACHED_ENTRIES))
- if os.system(cmd) != 0:
- _Log('Failed to clean up old delta cache files with %s' % cmd)
- sys.exit(1)
+ elif os.path.exists(cache_dir):
+ _CleanCache(cache_dir, options.clear_cache)
else:
os.makedirs(cache_dir)
+ _Log('Using cache directory %s' % cache_dir)
_Log('Data dir is %s' % options.data_dir)
_Log('Source root is %s' % root_dir)
_Log('Serving from %s' % static_dir)