Skip to content

Commit

Permalink
fix(session): Log when session_* calls are slow
Browse files Browse the repository at this point in the history
Signed-off-by: Christoph Wurst <[email protected]>
  • Loading branch information
ChristophWurst committed Jun 26, 2024
1 parent 9496ce6 commit 64f35b1
Show file tree
Hide file tree
Showing 6 changed files with 35 additions and 18 deletions.
2 changes: 1 addition & 1 deletion cron.php
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@
Server::get(ISession::class)->close();

// initialize a dummy memory session
$session = new \OC\Session\Memory('');
$session = new \OC\Session\Memory();
$cryptoWrapper = \OC::$server->getSessionCryptoWrapper();
$session = $cryptoWrapper->wrapSession($session);
\OC::$server->setSession($session);
Expand Down
5 changes: 4 additions & 1 deletion lib/base.php
Original file line number Diff line number Diff line change
Expand Up @@ -388,7 +388,10 @@ public static function initSession(): void {

try {
// set the session name to the instance id - which is unique
$session = new \OC\Session\Internal($sessionName);
$session = new \OC\Session\Internal(
$sessionName,
logger('core'),
);

$cryptoWrapper = Server::get(\OC\Session\CryptoWrapper::class);
$session = $cryptoWrapper->wrapSession($session);
Expand Down
2 changes: 1 addition & 1 deletion lib/private/Server.php
Original file line number Diff line number Diff line change
Expand Up @@ -487,7 +487,7 @@ public function __construct($webRoot, \OC\Config $config) {

$this->registerService(\OC\User\Session::class, function (Server $c) {
$manager = $c->get(IUserManager::class);
$session = new \OC\Session\Memory('');
$session = new \OC\Session\Memory();
$timeFactory = new TimeFactory();
// Token providers might require a working database. This code
// might however be called when Nextcloud is not yet setup.
Expand Down
31 changes: 28 additions & 3 deletions lib/private/Session/Internal.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,11 @@

use OC\Authentication\Token\IProvider;
use OCP\Authentication\Exceptions\InvalidTokenException;
use OCP\ILogger;
use OCP\Session\Exceptions\SessionNotAvailableException;
use Psr\Log\LoggerInterface;
use function call_user_func_array;
use function microtime;

/**
* Class Internal
Expand All @@ -25,7 +29,8 @@ class Internal extends Session {
* @param string $name
* @throws \Exception
*/
public function __construct(string $name) {
public function __construct(string $name,
private LoggerInterface $logger) {
set_error_handler([$this, 'trapError']);
$this->invoke('session_name', [$name]);
try {
Expand Down Expand Up @@ -183,11 +188,31 @@ public function trapError(int $errorNumber, string $errorString) {
*/
private function invoke(string $functionName, array $parameters = [], bool $silence = false) {
try {
$timeBefore = microtime(true);
if ($silence) {
return @call_user_func_array($functionName, $parameters);
$result = @call_user_func_array($functionName, $parameters);
} else {
return call_user_func_array($functionName, $parameters);
$result = call_user_func_array($functionName, $parameters);
}
$timeAfter = microtime(true);
$timeSpent = $timeAfter - $timeBefore;
if ($timeSpent > 0.1) {
$logLevel = match (true) {
$timeSpent > 25 => ILogger::ERROR,
$timeSpent > 10 => ILogger::WARN,
$timeSpent > 0.5 => ILogger::INFO,
default => ILogger::DEBUG,
};
$this->logger->log(
$logLevel,
"Slow session operation $functionName detected",
[
'parameters' => $parameters,
'timeSpent' => $timeSpent,
],
);
}
return $result;
} catch (\Error $e) {
$this->trapError($e->getCode(), $e->getMessage());
}
Expand Down
5 changes: 0 additions & 5 deletions lib/private/Session/Memory.php
Original file line number Diff line number Diff line change
Expand Up @@ -20,11 +20,6 @@
class Memory extends Session {
protected $data;

public function __construct(string $name) {
//no need to use $name since all data is already scoped to this instance
$this->data = [];
}

/**
* @param string $key
* @param integer $value
Expand Down
8 changes: 1 addition & 7 deletions lib/private/Session/Session.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
namespace OC\Session;

use OCP\ISession;
use Psr\Log\LoggerInterface;

/**
* @template-implements \ArrayAccess<string,mixed>
Expand All @@ -19,13 +20,6 @@ abstract class Session implements \ArrayAccess, ISession {
*/
protected $sessionClosed = false;

/**
* $name serves as a namespace for the session keys
*
* @param string $name
*/
abstract public function __construct(string $name);

/**
* @param mixed $offset
* @return bool
Expand Down

0 comments on commit 64f35b1

Please sign in to comment.