Piantine pubblicate anche dopo un ripristino; posto unico senza gare

- Lo stato "Pubblicata" non dipende più dall'id del territorio, che il
  ripristino ricrea: l'impronta usa il numero, e la piantina ricorda il
  percorso del PDF pubblicato (pdf_pubblicato, con migrazione che riconosce
  le piantine già pubblicate).
- BackupOperationState: corrente() in sola lettura e liberaCorrente() sotto
  lo stesso mutex di occupa(), così una lettura non cancella il puntatore
  di un'operazione appena avviata.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-12 15:33:07 +02:00
parent 426a95211d
commit e7148c7b32
8 changed files with 143 additions and 22 deletions

View File

@@ -65,15 +65,27 @@ class BackupOperationStateTest extends TestCase
/**
* Il caso che il TTL da solo non copre: lo stato dell'operazione e' scaduto
* ma il puntatore no. Senza questa pulizia il posto resterebbe occupato da
* un'operazione che non esiste piu'.
* ma il puntatore no. Il posto deve risultare libero e potersi prendere;
* il puntatore lo sovrascrive l'operazione nuova (corrente() non lo
* cancella: girando fuori dal mutex poteva togliere quello di un'altra).
*/
public function test_un_puntatore_orfano_non_tiene_occupato_il_posto(): void
{
Cache::put(self::CHIAVE_CORRENTE, 'op-svanita', 3600);
$this->assertNull($this->stato->corrente());
$this->assertNull(Cache::get(self::CHIAVE_CORRENTE), 'Il puntatore orfano va anche rimosso.');
$this->assertNull($this->stato->occupa('op-nuova', BackupOperationState::TIPO_BACKUP, 'In coda'));
$this->assertSame('op-nuova', $this->stato->corrente());
}
/** Un corrente() fuori dal mutex non deve togliere il puntatore appena scritto. */
public function test_corrente_non_cancella_il_puntatore(): void
{
Cache::put(self::CHIAVE_CORRENTE, 'op-svanita', 3600);
$this->stato->corrente();
$this->assertSame('op-svanita', Cache::get(self::CHIAVE_CORRENTE));
}
public function test_un_puntatore_a_un_operazione_gia_chiusa_non_tiene_occupato_il_posto(): void
@@ -90,7 +102,7 @@ class BackupOperationStateTest extends TestCase
Cache::put(self::CHIAVE_CORRENTE, 'op-1', 3600);
$this->assertNull($this->stato->corrente());
$this->assertNull(Cache::get(self::CHIAVE_CORRENTE));
$this->assertNull($this->stato->occupa('op-2', BackupOperationState::TIPO_BACKUP, 'In coda'));
}
/**