/** @var int UNIX timestamp */
protected $authErrorTimestamp = null;
+ /** @var bool Whether the server is an Ceph RGW */
+ protected $isRGW = false;
+
/**
* @see FileBackendStore::__construct()
* Additional $config params include:
foreach ( $reqs as $path => $op ) {
list( $rcode, $rdesc, $rhdrs, $rbody, $rerr ) = $op['response'];
fclose( $op['stream'] ); // close open handle
- if ( $rcode >= 200 && $rcode <= 299
- // double check that the disk is not full/broken
- && $tmpFiles[$path]->getSize() == $rhdrs['content-length']
- ) {
- // good
+ if ( $rcode >= 200 && $rcode <= 299 ) {
+ // Double check that the disk is not full/broken
+ if ( $tmpFiles[$path]->getSize() != $rhdrs['content-length'] ) {
+ $tmpFiles[$path] = null;
+ $rerr = "Got {$tmpFiles[$path]->getSize()}/{$rhdrs['content-length']} bytes";
+ $this->onError( null, __METHOD__,
+ array( 'src' => $path ) + $ep, $rerr, $rcode, $rdesc );
+ }
} elseif ( $rcode === 404 ) {
$tmpFiles[$path] = false;
} else {
return null;
}
- wfProfileIn( __METHOD__. "-{$this->name}-miss" );
+ wfProfileIn( __METHOD__ . "-{$this->name}-miss" );
list( $rcode, $rdesc, $rhdrs, $rbody, $rerr ) = $this->http->run( array(
'method' => 'HEAD',
'url' => $this->storageUrl( $auth, $container ),
*
* @param string $fullCont
* @param string $type ('info' for a list of object detail maps, 'names' for names only)
- * @param integer $limit
+ * @param int $limit
* @param string|null $after
* @param string|null $prefix
* @param string|null $delim
'md5' => ctype_xdigit( $rhdrs['etag'] ) ? $rhdrs['etag'] : null,
'xattr' => array( 'metadata' => $metadata, 'headers' => $headers )
);
+ if ( $this->isRGW ) {
+ $stat['latest'] = true; // strong consistency
+ }
} elseif ( $rcode === 404 ) {
$stat = false;
} else {
return null;
}
}
+ // Ceph RGW does not use <account> in URLs (OpenStack Swift uses "/v1/<account>")
+ if ( substr( $this->authCreds['storage_url'], -3 ) === '/v1' ) {
+ $this->isRGW = true; // take advantage of strong consistency
+ }
}
return $this->authCreds;
* @param string $func
* @param array $params
* @param string $err Error string
- * @param integer $code HTTP status
+ * @param int $code HTTP status
* @param string $desc HTTP status description
*/
public function onError( $status, $func, array $params, $err = '', $code = 0, $desc = '' ) {