73 foreach ( $entities as $entity ) {
74 $entitiesByKey[$this->getStoreKey( $entity )] = $entity;
77 $blobsByKey = $this->stash->getMulti( array_keys( $entitiesByKey ) );
80 foreach ( $entitiesByKey as $key => $entity ) {
81 $blob = $blobsByKey[$key] ??
null;
82 $data = is_string( $blob ) ? json_decode( $blob,
true ) :
null;
84 $data[self::KEY_PATHS] ?? [],
85 $data[self::KEY_AS_OF] ??
null
92 public function storeMulti( array $pathByEntity ): void {
93 $hasPendingUpdate = (bool)$this->updateBuffer;
95 foreach ( $pathByEntity as $entity => $paths ) {
105 if ( !$hasPendingUpdate ) {
106 DeferredUpdates::addCallableUpdate(
function () {
108 $this->updateBuffer = [];
113 $cache = MediaWikiServices::getInstance()
114 ->getObjectCacheFactory()->getLocalClusterInstance();
115 foreach ( $updatesByEntity as $entity => $update ) {
116 $lockKey = $cache->makeKey(
'rl-deps', $entity );
117 $scopeLocks[$entity] = $cache->getScopedLock( $lockKey, 0 );
118 if ( !$scopeLocks[$entity] ) {
124 $entitiesUnreg[] = $entity;
126 $depsByEntity[$entity] = $update;
130 foreach ( $depsByEntity as $entity => $data ) {
131 if ( !is_array( $data[self::KEY_PATHS] ) || !is_int( $data[self::KEY_AS_OF] ) ) {
132 throw new InvalidArgumentException(
"Invalid entry for '$entity'" );
136 $data[
self::KEY_PATHS] = array_values( array_unique( $data[self::KEY_PATHS] ) );
137 sort( $data[self::KEY_PATHS], SORT_STRING );
139 $blob = json_encode( $data, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE );
141 $blobsByKey[$this->getStoreKey( $entity )] = $blob;
145 $this->stash->setMulti( $blobsByKey, self::RL_MODULE_DEP_TTL, BagOStuff::WRITE_BACKGROUND );
148 $this->
remove( $entitiesUnreg );