MDL-58018 core: add support to redis for read-only sessions

This commit is contained in:
Mark Nelson
2020-04-20 14:32:37 +02:00
parent 7daa126d1d
commit 39770792ca
2 changed files with 13 additions and 2 deletions

View File

@@ -255,9 +255,11 @@ class redis extends handler {
*/
public function handler_read($id) {
try {
$this->lock_session($id);
if ($this->requires_write_lock()) {
$this->lock_session($id);
}
$sessiondata = $this->connection->get($id);
if ($sessiondata === false) {
if ($sessiondata === false && $this->requires_write_lock()) {
$this->unlock_session($id);
return '';
}

View File

@@ -94,6 +94,7 @@ class core_session_redis_testcase extends advanced_testcase {
public function test_normal_session_start_stop_works() {
$sess = new \core\session\redis();
$sess->init();
$sess->set_requires_write_lock(true);
$this->assertTrue($sess->handler_open('Not used', 'Not used'));
$this->assertSame('', $sess->handler_read('sess1'));
$this->assertTrue($sess->handler_write('sess1', 'DATA'));
@@ -110,6 +111,7 @@ class core_session_redis_testcase extends advanced_testcase {
public function test_session_blocks_with_existing_session() {
$sess = new \core\session\redis();
$sess->init();
$sess->set_requires_write_lock(true);
$this->assertTrue($sess->handler_open('Not used', 'Not used'));
$this->assertSame('', $sess->handler_read('sess1'));
$this->assertTrue($sess->handler_write('sess1', 'DATA'));
@@ -121,6 +123,7 @@ class core_session_redis_testcase extends advanced_testcase {
$sessblocked = new \core\session\redis();
$sessblocked->init();
$sessblocked->set_requires_write_lock(true);
$this->assertTrue($sessblocked->handler_open('Not used', 'Not used'));
// Trap the error log and send it to stdOut so we can expect output at the right times.
@@ -143,6 +146,7 @@ class core_session_redis_testcase extends advanced_testcase {
public function test_session_is_destroyed_when_it_does_not_exist() {
$sess = new \core\session\redis();
$sess->init();
$sess->set_requires_write_lock(true);
$this->assertTrue($sess->handler_open('Not used', 'Not used'));
$this->assertTrue($sess->handler_destroy('sess-destroy'));
$this->assertSessionNoLocks();
@@ -151,6 +155,7 @@ class core_session_redis_testcase extends advanced_testcase {
public function test_session_is_destroyed_when_we_have_it_open() {
$sess = new \core\session\redis();
$sess->init();
$sess->set_requires_write_lock(true);
$this->assertTrue($sess->handler_open('Not used', 'Not used'));
$this->assertSame('', $sess->handler_read('sess-destroy'));
$this->assertTrue($sess->handler_destroy('sess-destroy'));
@@ -160,8 +165,10 @@ class core_session_redis_testcase extends advanced_testcase {
public function test_multiple_sessions_do_not_interfere_with_each_other() {
$sess1 = new \core\session\redis();
$sess1->set_requires_write_lock(true);
$sess1->init();
$sess2 = new \core\session\redis();
$sess2->set_requires_write_lock(true);
$sess2->init();
// Initialize session 1.
@@ -203,6 +210,7 @@ class core_session_redis_testcase extends advanced_testcase {
public function test_multiple_sessions_work_with_a_single_instance() {
$sess = new \core\session\redis();
$sess->init();
$sess->set_requires_write_lock(true);
// Initialize session 1.
$this->assertTrue($sess->handler_open('Not used', 'Not used'));
@@ -223,6 +231,7 @@ class core_session_redis_testcase extends advanced_testcase {
public function test_session_exists_returns_valid_values() {
$sess = new \core\session\redis();
$sess->init();
$sess->set_requires_write_lock(true);
$this->assertTrue($sess->handler_open('Not used', 'Not used'));
$this->assertSame('', $sess->handler_read('sess1'));