Motivation:
* Avoid code duplication.
* Hopefully make it easier to read.
* Also order stuff from cheap to expensive, if possible.
Change-Id: I575e3f2027ce60a0d0885be5b9bd3e07bc035eee
Combine the good/bad MapCacheLRU instances and use class constants
for row/flag keys of entry arrays. Treat query flags the same way
for missing/existing link entries.
Discourage the use of READ_LATEST via code comments.
Simplify fetchPageRow() given that page_touched is already part
of getSelectFields().
Avoid method call overhead for getGoodLinkFieldObj() type casting.
Create getPersistentCacheKey() method to avoid duplication.
Change-Id: I8701466650fd4988de2fa5aba02d64eac7bd6c1a
Introduced in 2017 with I7f14b9ca2533032 (2e5eb693) but remains
unused at WMF, and disabled by default.
Follows-up I62107789fa (9e49260fc9) which added reap to LinkCache
test cases in 2021.
Change-Id: I0654c29a671467dd6b366f462d1c09b90a273413
Passing null to the constructor as well as the LinkCache::forUpdate
method have been deprecated since 1.34. Since this is a service
class, it should only be instantiated directly by the service
container anyways.
Change-Id: Id15ccf2af6ef59e7052ea88548464e7481ca73d4
Now largely automated:
VARS=$(grep -o "'[A-Za-z0-9_]*'" includes/MainConfigNames.php | \
tr "\n" '|' | sed "s/|$/\n/;s/'//g")
sed -i -E "s/'($VARS)'/MainConfigNames::\1/g" \
$(grep -ERIl "'($VARS)'" includes/)
Then git add -p with lots of error-prone manual checking. Then
semi-manually add all the necessary "use" lines:
vim $(grep -L 'use MediaWiki\\MainConfigNames;' \
$(git diff --cached --name-only --diff-filter=M HEAD^))
I didn't bother fixing lines that were over 100 characters unless they
were over 120 and triggered phpcs.
Bug: T305805
Change-Id: I74e0ab511abecb276717ad4276a124760a268147
When the called function has a doc of int, it should be cast to be
explicit here.
Also cast for arithmetic operations to be explicit about the number
Change-Id: I905b78dfb66e66443e0e3203488bab5b548db543
These are needed PageStoreRecord::REQUIRED_FIELDS and that's why putting
PageStore on top of LinkCache caused a lot of increase in db reads.
Bug: T297669
Change-Id: If77c2f9879d7bae71eb59944efd8b3798d16aa46
The code that was previously in LinkCache::getGoodLinkRow
may return a cached row object (either from the in-process
cache, or memcached). In some cases, this caused
LinkCache::addGoodLinkObjFromRow to throw, because a field
was missing (although the field is missing only from
the cached copy, not from the database).
To avoid this, try to invalidate the cache
in LinkCache::getGoodLinkRow and retry, before
letting the exception propagate.
Bug: T205349
Change-Id: Ie9e90bf32964047c1831f575cc260d7d62e9e848
LinkCache::addGoodLinkObj was hard deprecated.
Use addGoodLinkObjFromRow() instead. PHPUnit tests
must use LinkCacheTestTrait::addGoodLinkObject().
Bug: T284955
Change-Id: I0c22be2f00e6d6d4ba6dd1511c5385cad55e8ff7
addGoodLinkObj() has many optional arguments, but omitting them actually
means corrupting the cache.
Nearly all existing callers are in tests.
So LinkCacheTestTrait::addGoodLinkObject() was created only
for testing. It is better to have this method in the
trait, because building the row directly in each test
would make these tests brittle against schema changes.
The only usage in WMF production code was in WikiPage and has been
fixed.
Bug: T284955
Change-Id: I03a2bd9ed64fcc0281ee29a286c8db395a9e03d9
This makes the data stored by LinkCache compatible with PageStoreRecord,
so we can use LinkCache inside PageStore.
This causes PageStore to make use of local caching as well as WANObjectCache.
Note that getPageById() does not yet benefit from cache, but does
populate the cache.
Bug: T278940
Change-Id: Icc27a0d9299a3e4ce45521daef87ad06ec06f064
Every special page link handled by LinkRenderer::makeKnownLink()
would generate a warning in LinkCache about the target being a
"non-proper" page. Duplicate LinkCache's sanity checks to avoid this.
Also improve LinkCache warning messages.
Change-Id: Ia2dc9136cc2edf5ee57e8f1ee54819f891b41a1c
When reporting non-preoper LinkTargets or PageReferences, we need to
include the fragment part. Title::__toString does not, so use
TitleFormatter::getFullText instead.
For the purpose of T285951: this patch is not necessary to resolve the
bug, it just improves logging.
Bug: T285951
Change-Id: I1b4fccebae585edf07dccadfb4e8cb48e0b5d597
This patch does several things to LinkCache to make its behavior more
consistent and predictable:
* Methods that set a "good" link now clear the "bad link" flag, and vice
versa.
* invalidateTitle() now also clears the local cache, not just the
persistent cache.
* Attempts to set data for LinkTargets that are not proper local pages
are ignored.
* All methods now accept LinkTarget|PageRecord as the key.
The ones that previously accepted a string still allow that as well.
* addLinkObject() now consistently uses the local cache if possible,
and consistently bypasses it if the forUpdate() flag is set.
This is all done in preparation for LinkCache being used inside PageStore.
Bug: T278940
Change-Id: I62107789fa185606a81be20ffa8f0be48297c08f
These callers just need to load some data from DB_MASTER.
Subsequent code needing that latest title data should also use the
required flags, rather than relying on flakey global cache state.
Change-Id: I53248ea4b5bf1cd953f956c41b8244831ec5ef04
This changes TemplatesOnThisPageFormatter to use LinkBatch
and LinkBatch/LinkCache to manage the field.
Change-Id: I523158cdffc599d4d29bab91c98e55085130cee2
* This fixes keys based on some sort of change log.
Updates are wrapped in a mutex and keep track of the
last known good position.
* Make WANObjectReapUpdate class that cleans up title
related keys using the recentchanges table. This triggers
as a deferred updates on RC view.
Change-Id: I7f14b9ca2533032147e62b1a3cc004a23da86579
Queries from parsing are the top use of selectRow() according
to reverse flame graphs on xenon. This does not bother with
pages in namespaces less likely to be included.
Change-Id: Ica5d6e52c830cd71effff21933b8c64691082c11