Commit 1d7583d7 authored by Yassine Doghri's avatar Yassine Doghri
Browse files

fix(fediverse): add "processing" and "failed" statuses to better manage broadcast load

fixes #511
parent d30c49cd
Loading
Loading
Loading
Loading
+37 −19
Original line number Diff line number Diff line
@@ -5,6 +5,7 @@ declare(strict_types=1);
namespace Modules\Fediverse\Commands;

use CodeIgniter\CLI\BaseCommand;
use Exception;
use Override;

class Broadcast extends BaseCommand
@@ -22,10 +23,19 @@ class Broadcast extends BaseCommand

        // retrieve scheduled activities from database
        $scheduledActivities = model('ActivityModel', false)
            ->getScheduledActivities();
            ->getScheduledActivities(10);

        foreach ($scheduledActivities as $scheduledActivity) {
            // set activity post to processing
            model('ActivityModel', false)
                ->update($scheduledActivity->id, [
                    'status' => 'processing',
                ]);
        }

        // Send activity to all followers
        foreach ($scheduledActivities as $scheduledActivity) {
            try {
                if ($scheduledActivity->target_actor_id !== null) {
                    if ($scheduledActivity->actor_id !== $scheduledActivity->target_actor_id) {
                        // send activity to targeted actor
@@ -48,6 +58,14 @@ class Broadcast extends BaseCommand
                    ->update($scheduledActivity->id, [
                        'status' => 'delivered',
                    ]);

            } catch (Exception) {
                // set activity post to delivered
                model('ActivityModel', false)
                    ->update($scheduledActivity->id, [
                        'status' => 'failed',
                    ]);
            }
        }
    }
}
+31 −0
Original line number Diff line number Diff line
<?php

declare(strict_types=1);

/**
 * @copyright  2024 Ad Aures
 * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
 * @link       https://castopod.org/
 */

namespace Modules\Fediverse\Migrations;

use App\Database\Migrations\BaseMigration;
use Override;

class UpdateActivitiesStatus extends BaseMigration
{
    #[Override]
    public function up(): void
    {
        $fields = [
            'status' => [
                'type'       => 'ENUM',
                'constraint' => ['queued', 'processing', 'delivered', 'failed'],
                'null'       => true,
            ],
        ];

        $this->forge->modifyColumn('fediverse_activities', $fields);
    }
}
+1 −0
Original line number Diff line number Diff line
@@ -131,6 +131,7 @@ if (! function_exists('send_activity_to_followers')) {
     */
    function send_activity_to_followers(Actor $actor, string $activityPayload): void
    {
        // TODO: send activities in parallel with https://www.php.net/manual/en/function.curl-multi-init.php
        foreach ($actor->followers as $follower) {
            send_activity_to_actor($actor, $follower, $activityPayload);
        }
+2 −1
Original line number Diff line number Diff line
@@ -123,11 +123,12 @@ class ActivityModel extends UuidModel
    /**
     * @return Activity[]
     */
    public function getScheduledActivities(): array
    public function getScheduledActivities(int $limit = 10): array
    {
        return $this->where('`scheduled_at` <= UTC_TIMESTAMP()', null, false)
            ->where('status', 'queued')
            ->orderBy('scheduled_at', 'ASC')
            ->limit($limit)
            ->findAll();
    }