Commit Graph

25 Commits

Author SHA1 Message Date
Andrew Nicols e734858e55 MDL-79890 core: Session handlers must implement SessionHandlerInterface 2023-11-15 09:14:40 +08:00
Srdjan f061599fc9 MDL-72622 core: Support TLS for redis session 2023-06-27 09:49:36 +10:00
Nils Adermann e63ed5511b MDL-70687 session: Redis session lock exp = max exec time
If for any reason a Redis session lock is not being released, all subsequent
requests will wait to acquire the lock, forcing them to time out eventually.
This will happen till the original lock finally expires after the session timeout.

This sets the Redis session lock expiry time to whatever is lower,
either the PHP execution time `max_execution_time`, if the value was
defined in the `php.ini` or the globally configured `sessiontimeout`.
Setting it to the lower of the two will not make things worse it if the
execution timeout is longer than the session timeout.
For the PHP execution time, once the PHP execution time is over, we can
be sure that the lock is no longer actively held so that the lock can
expire safely. Although at `lib/classes/php_time_limit.php::raise(int)`,
Moodle can progressively increase the maximum PHP execution time, this
is limited to the `max_execution_time` value defined in the `php.ini`.
For the session timeout, we assume it is safe to consider the lock to
expire once the session itself expires.
If we unnecessarily hold the lock any longer, it blocks other session
requests.

Co-authored-by: Daniel Ziegenberg <daniel@ziegenberg.at>
Signed-off-by: Daniel Ziegenberg <daniel@ziegenberg.at>
2023-03-10 12:33:53 +01:00
Marina Glancy b1c97381b4 MDL-76356 various: avoid implicit conversion to int
PHP before version 8.1 automatically converted to int if the function
parameter (or array key) is expected to be int. PHP 8.1 shows notice in
this case
2023-01-10 15:27:11 +01:00
sam marshall 4ab9f08ce0 MDL-75369 Redis: Remove unnecessary ping after connect
The Redis cache store and session handler both do a 'ping()' after
connecting to Redis. This is unnecessary because the connect() call
has just checked the network connection and it's hardly likely that
the server has gone down since then.

According to my profiling, both connect() and ping() take
measurable time when talking to a separate server, i.e. a few
milliseconds. So it's not the case that connect() doesn't really
talk to the server, as I initially wondered.

If using Redis on a separate (non-localhost) server for both session
and cache store, removing these ping calls can save a millisecond
or two per request.
2022-09-13 10:45:00 +01:00
Jun Pataleta de177cc564 Merge branch 'MDL-72283_allow-customisation-of-redis-session-handler-errors' of https://github.com/ziegenberg/moodle 2022-05-24 10:13:04 +08:00
Daniel Ziegenberg 01309248d8 MDL-72283 caching: internationalize redis session handler error
The 'unable to obtain session lock'-exception raised by the Redis
session handler is hardcoded in English and not all that useful
to the end user.

This change adds the error message to the lang/error.php and gives
the user further hints why the error might have occured and how it
could be fixed.

Signed-off-by: Daniel Ziegenberg <daniel@ziegenberg.at>
2022-05-23 16:42:33 +02:00
Brendan Heywood e032ac9303 MDL-68668 redis: Add session lock acquire warning 2022-05-20 22:41:38 +10:00
Eloy Lafuente (stronk7) a5c91474ee MDL-71807 cleanup: Replace deprecated codingStandardsIgnore annotations
The PHP_CodeSniffer @codingStandardsIgnore annotations are deprecated
and, since version 3.x, the new // phpcs:ignore comments should be used
instead.

This commits just reviews all the uses in core, replacing them for
the better new candidate, or removing when no longer needed.
2022-03-08 10:48:53 +01:00
Daniel Ziegenberg 371b490a1f MDL-72796 caching: fix retry delay for redis session cache
The random retry delay for redis session cache was calculated as
rand(100000, 500000) giving an effective retry delay of 100 seconds
to 500 seconds. That's off by a factor of a thousand! Using Redis as a
session cache and when the connection hangs, you can get random
"cannot obtain session lock" errors because it's waiting up to
500 seconds (or about 8.33 minutes) for a Redis connection.
This sets the delay to the originally intended 100ms to 500ms.
(see MDL-59866).

Signed-off-by: Daniel Ziegenberg <daniel@ziegenberg.at>
2021-12-05 17:03:56 +01:00
Jamie Stamp f2ee4599f7 MDL-69121 core: Add ZSTD/Gzip compression options to Redis sessions 2020-11-09 12:34:22 +00:00
Brendan Heywood 8c1c164e0a MDL-69707 session: Avoid redis writes if the session is unchanged 2020-09-29 20:45:38 +10:00
Brendan Heywood 8eab4f77cc MDL-68577 session: Fine tune the redis lock polling 2020-05-20 15:54:10 +10:00
Don Bowman cf7b00b8cf MDL-68696 sessions: Fixed redis session handler for readonly
In 39770792ca read-only sessions were allowed.
In the redis case, as called from the mobile application,
this can lead to returning 'false' for session rather than ''.
2020-05-15 12:09:15 -04:00
Brendan Heywood 7bc8ccdcf0 MDL-67075 session: Added extra debugging of blocking redis session locks 2020-04-30 13:06:07 +10:00
Mark Nelson 39770792ca MDL-58018 core: add support to redis for read-only sessions 2020-04-21 19:29:12 +02:00
Ilya Tregubov 4120908e19 MDL-65249 Session: Throw exception if number of attempts exceeded. 2019-06-25 15:09:42 +10:00
Andrew Nicols ed3ff719f2 MDL-63050 redis: Make session check compatible with Redis 4.0 2018-08-02 10:57:53 +08:00
Marcus Boon f8e2383bdd MDL-59866 session: Add retry for redis sessions
There is an edge case whereby redis will fail
to accept connections on the first try but
retrying the connection seems to make it work

Included in this commit:
* Retry functionality in the session init
2017-12-12 14:42:04 +10:00
Mike Olsen 7782e6610b MDL-58311 cache: Add password support for redis
add password support for redis connects in cache and session
2017-03-27 10:31:45 +01:00
wehr 88671590f2 MDL-57655 session: Adds igbinary serializer to Redis session handler 2017-01-25 00:47:25 +01:00
Adam Olley d456bd42c3 MDL-56823 session: redis sessions don't honour $CFG->sessiontimeout
The redis session handler doesn't use the sessiontimeout config setting
to determine session lifetime.

It has a lock expiry, which is set to 7200 (or a config setting) that is
used to determine how long a lock is held onto, but that should be
distinct from the session timeout.
2016-11-10 10:30:04 +10:30
Russell Smith 7f8a816a7d MDL-54606 session: Add redis handler with locking. 2016-08-04 21:50:11 +10:00
Andrew Nicols d07c339272 Revert "Merge branch 'MDL-53599' of git://github.com/nhoobin/moodle"
This reverts commit 15a813cda2, reversing
changes made to 6870e1fa77.
2016-05-06 10:18:10 +08:00
Nicholas Hoobin c5211882f7 MDL-53599 session: Added a session_class_handler for Redis.
It is now possible to set up Redis as a session handler for Moodle.
Ensure that the phpredis extension is enabled and working on your sever.

Please place the following lines in config.php
$CFG->session_handler_class = '\core\session\redis';
$CFG->session_redis_save_path = 'tcp://127.0.0.1';

To determine if it has been set correctly, navigate to
$CFG->wwwroot/admin/phpinfo.php and find following the strings in the
session block,

session.save_handler = redis
session.save_path = tcp://127.0.0.1
2016-04-18 16:28:45 +10:00