1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110
|
<?php
use MediaWiki\Deferred\DeferredUpdates;
use MediaWiki\WikiMap\WikiMap;
use Wikimedia\FileBackend\FileBackendMultiWrite;
use Wikimedia\FileBackend\MemoryFileBackend;
use Wikimedia\TestingAccessWrapper;
/**
* @group FileRepo
* @group FileBackend
* @covers \Wikimedia\FileBackend\FileBackendMultiWrite
*/
class FileBackendMultiWriteTest extends MediaWikiIntegrationTestCase {
public function testReadAffinity() {
$be = TestingAccessWrapper::newFromObject(
new FileBackendMultiWrite( [
'name' => 'localtesting',
'wikiId' => WikiMap::getCurrentWikiId() . mt_rand(),
'backends' => [
[ // backend 0
'name' => 'multitesting0',
'class' => MemoryFileBackend::class,
'isMultiMaster' => false,
'readAffinity' => true
],
[ // backend 1
'name' => 'multitesting1',
'class' => MemoryFileBackend::class,
'isMultiMaster' => true
]
]
] )
);
$this->assertSame(
1,
$be->getReadIndexFromParams( [ 'latest' => 1 ] ),
'Reads with "latest" flag use backend 1'
);
$this->assertSame(
0,
$be->getReadIndexFromParams( [ 'latest' => 0 ] ),
'Reads without "latest" flag use backend 0'
);
$p = 'container/test-cont/file.txt';
$be->backends[0]->quickCreate( [
'dst' => "mwstore://multitesting0/$p", 'content' => 'cattitude' ] );
$be->backends[1]->quickCreate( [
'dst' => "mwstore://multitesting1/$p", 'content' => 'princess of power' ] );
$this->assertEquals(
'cattitude',
$be->getFileContents( [ 'src' => "mwstore://localtesting/$p" ] ),
"Non-latest read came from backend 0"
);
$this->assertEquals(
'princess of power',
$be->getFileContents( [ 'src' => "mwstore://localtesting/$p", 'latest' => 1 ] ),
"Latest read came from backend1"
);
}
public function testAsyncWrites() {
$be = TestingAccessWrapper::newFromObject(
new FileBackendMultiWrite( [
'name' => 'localtesting',
'wikiId' => WikiMap::getCurrentWikiId() . mt_rand(),
'backends' => [
[ // backend 0
'name' => 'multitesting0',
'class' => MemoryFileBackend::class,
'isMultiMaster' => false
],
[ // backend 1
'name' => 'multitesting1',
'class' => MemoryFileBackend::class,
'isMultiMaster' => true
]
],
'replication' => 'async'
] )
);
$cleanup = DeferredUpdates::preventOpportunisticUpdates();
$p = 'container/test-cont/file.txt';
$be->quickCreate( [
'dst' => "mwstore://localtesting/$p", 'content' => 'cattitude' ] );
$this->assertFalse(
$be->backends[0]->getFileContents( [ 'src' => "mwstore://multitesting0/$p" ] ),
"File not yet written to backend 0"
);
$this->assertEquals(
'cattitude',
$be->backends[1]->getFileContents( [ 'src' => "mwstore://multitesting1/$p" ] ),
"File already written to backend 1"
);
DeferredUpdates::doUpdates();
$this->assertEquals(
'cattitude',
$be->backends[0]->getFileContents( [ 'src' => "mwstore://multitesting0/$p" ] ),
"File now written to backend 0"
);
}
}
|