return false;
}
- // Try cache (unless this needs to lock the DB).
+ // Try cache (unless this needs data from the master DB).
// NOTE: if this thread called saveSettings(), the cache was cleared.
- $locking = ( ( $flags & self::READ_LOCKING ) == self::READ_LOCKING );
- if ( $locking || !$this->loadFromCache() ) {
+ $latest = DBAccessObjectUtils::hasFlags( $flags, self::READ_LATEST );
+ if ( $latest || !$this->loadFromCache() ) {
wfDebug( "User: cache miss for user {$this->mId}\n" );
// Load from DB (make sure this thread sees its own changes)
if ( wfGetLB()->hasOrMadeRecentMasterChanges() ) {
$data['mVersion'] = self::VERSION;
$key = wfMemcKey( 'user', 'id', $this->mId );
- ObjectCache::getMainWANInstance()->set( $key, $data, 3600 );
+ $opts = Database::getCacheSetOptions( wfGetDB( DB_SLAVE ) );
+ ObjectCache::getMainWANInstance()->set( $key, $data, 3600, $opts );
}
/** @name newFrom*() static factory methods */
* the cached User object, we assume that whatever mechanism is setting
* the expiration date is also expiring the User cache.
* @since 1.23
- * @return string|bool The datestamp of the expiration, or null if not set
+ * @return string|null The datestamp of the expiration, or null if not set
*/
public function getPasswordExpireDate() {
$this->load();
if ( $success ) {
$this->mTouched = $newTouched;
+ $this->clearSharedCache();
+ } else {
+ // Clears on failure too since that is desired if the cache is stale
+ $this->clearSharedCache( 'refresh' );
}
- // Clears on failure too since that is desired if the cache is stale
- $this->clearSharedCache();
-
return $success;
}
}
/**
- * Clear user data from memcached.
- * Use after applying fun updates to the database; caller's
+ * Clear user data from memcached
+ *
+ * Use after applying updates to the database; caller's
* responsibility to update user_touched if appropriate.
*
* Called implicitly from invalidateCache() and saveSettings().
+ *
+ * @param string $mode Use 'refresh' to clear now; otherwise before DB commit
*/
- public function clearSharedCache() {
+ public function clearSharedCache( $mode = 'changed' ) {
$id = $this->getId();
if ( !$id ) {
return;
}
$key = wfMemcKey( 'user', 'id', $id );
- wfGetDB( DB_MASTER )->onTransactionPreCommitOrIdle( function() use ( $key ) {
- ObjectCache::getMainWANInstance()->delete( $key );
- } );
+ if ( $mode === 'refresh' ) {
+ ObjectCache::getMainWANInstance()->delete( $key, 1 );
+ } else {
+ wfGetDB( DB_MASTER )->onTransactionPreCommitOrIdle( function() use ( $key ) {
+ ObjectCache::getMainWANInstance()->delete( $key );
+ } );
+ }
}
/**
$request = $this->getRequest();
}
$params['secure'] = $secure;
- $request->response()->setcookie( $name, $value, $exp, $params );
+ $request->response()->setCookie( $name, $value, $exp, $params );
}
/**
if ( !$dbw->affectedRows() ) {
// Maybe the problem was a missed cache update; clear it to be safe
- $this->clearSharedCache();
+ $this->clearSharedCache( 'refresh' );
// User was changed in the meantime or loaded with stale data
$from = ( $this->queryFlagsUsed & self::READ_LATEST ) ? 'master' : 'slave';
throw new MWException(
$dbw->update(
'user',
array( 'user_editcount=user_editcount+1' ),
- array( 'user_id' => $this->getId() ),
+ array( 'user_id' => $this->getId(), 'user_editcount IS NOT NULL' ),
__METHOD__
);
// Lazy initialization check...