Make WordPress Core


Ignore:
Timestamp:
11/21/2013 07:06:26 PM (11 years ago)
Author:
wonderboymusic
Message:

Prefix the notoptions cache key in the multisite site-options group with $wpdb->siteid to avoid collisions and race conditions when using a fancy multi-network setup. Adds unit test.

Fixes #25883.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-includes/option.php

    r25925 r26304  
    758758
    759759    // prevent non-existent options from triggering multiple queries
    760     $notoptions = wp_cache_get( 'notoptions', 'site-options' );
     760    $notoptions_key = "{$wpdb->siteid}:notoptions";
     761    $notoptions = wp_cache_get( $notoptions_key, 'site-options' );
    761762    if ( isset( $notoptions[$option] ) )
    762763        return apply_filters( 'default_site_option_' . $option, $default );
     
    780781            } else {
    781782                $notoptions[$option] = true;
    782                 wp_cache_set( 'notoptions', $notoptions, 'site-options' );
     783                wp_cache_set( $notoptions_key, $notoptions, 'site-options' );
    783784                $value = apply_filters( 'default_site_option_' . $option, $default );
    784785            }
     
    813814
    814815    $value = apply_filters( 'pre_add_site_option_' . $option, $value );
     816    $notoptions_key = "{$wpdb->siteid}:notoptions";
    815817
    816818    if ( !is_multisite() ) {
     
    820822
    821823        // Make sure the option doesn't already exist. We can check the 'notoptions' cache before we ask for a db query
    822         $notoptions = wp_cache_get( 'notoptions', 'site-options' );
     824        $notoptions = wp_cache_get( $notoptions_key, 'site-options' );
    823825        if ( ! is_array( $notoptions ) || ! isset( $notoptions[$option] ) )
    824826            if ( false !== get_site_option( $option ) )
     
    836838
    837839        // This option exists now
    838         $notoptions = wp_cache_get( 'notoptions', 'site-options' ); // yes, again... we need it to be fresh
     840        $notoptions = wp_cache_get( $notoptions_key, 'site-options' ); // yes, again... we need it to be fresh
    839841        if ( is_array( $notoptions ) && isset( $notoptions[$option] ) ) {
    840842            unset( $notoptions[$option] );
    841             wp_cache_set( 'notoptions', $notoptions, 'site-options' );
     843            wp_cache_set( $notoptions_key, $notoptions, 'site-options' );
    842844        }
    843845    }
     
    923925        return add_site_option( $option, $value );
    924926
    925     $notoptions = wp_cache_get( 'notoptions', 'site-options' );
     927    $notoptions_key = "{$wpdb->siteid}:notoptions";
     928    $notoptions = wp_cache_get( $notoptions_key, 'site-options' );
    926929    if ( is_array( $notoptions ) && isset( $notoptions[$option] ) ) {
    927930        unset( $notoptions[$option] );
    928         wp_cache_set( 'notoptions', $notoptions, 'site-options' );
     931        wp_cache_set( $notoptions_key, $notoptions, 'site-options' );
    929932    }
    930933
Note: See TracChangeset for help on using the changeset viewer.