1
0
Fork 0
mirror of https://github.com/archtechx/tenancy.git synced 2026-08-06 04:54:04 +00:00
tenancy/tests
lukinovec 04da9c896b
[MINOR BC] Fix pending tenant pull race conditions (#1463)
> Minor breaking change: clearing pending_since no longer fires Eloquent
events, PullingPendingTenant is now fired at a different point in the
lifecycle and does not guarantee the tenant will actually be pulled.

`pullPendingFromPool` had a race condition when user A attempted to pull
a tenant at the same time as user B. Both could end up grabbing the same
tenant, and the result was unexpected, e.g. one of them ending up with
no pending tenant pulled at all even though there was a pending tenant
in the pool.

instead of selecting a pending tenant and updating the same model, we
now run `update()` conditionally -- it clears `pending_since` _only_ if
the tenant is still pending, and we check the affected row count. Only
one process can get a row back, the other gets 0 and retries with the
next pending candidate in the pool. The loop always terminates since
every lost claim means the pool shrank by one. Eventually it's empty and
we create a new tenant (or return null).

The claim and the attribute update happen in a single transaction now,
so if updating `$attributes` fails, the claim rolls back and the tenant
stays in the pool.

Added a regression test that simulates a concurrent "steal"
synchronously via a PullingPendingTenant listener. Fails with the old
code, passes with the HasPending changes.

Very minor BC:
- Clearing `pending_since` no longer fires model updating/updated events
(since the update goes through query builder). `PendingTenantPulled`
still fires the same as before and is the listener you'd want to use
anyway.
- `PullingPendingTenant` now fires before the claim (and outside the
transaction), so it can fire more than once with concurrent pulls (e.g.
when a tenant gets claimed by someone else). `PendingTenantPulled` is
still the one that fires exactly once for the actually pulled tenant.

---------

Co-authored-by: Samuel Stancl <samuel@archte.ch>
2026-06-25 19:51:39 -07:00
..
Bootstrappers TenancyUrlGenerator: override toRoute(), refactor (#1439) 2026-06-06 14:52:37 -07:00
Etc [MINOR BC BREAK] Syncing: PivotWithRelation -> PivotWithCentralResource 2025-11-26 05:52:55 +01:00
Features Add TenantConfigBootstrapper, deprecate Feature implementation 2025-09-26 13:49:15 +02:00
RLS [4.x] Fix dropRLSPolicies() (#1413) 2025-11-08 00:52:08 +01:00
ActionTest.php resolve minor todos 2025-08-18 15:05:17 +02:00
AutomaticModeTest.php [4.x] Add Tenancy::reinitialize() method (#1449) 2026-04-08 19:21:43 +02:00
BroadcastingTest.php [4.x] Laravel 12 support (#1321) 2025-02-25 16:26:18 +01:00
CachedTenantResolverTest.php [4.x] Support database cache store tenancy (#1290) (resolve #852) 2025-08-08 00:54:01 +02:00
CloneActionTest.php Cloning: improve type annotations, add cloneRoutes() for convenience 2025-11-10 02:16:57 +01:00
CombinedDomainAndSubdomainIdentificationTest.php [4.x] Laravel 12 support (#1321) 2025-02-25 16:26:18 +01:00
CommandsTest.php Add --skip-tenants option to HasTenantOptions (#1436) 2026-06-07 15:18:38 -07:00
DatabaseCacheBootstrapperTest.php [4.x] Support database cache store tenancy (#1290) (resolve #852) 2025-08-08 00:54:01 +02:00
DatabasePreparationTest.php Skip DB deletion when create_database=false, add ignoreFailures (#1394) 2026-05-01 21:57:19 +02:00
DatabaseUsersTest.php [4.x] Laravel 12 support (#1321) 2025-02-25 16:26:18 +01:00
DeleteDomainsJobTest.php Resolve test to-dos (#45) 2024-04-18 00:22:03 +02:00
DomainTest.php [4.x] Laravel 12 support (#1321) 2025-02-25 16:26:18 +01:00
EarlyIdentificationTest.php Correct DomainTenantResolver::isSubdomain() check (#1425) 2026-05-11 14:26:06 +02:00
EventListenerTest.php [4.x] Laravel 12 support (#1321) 2025-02-25 16:26:18 +01:00
GlobalCacheTest.php [4.x] Support database cache store tenancy (#1290) (resolve #852) 2025-08-08 00:54:01 +02:00
InitializedBootstrappersTest.php [4.x] Only revert initialized bootstrappers (#1385) 2025-08-05 11:12:25 +02:00
MailTest.php [4.x] Laravel 12 support (#1321) 2025-02-25 16:26:18 +01:00
MaintenanceModeTest.php Fix #1404: support universal routes in CheckTenantForMaintenanceMode 2025-10-14 17:22:35 +02:00
ManualModeTest.php [4.x] Laravel 12 support (#1321) 2025-02-25 16:26:18 +01:00
OriginHeaderIdentificationTest.php fix origin identification: parse hostname when full URL is used 2025-07-14 21:44:12 +02:00
PathIdentificationTest.php [4.x] Test that route model binding works correctly with path identification (#1360) 2025-06-02 19:05:17 +02:00
PendingTenantsTest.php [MINOR BC] Fix pending tenant pull race conditions (#1463) 2026-06-25 19:51:39 -07:00
Pest.php [4.x] Support database cache store tenancy (#1290) (resolve #852) 2025-08-08 00:54:01 +02:00
PreventAccessFromUnwantedDomainsTest.php [4.x] Laravel 12 support (#1321) 2025-02-25 16:26:18 +01:00
QueueTest.php [4.x] Laravel 12 support (#1321) 2025-02-25 16:26:18 +01:00
RequestDataIdentificationTest.php [4.x] Resolve testing todos (#1361) 2025-08-03 23:21:03 +02:00
ResourceSyncingTest.php Syncing: support morph maps in TriggerSyncingEvents 2025-12-12 03:43:52 +01:00
RouteMiddlewareTest.php Instead of assigning $innerMiddleware during group MW unpacking, merge it (#1371) 2025-07-01 17:23:13 +02:00
RunForMultipleTest.php [4.x] Fix 1267: early return in runForMultiple if an empty array is passed (#1286) 2025-02-14 08:19:02 +01:00
ScopeSessionsTest.php [4.x] Make ScopeSessions usable on universal routes (#1342) 2025-04-04 03:15:37 +02:00
SessionSeparationTest.php [4.x] Laravel 13 support (#1443) 2026-03-18 19:17:28 +01:00
SingleDatabaseTenancyTest.php [4.x] Laravel 12 support (#1321) 2025-02-25 16:26:18 +01:00
SingleDomainTenantTest.php [4.x] Laravel 12 support (#1321) 2025-02-25 16:26:18 +01:00
SubdomainTest.php Correct DomainTenantResolver::isSubdomain() check (#1425) 2026-05-11 14:26:06 +02:00
TenantAssetTest.php Remove TestCase::randomString() 2025-08-25 17:43:45 +02:00
TenantAwareCommandTest.php [4.x] Laravel 12 support (#1321) 2025-02-25 16:26:18 +01:00
TenantDatabaseManagerTest.php PHP 8.5 support 2025-10-20 01:44:24 +02:00
TenantModelTest.php Add UUIDv7Generator 2025-11-04 15:45:48 +01:00
TenantUserImpersonationTest.php [MINOR BC] UserImpersonation: store auth guard in session, add $logout param to stopImpersonating() (#1437) 2026-06-05 14:15:19 -07:00
TestCase.php PHP 8.5 support 2025-10-20 01:44:24 +02:00
UniversalRouteTest.php [4.x] Laravel 12 support (#1321) 2025-02-25 16:26:18 +01:00