From f8da97b1ea5c27ad5ed12e5b4c93dfd7329930ac Mon Sep 17 00:00:00 2001 From: Arron King Date: Fri, 5 Nov 2021 15:17:49 +0000 Subject: [PATCH 1/8] Add some tests for fifo naming conventions --- tests/Queue/QueueSqsQueueTest.php | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/tests/Queue/QueueSqsQueueTest.php b/tests/Queue/QueueSqsQueueTest.php index 60e02b161ebb..810fa2fff2d9 100755 --- a/tests/Queue/QueueSqsQueueTest.php +++ b/tests/Queue/QueueSqsQueueTest.php @@ -144,6 +144,16 @@ public function testGetQueueProperlyResolvesUrlWithPrefix() $this->assertEquals($queueUrl, $queue->getQueue('test')); } + public function testGetQueueProperlyResolvesFifoUrlWithPrefix() + { + $this->queueName = 'emails.fifo'; + $this->queueUrl = $this->prefix . $this->queueName; + $queue = new SqsQueue($this->sqs, $this->queueName, $this->prefix); + $this->assertEquals($this->queueUrl, $queue->getQueue(null)); + $queueUrl = $this->baseUrl . '/' . $this->account . '/test.fifo'; + $this->assertEquals($queueUrl, $queue->getQueue('test.fifo')); + } + public function testGetQueueProperlyResolvesUrlWithoutPrefix() { $queue = new SqsQueue($this->sqs, $this->queueUrl); @@ -160,6 +170,15 @@ public function testGetQueueProperlyResolvesUrlWithSuffix() $this->assertEquals($queueUrl, $queue->getQueue('test')); } + public function testGetQueueProperlyResolvesFifoUrlWithSuffix() + { + $this->queueName = 'emails.fifo'; + $queue = new SqsQueue($this->sqs, $this->queueName, $this->prefix, $suffix = '-staging'); + $this->assertEquals("{$this->prefix}emails-staging.fifo", $queue->getQueue(null)); + $queueUrl = $this->baseUrl . '/' . $this->account . '/test' . $suffix . '.fifo'; + $this->assertEquals($queueUrl, $queue->getQueue('test.fifo')); + } + public function testGetQueueEnsuresTheQueueIsOnlySuffixedOnce() { $queue = new SqsQueue($this->sqs, "{$this->queueName}-staging", $this->prefix, $suffix = '-staging'); @@ -167,4 +186,12 @@ public function testGetQueueEnsuresTheQueueIsOnlySuffixedOnce() $queueUrl = $this->baseUrl.'/'.$this->account.'/test'.$suffix; $this->assertEquals($queueUrl, $queue->getQueue('test-staging')); } + + public function testGetFifoQueueEnsuresTheQueueIsOnlySuffixedOnce() + { + $queue = new SqsQueue($this->sqs, "{$this->queueName}-staging.fifo", $this->prefix, $suffix = '-staging'); + $this->assertEquals("{$this->prefix}{$this->queueName}{$suffix}.fifo", $queue->getQueue(null)); + $queueUrl = $this->baseUrl . '/' . $this->account . '/test' . $suffix . '.fifo'; + $this->assertEquals($queueUrl, $queue->getQueue('test-staging.fifo')); + } } From b72bfa502b0993dbe2ca74ab656ba75b3406b96a Mon Sep 17 00:00:00 2001 From: Arron King Date: Fri, 5 Nov 2021 15:19:08 +0000 Subject: [PATCH 2/8] Add final test for fifo --- tests/Queue/QueueSqsQueueTest.php | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/tests/Queue/QueueSqsQueueTest.php b/tests/Queue/QueueSqsQueueTest.php index 810fa2fff2d9..84472adcc534 100755 --- a/tests/Queue/QueueSqsQueueTest.php +++ b/tests/Queue/QueueSqsQueueTest.php @@ -162,6 +162,16 @@ public function testGetQueueProperlyResolvesUrlWithoutPrefix() $this->assertEquals($queueUrl, $queue->getQueue($queueUrl)); } + public function testGetQueueProperlyResolvesFifoUrlWithoutPrefix() + { + $this->queueName = 'emails.fifo'; + $this->queueUrl = $this->prefix . $this->queueName; + $queue = new SqsQueue($this->sqs, $this->queueUrl); + $this->assertEquals($this->queueUrl, $queue->getQueue(null)); + $fifoQueueUrl = $this->baseUrl . '/' . $this->account . '/test.fifo'; + $this->assertEquals($fifoQueueUrl, $queue->getQueue($fifoQueueUrl)); + } + public function testGetQueueProperlyResolvesUrlWithSuffix() { $queue = new SqsQueue($this->sqs, $this->queueName, $this->prefix, $suffix = '-staging'); From 3282651b0baeabc85073ea4b6818b911ccfc980d Mon Sep 17 00:00:00 2001 From: Arron King Date: Fri, 5 Nov 2021 15:20:58 +0000 Subject: [PATCH 3/8] Put queue suffix into own function. Able to deal with .fifo --- src/Illuminate/Queue/SqsQueue.php | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/Illuminate/Queue/SqsQueue.php b/src/Illuminate/Queue/SqsQueue.php index 1ef834bb7bae..1cc1b5dacbc7 100755 --- a/src/Illuminate/Queue/SqsQueue.php +++ b/src/Illuminate/Queue/SqsQueue.php @@ -188,10 +188,24 @@ public function getQueue($queue) $queue = $queue ?: $this->default; return filter_var($queue, FILTER_VALIDATE_URL) === false - ? rtrim($this->prefix, '/').'/'.Str::finish($queue, $this->suffix) + ? $this->suffixQueue($queue, $this->suffix) : $queue; } + /** + * Suffixes a queue + * + * @param string $queue + * @param string $suffix + * @return string + */ + private function suffixQueue($queue, $suffix = '') + { + $fifo = Str::endsWith($queue, '.fifo') ? '.fifo' : ''; + $queue = rtrim($queue, '.fifo'); + return rtrim($this->prefix, '/') . '/' . Str::finish($queue, $suffix) . $fifo; + } + /** * Get the underlying SQS instance. * From 915d44e3aa0c6293e31abb43bf93369637333061 Mon Sep 17 00:00:00 2001 From: Kennedy Tedesco Date: Sat, 6 Nov 2021 12:10:53 -0300 Subject: [PATCH 4/8] [8.x] View EngineResolver - Minor change (#39505) Use the forget method directly. --- src/Illuminate/View/Engines/EngineResolver.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Illuminate/View/Engines/EngineResolver.php b/src/Illuminate/View/Engines/EngineResolver.php index 6a5b80026342..674040770be2 100755 --- a/src/Illuminate/View/Engines/EngineResolver.php +++ b/src/Illuminate/View/Engines/EngineResolver.php @@ -32,7 +32,7 @@ class EngineResolver */ public function register($engine, Closure $resolver) { - unset($this->resolved[$engine]); + $this->forget($engine); $this->resolvers[$engine] = $resolver; } From 32da5eba2a11c14ab1a268098196fe10ec71b3f4 Mon Sep 17 00:00:00 2001 From: Chris Morrell Date: Sun, 7 Nov 2021 16:51:37 -0500 Subject: [PATCH 5/8] [8.x] Ensure event mutex is always removed (#39498) * Ensure mutex is always removed * formatting * Remove after callback that duplicates work * rename method Co-authored-by: Taylor Otwell --- src/Illuminate/Console/Scheduling/Event.php | 45 ++++++++++++++++----- 1 file changed, 36 insertions(+), 9 deletions(-) diff --git a/src/Illuminate/Console/Scheduling/Event.php b/src/Illuminate/Console/Scheduling/Event.php index 58cee5281cb1..4de88f163dbf 100644 --- a/src/Illuminate/Console/Scheduling/Event.php +++ b/src/Illuminate/Console/Scheduling/Event.php @@ -17,6 +17,7 @@ use Illuminate\Support\Traits\ReflectsClosures; use Psr\Http\Client\ClientExceptionInterface; use Symfony\Component\Process\Process; +use Throwable; class Event { @@ -218,11 +219,17 @@ public function mutexName() */ protected function runCommandInForeground(Container $container) { - $this->callBeforeCallbacks($container); + try { + $this->callBeforeCallbacks($container); - $this->exitCode = Process::fromShellCommandline($this->buildCommand(), base_path(), null, null, null)->run(); + $this->exitCode = Process::fromShellCommandline( + $this->buildCommand(), base_path(), null, null, null + )->run(); - $this->callAfterCallbacks($container); + $this->callAfterCallbacks($container); + } finally { + $this->removeMutex(); + } } /** @@ -233,9 +240,15 @@ protected function runCommandInForeground(Container $container) */ protected function runCommandInBackground(Container $container) { - $this->callBeforeCallbacks($container); + try { + $this->callBeforeCallbacks($container); + + Process::fromShellCommandline($this->buildCommand(), base_path(), null, null, null)->run(); + } catch (Throwable $exception) { + $this->removeMutex(); - Process::fromShellCommandline($this->buildCommand(), base_path(), null, null, null)->run(); + throw $exception; + } } /** @@ -275,7 +288,11 @@ public function callAfterCallbacksWithExitCode(Container $container, $exitCode) { $this->exitCode = (int) $exitCode; - $this->callAfterCallbacks($container); + try { + $this->callAfterCallbacks($container); + } finally { + $this->removeMutex(); + } } /** @@ -647,9 +664,7 @@ public function withoutOverlapping($expiresAt = 1440) $this->expiresAt = $expiresAt; - return $this->then(function () { - $this->mutex->forget($this); - })->skip(function () { + return $this->skip(function () { return $this->mutex->exists($this); }); } @@ -915,4 +930,16 @@ public function preventOverlapsUsing(EventMutex $mutex) return $this; } + + /** + * Delete the mutex for the event. + * + * @return void + */ + protected function removeMutex() + { + if ($this->withoutOverlapping) { + $this->mutex->forget($this); + } + } } From 12e47bb3dad10294268fa3167112b198fd0a2036 Mon Sep 17 00:00:00 2001 From: Taylor Otwell Date: Sun, 7 Nov 2021 15:56:17 -0600 Subject: [PATCH 6/8] fix bugs and formatting --- src/Illuminate/Queue/SqsQueue.php | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/src/Illuminate/Queue/SqsQueue.php b/src/Illuminate/Queue/SqsQueue.php index 1cc1b5dacbc7..dab07b701a6a 100755 --- a/src/Illuminate/Queue/SqsQueue.php +++ b/src/Illuminate/Queue/SqsQueue.php @@ -193,17 +193,21 @@ public function getQueue($queue) } /** - * Suffixes a queue + * Add the given suffix to the given queue name. * - * @param string $queue - * @param string $suffix + * @param string $queue + * @param string $suffix * @return string */ - private function suffixQueue($queue, $suffix = '') + protected function suffixQueue($queue, $suffix = '') { - $fifo = Str::endsWith($queue, '.fifo') ? '.fifo' : ''; - $queue = rtrim($queue, '.fifo'); - return rtrim($this->prefix, '/') . '/' . Str::finish($queue, $suffix) . $fifo; + if (Str::endsWith($queue, '.fifo')) { + $queue = Str::beforeLast($queue, '.fifo'); + + return rtrim($this->prefix, '/').'/'.Str::finish($queue, $suffix).'.fifo'; + } + + return rtrim($this->prefix, '/').'/'.Str::finish($queue, $this->suffix); } /** From 0218f6b829ef31193565c895e9b67dfcad9e765c Mon Sep 17 00:00:00 2001 From: Taylor Otwell Date: Sun, 7 Nov 2021 21:56:50 +0000 Subject: [PATCH 7/8] Apply fixes from StyleCI --- tests/Queue/QueueSqsQueueTest.php | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tests/Queue/QueueSqsQueueTest.php b/tests/Queue/QueueSqsQueueTest.php index 84472adcc534..3c1ac3a73086 100755 --- a/tests/Queue/QueueSqsQueueTest.php +++ b/tests/Queue/QueueSqsQueueTest.php @@ -147,10 +147,10 @@ public function testGetQueueProperlyResolvesUrlWithPrefix() public function testGetQueueProperlyResolvesFifoUrlWithPrefix() { $this->queueName = 'emails.fifo'; - $this->queueUrl = $this->prefix . $this->queueName; + $this->queueUrl = $this->prefix.$this->queueName; $queue = new SqsQueue($this->sqs, $this->queueName, $this->prefix); $this->assertEquals($this->queueUrl, $queue->getQueue(null)); - $queueUrl = $this->baseUrl . '/' . $this->account . '/test.fifo'; + $queueUrl = $this->baseUrl.'/'.$this->account.'/test.fifo'; $this->assertEquals($queueUrl, $queue->getQueue('test.fifo')); } @@ -165,10 +165,10 @@ public function testGetQueueProperlyResolvesUrlWithoutPrefix() public function testGetQueueProperlyResolvesFifoUrlWithoutPrefix() { $this->queueName = 'emails.fifo'; - $this->queueUrl = $this->prefix . $this->queueName; + $this->queueUrl = $this->prefix.$this->queueName; $queue = new SqsQueue($this->sqs, $this->queueUrl); $this->assertEquals($this->queueUrl, $queue->getQueue(null)); - $fifoQueueUrl = $this->baseUrl . '/' . $this->account . '/test.fifo'; + $fifoQueueUrl = $this->baseUrl.'/'.$this->account.'/test.fifo'; $this->assertEquals($fifoQueueUrl, $queue->getQueue($fifoQueueUrl)); } @@ -185,7 +185,7 @@ public function testGetQueueProperlyResolvesFifoUrlWithSuffix() $this->queueName = 'emails.fifo'; $queue = new SqsQueue($this->sqs, $this->queueName, $this->prefix, $suffix = '-staging'); $this->assertEquals("{$this->prefix}emails-staging.fifo", $queue->getQueue(null)); - $queueUrl = $this->baseUrl . '/' . $this->account . '/test' . $suffix . '.fifo'; + $queueUrl = $this->baseUrl.'/'.$this->account.'/test'.$suffix.'.fifo'; $this->assertEquals($queueUrl, $queue->getQueue('test.fifo')); } @@ -201,7 +201,7 @@ public function testGetFifoQueueEnsuresTheQueueIsOnlySuffixedOnce() { $queue = new SqsQueue($this->sqs, "{$this->queueName}-staging.fifo", $this->prefix, $suffix = '-staging'); $this->assertEquals("{$this->prefix}{$this->queueName}{$suffix}.fifo", $queue->getQueue(null)); - $queueUrl = $this->baseUrl . '/' . $this->account . '/test' . $suffix . '.fifo'; + $queueUrl = $this->baseUrl.'/'.$this->account.'/test'.$suffix.'.fifo'; $this->assertEquals($queueUrl, $queue->getQueue('test-staging.fifo')); } } From 5e0320ecdd1dcac55bb839a9532f891976d9be6f Mon Sep 17 00:00:00 2001 From: Dries Vints Date: Mon, 8 Nov 2021 11:44:32 +0100 Subject: [PATCH 8/8] Fix PostgreSQL build --- .github/workflows/databases.yml | 86 +++++++++---------- .../Database/Schema/PostgresBuilder.php | 4 +- 2 files changed, 45 insertions(+), 45 deletions(-) diff --git a/.github/workflows/databases.yml b/.github/workflows/databases.yml index 05c9c913eff3..689fb4ccde7d 100644 --- a/.github/workflows/databases.yml +++ b/.github/workflows/databases.yml @@ -132,49 +132,49 @@ jobs: DB_CONNECTION: mysql DB_USERNAME: root - # pgsql: - # runs-on: ubuntu-20.04 - - # services: - # postgresql: - # image: postgres:14 - # env: - # POSTGRES_DB: forge - # POSTGRES_USER: forge - # POSTGRES_PASSWORD: password - # ports: - # - 5432:5432 - # options: --health-cmd=pg_isready --health-interval=10s --health-timeout=5s --health-retries=3 - - # strategy: - # fail-fast: true - - # name: PostgreSQL 14 - - # steps: - # - name: Checkout code - # uses: actions/checkout@v2 - - # - name: Setup PHP - # uses: shivammathur/setup-php@v2 - # with: - # php-version: 8.1 - # extensions: dom, curl, libxml, mbstring, zip, pcntl, pdo, pdo_pgsql - # tools: composer:v2 - # coverage: none - - # - name: Install dependencies - # uses: nick-invision/retry@v1 - # with: - # timeout_minutes: 5 - # max_attempts: 5 - # command: composer update --prefer-stable --prefer-dist --no-interaction --no-progress - - # - name: Execute tests - # run: vendor/bin/phpunit tests/Integration/Database --verbose --exclude-group MySQL - # env: - # DB_CONNECTION: pgsql - # DB_PASSWORD: password + pgsql: + runs-on: ubuntu-20.04 + + services: + postgresql: + image: postgres:14 + env: + POSTGRES_DB: forge + POSTGRES_USER: forge + POSTGRES_PASSWORD: password + ports: + - 5432:5432 + options: --health-cmd=pg_isready --health-interval=10s --health-timeout=5s --health-retries=3 + + strategy: + fail-fast: true + + name: PostgreSQL 14 + + steps: + - name: Checkout code + uses: actions/checkout@v2 + + - name: Setup PHP + uses: shivammathur/setup-php@v2 + with: + php-version: 8.1 + extensions: dom, curl, libxml, mbstring, zip, pcntl, pdo, pdo_pgsql + tools: composer:v2 + coverage: none + + - name: Install dependencies + uses: nick-invision/retry@v1 + with: + timeout_minutes: 5 + max_attempts: 5 + command: composer update --prefer-stable --prefer-dist --no-interaction --no-progress + + - name: Execute tests + run: vendor/bin/phpunit tests/Integration/Database --verbose --exclude-group MySQL + env: + DB_CONNECTION: pgsql + DB_PASSWORD: password mssql: runs-on: ubuntu-20.04 diff --git a/src/Illuminate/Database/Schema/PostgresBuilder.php b/src/Illuminate/Database/Schema/PostgresBuilder.php index bceb42d7fb9f..1b3ca413f690 100755 --- a/src/Illuminate/Database/Schema/PostgresBuilder.php +++ b/src/Illuminate/Database/Schema/PostgresBuilder.php @@ -237,7 +237,7 @@ protected function parseSearchPath($searchPath) $searchPath = $matches[0]; } - array_walk($searchPath, function (&$schema) { + array_walk($searchPath ?? [], function (&$schema) { $schema = trim($schema, '\'"'); $schema = $schema === '$user' @@ -245,6 +245,6 @@ protected function parseSearchPath($searchPath) : $schema; }); - return $searchPath; + return $searchPath ?? []; } }