Skip to content

Commit

Permalink
feature: add cooldown command (#54)
Browse files Browse the repository at this point in the history
  • Loading branch information
taka-oyama committed Jan 12, 2023
1 parent 50c3b34 commit 01bcc75
Show file tree
Hide file tree
Showing 4 changed files with 109 additions and 0 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

Added
- Support Schema\Builder::getAllTables()
- Command `spanner:cooldown` which clears all connections in the session pool.

Changed
- Default SessionPool was changed from `Google\Cloud\Spanner\Session\CacheSessionPool` to `Colopl\Spanner\Session\CacheSessionPool` to patch an [unresolved issue on Google's end](https://github.com/googleapis/google-cloud-php/issues/5567).
Expand Down
50 changes: 50 additions & 0 deletions src/Console/CooldownCommand.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
<?php
/**
* Copyright 2019 Colopl Inc. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

namespace Colopl\Spanner\Console;

use Colopl\Spanner\Connection as SpannerConnection;
use Illuminate\Console\Command;
use Illuminate\Database\DatabaseManager;

class CooldownCommand extends Command
{
protected $signature = 'spanner:cooldown {connections?* : The database connections to be cleared}';

protected $description = 'Deletes all sessions from Spanner\'s Session Pool.';

public function handle(DatabaseManager $db): void
{
$connectionNames = (array)$this->argument('connections');
if (count($connectionNames) === 0) {
$connectionNames = array_keys((array)config('database.connections'));
}

$spannerConnectionNames = array_filter(
$connectionNames,
static fn(string $name): bool => config("database.connections.{$name}.driver") === 'spanner',
);

foreach ($spannerConnectionNames as $name) {
$connection = $db->connection($name);
if ($connection instanceof SpannerConnection) {
$connection->clearSessionPool();
$this->info("All sessions cleared for {$name}");
}
}
}
}
2 changes: 2 additions & 0 deletions src/SpannerServiceProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@

namespace Colopl\Spanner;

use Colopl\Spanner\Console\CooldownCommand;
use Colopl\Spanner\Console\SessionsCommand;
use Colopl\Spanner\Console\WarmupCommand;
use Colopl\Spanner\Session\CacheSessionPool;
Expand All @@ -39,6 +40,7 @@ public function register()
});

$this->commands([
CooldownCommand::class,
SessionsCommand::class,
WarmupCommand::class,
]);
Expand Down
56 changes: 56 additions & 0 deletions tests/Console/CooldownCommandTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
<?php
/**
* Copyright 2019 Colopl Inc. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

namespace Console;

use Colopl\Spanner\Connection;
use Colopl\Spanner\Tests\Console\TestCase;

class CooldownCommandTest extends TestCase
{
public function test_no_args(): void
{
foreach (['main', 'alternative'] as $name) {
$conn = $this->getConnection($name);
assert($conn instanceof Connection);
$this->setUpDatabaseOnce($conn);
$conn->warmupSessionPool();
}

$this->artisan('spanner:cooldown')
->expectsOutputToContain("All sessions cleared for main")
->expectsOutputToContain("All sessions cleared for alternative")
->assertSuccessful()
->run();
}

public function test_with_args(): void
{
foreach (['main', 'alternative'] as $name) {
$conn = $this->getConnection($name);
assert($conn instanceof Connection);
$this->setUpDatabaseOnce($conn);
$conn->warmupSessionPool();
}

$this->artisan('spanner:cooldown', ['connections' => 'main'])
->expectsOutputToContain("All sessions cleared for main")
->doesntExpectOutputToContain("alternative")
->assertSuccessful()
->run();
}
}

0 comments on commit 01bcc75

Please sign in to comment.