From 39770792ca624a611eaaca6e973306938771fe83 Mon Sep 17 00:00:00 2001 From: Mark Nelson Date: Mon, 20 Apr 2020 14:32:37 +0200 Subject: [PATCH] MDL-58018 core: add support to redis for read-only sessions --- lib/classes/session/redis.php | 6 ++++-- lib/tests/session_redis_test.php | 9 +++++++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/lib/classes/session/redis.php b/lib/classes/session/redis.php index d4758675de0..b54639a064c 100644 --- a/lib/classes/session/redis.php +++ b/lib/classes/session/redis.php @@ -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 ''; } diff --git a/lib/tests/session_redis_test.php b/lib/tests/session_redis_test.php index ff9ddd3383c..938491a3cb6 100644 --- a/lib/tests/session_redis_test.php +++ b/lib/tests/session_redis_test.php @@ -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')); -- 2.43.0