Merge "[FileBackend] Purge Swift process cache before container delete for sanity."
authorDemon <chadh@wikimedia.org>
Mon, 4 Jun 2012 20:46:32 +0000 (20:46 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Mon, 4 Jun 2012 20:46:32 +0000 (20:46 +0000)
1  2 
includes/filerepo/backend/SwiftFileBackend.php

@@@ -42,9 -42,6 +42,9 @@@ class SwiftFileBackend extends FileBack
        protected $authTTL; // integer seconds
        protected $swiftAnonUser; // string; username to handle unauthenticated requests
        protected $swiftUseCDN; // boolean; whether CloudFiles CDN is enabled
 +      protected $swiftCDNExpiry; // integer; how long to cache things in the CDN
 +      protected $swiftCDNPurgable; // boolean; whether object CDN purging is enabled
 +
        protected $maxContCacheSize = 300; // integer; max containers with entries
  
        /** @var CF_Connection */
         *    swiftAuthTTL       : Swift authentication TTL (seconds)
         *    swiftAnonUser      : Swift user used for end-user requests (account:username)
         *    swiftUseCDN        : Whether a Cloud Files Content Delivery Network is set up
 +       *    swiftCDNExpiry     : How long (in seconds) to store content in the CDN.
 +       *                         If files may likely change, this should probably not exceed
 +       *                         a few days. For example, deletions may take this long to apply.
 +       *                         If object purging is enabled, however, this is not an issue.
 +       *    swiftCDNPurgable   : Whether object purge requests are allowed by the CDN.
         *    shardViaHashLevels : Map of container names to sharding config with:
         *                         'base'   : base of hash characters, 16 or 36
         *                         'levels' : the number of hash levels (and digits)
                $this->swiftUseCDN = isset( $config['swiftUseCDN'] )
                        ? $config['swiftUseCDN']
                        : false;
 +              $this->swiftCDNExpiry = isset( $config['swiftCDNExpiry'] )
 +                      ? $config['swiftCDNExpiry']
 +                      : 3600; // hour
 +              $this->swiftCDNPurgable = isset( $config['swiftCDNPurgable'] )
 +                      ? $config['swiftCDNPurgable']
 +                      : true;
                // Cache container info to mask latency
                $this->memCache = wfGetMainCache();
        }
                                ) );
                        }
                        if ( $this->swiftUseCDN ) { // Rackspace style CDN
 -                              $contObj->make_public();
 +                              $contObj->make_public( $this->swiftCDNExpiry );
                        }
                } catch ( CDNNotEnabledException $e ) {
                        // CDN not enabled; nothing to see here
        }
  
        /**
 -       * Purge the CDN cache of affected objects if CDN caching is enabled
 +       * Purge the CDN cache of affected objects if CDN caching is enabled.
 +       * This is for Rackspace/Akamai CDNs.
         *
         * @param $objects Array List of CF_Object items
         * @return void
         */
        public function purgeCDNCache( array $objects ) {
 -              if ( $this->swiftUseCDN ) { // Rackspace style CDN
 +              if ( $this->swiftUseCDN && $this->swiftCDNPurgable ) {
                        foreach ( $objects as $object ) {
                                try {
                                        $object->purge_from_cdn();
         *
         * @param $container string Container name
         * @return CF_Container
-        * @throws InvalidResponseException
+        * @throws CloudFilesException
         */
        protected function createContainer( $container ) {
                $conn = $this->getConnection(); // Swift proxy connection
         *
         * @param $container string Container name
         * @return void
-        * @throws InvalidResponseException
+        * @throws CloudFilesException
         */
        protected function deleteContainer( $container ) {
                $conn = $this->getConnection(); // Swift proxy connection
-               $conn->delete_container( $container );
                unset( $this->connContainers[$container] ); // purge cache
+               $conn->delete_container( $container );
        }
  
        /**