Changelog
Cosa c'è di nuovo.
Ogni miglioramento alla piattaforma, come si spedisce.
· kamo-shared-library
Ripristinare gli errori del database Yugabyte si aspetta che un cliente riprova
Applicare DDL urta la versione del catalogo, e ogni backend fisico ancora in possesso il vecchio fallisce la sua prossima dichiarazione con SQLState 40001 — "versione di schema mismatch per tavolo ...: previsto 94, ottenuto 93". Hibernate non lo riprova, quindi raggiunge un utente come 500. L'ultima occorrenza produsse 188 di loro oltre quindici minuti, ed è arrivato come un bug relazione su un widget: il fallire query è quasi sempre un carico di identità noioso che corre prima su ogni richiesta autenticata, in modo che qualsiasi caratteristica grida più forte viene incolpato. Non c'è impostazione che rimuove questo. La guida operativa di Yugabyte dice DML corrente durante DDL "può usare il vecchio schema, il nuovo schema o l'incontro errori di errore dello schema temporaneo che richiedono retries client-side", e i due bandiere di server che restringono la finestra non sono impostabili a runtime — controllati con yb-ts-cli, che rifiuta sia senza forza - in modo da cambiare entrambi i costi riavviare un database che esegue un master e un tserver. Una nota precedente in questo codebase ha incolpato la massima vita di HikariCP e suggerito abbassandolo. Questo non avrebbe fatto nulla: il tserver corre --enable ysql conn mgr=true, così le piscine Java tengono connessioni LOGICAL in Il gestore della connessione di Yugabyte e il catalogo stantio vivono in una fisica condivisa backends la piscina non possiede. Non costa nulla quando nulla è sbagliato: riprovare è guidato interamente da un'eccezione un cluster sano non getta mai, quindi il percorso di stato stabile è una chiamata di agnello. Deliberatamente restringe su ciò che cercherà — una violazione di vincolo è la database che dice che la scrittura è sbagliata, non che è stato sfortunato e riprova trasforma un errore veloce in tre lenti. Un fallimento inconcludente è lasciato da solo. Lo stesso 40001 copre anche veri conflitti di serializzazione e Yugabyte riavviare, entrambi raggiungono gli utenti come 500 oggi. Niente lo chiama ancora; il cablaggio segue.
· KlusterServices
Dire se un terminale sta lavorando o aspettando il suo membro
Ogni terminale nella lista ora porta `stato`: occupato, o in attesa. E'... una domanda che qualcuno fa di una finestra che non possono vedere, ed è quello che un il colore di hexhead minimizzato risponderà. Un SHELL è in attesa quando il comando primo è un guscio — `pane current command` è quello che tmux vede già nel pannello, quindi questo non ha bisogno di contabilità e non può andare Stale. Qualsiasi altra cosa in primo piano è il lavoro che il membro ha iniziato. pensare o inattivo. La sua trascrizione risponde invece, dall'ultima cosa che qualcuno realmente SAID: assistente, stop reason end turn -> ha risposto e consegnato indietro: assistente, stop reason tool use -> è in esecuzione qualcosa: BUSY utente -> appena presentato, niente di nuovo ancora: BUSY L'ultima LINE è quasi sempre contabilità — costo, latches, operazioni di coda, istantanee di file, tutte allegate dopo la risposta — così la lettura riferirebbe ogni sessione idle come occupato. La scansione torna all'ultimo record di conversazione. Sconosciuto legge come WAITING, deliberatamente: un "busy" sbagliato dipinge una finestra verde e nasconde che ha bisogno di qualcuno, dove un "aspettare" sbagliato disegna solo l'occhio. Questo è la direzione più sicura per una luce di stato di essere sbagliato in. L'elenco chiede quindi tmux per un ottavo campo. Il titolo rimane LAST e il split stays bounded; `pane current command` è un nome di comando nudo senza argomenti, quindi non può trasportare il separatore. Verificato sulla macchina, non solo in apparecchi: di dodici sessioni reali i sette che stavano lavorando leggere occupato e i cinque che avevano finito di leggere l'attesa — e caso shell è stato controllato contro un live `bash` (aspettando) e un `sleep` live (busy). 226 test.
· kamo-internal
Scegli il modello e lo sforzo prima di iniziare una sessione di coder, una volta
Invia alla finestra di dialogo AI ha, e i due sono la scelta SAME piuttosto che due. Qualcuno che si è stabilito su Sonnet all'Altissimo ci ha risolti. Re-picking nel altro posto ogni volta è il tipo di attrito che nessuno avrebbe mai segnalato come un bug e tutti si sentono ogni giorno, quindi la coppia viene memorizzata come preferenza UI membro — circa la persona, non il browser, quindi un computer portatile e un desktop concordare e sgomberare un browser non li rimette tranquillamente su Opus. Guida la mappa delle preferenze il launchpad già legge una volta per carico pagina, quindi volendo non costa più richiesta sulla prima vernice. Entrambe le superfici possono essere aperte subito — l'Interaction Center è un pannello sopra pagina una finestra di dialogo Invia all'intelligenza artificiale — quindi viene annunciato un cambiamento così come scritto, e l'altro segue senza essere rimontato. Tre cose che vale la pena di chiamare: - La finestra di dialogo Invia all'intelligenza artificiale non ri-seeds modello e sforzo quando si apre. Si'. ha fatto, quando erano stato locale, e lasciare che in avrebbe scritto i di default tornano sulla scelta permanente del membro ogni volta che un bug segnala è stato inviato — l'esatto opposto di ricordarlo. - Una preferenza memorizzata supera il codice che lo ha scritto, quindi è controllato piuttosto di fiducia, e PER FIELD: un modello ritirato tra le versioni non deve anche costo al membro lo sforzo che hanno scelto. Qualunque cosa non riconosciuta ricade indietro, che mantiene una selezione dal rendering di un valore che non è una delle sue opzioni — che mostra come una scatola vuota, ed è come qualcuno scopre la loro impostazione essendo Se n'e' andato. - Le selezioni sono autoctone disegnate dalla tavolozza. Questo pannello è dipinto da i colori dell'applicazione su una superficie e l'emulatore è sull'altra, e MUI Selezionare rende il menu in un portale che avrebbe bisogno dell'intera tavolozza filettato attraverso di esso per evitare una lista bianca cadere da un pannello nero. A controllo nativo ottiene che da `color-scheme` e porta tastiera corretta e comportamento di schermo-reader con esso. Riprendere una sessione utilizza anche la scelta in piedi: raccogliere una conversazione indietro e scegliere un modello sono decisioni separate. Nessun nuovo dizionario chiavi — le etichette Model e Effort e ogni nome di opzione sono la finestra di dialogo Invia all'intelligenza artificiale, riutilizzata piuttosto che duplicata in modo che non possano derivare. 13 di 14 guardie e 5363 test passano. check-i18n-keys è attualmente rosso su un altro La sessione e' in volo, non su niente.
· SecurityService
Portare il modello e lo sforzo del membro a una sessione di coder
e deliberatamente non esaminato qui. `coder flags` sull'agente è l'unica cosa che decide cosa una sessione funziona con — il proprio commento lo chiama «il confine di sicurezza dell'intera spedizione percorso» — quindi un secondo vocabolario in questo servizio sarebbe una seconda opinione potrebbe non essere d'accordo con esso, e quello che non era d'accordo sarebbe quello che nessuno era lettura. Qualsiasi cosa al di fuori torna come un rifiuto con una frase la console stampa verbatim, esattamente come una directory di lavoro sconosciuta già fa. chiamante che anticipa questo invio.
· KlusterServices
Lasci una sessione di coder eseguire al modello e lo sforzo del membro scelto
per una nuova sessione e per una ripresa simile, da `--model` e `--effort` sono bandiere per sessione in entrambi i casi. Essi sono la parte SOLO del comando che un chiamante può influenzare, e ancora non può esprimere una bandiera: entrambi passano attraverso `coder flags`, lo stesso vocabolario fisso la spedizione Send-to-AI utilizza, che mappa un nome su argomenti fissi e solleva su qualsiasi altra cosa. La modalità di autorizzazione non è raggiungibile da qui e non diventare un parametro. Il nome NEITHER è permesso e significa "qualunque sia la configurazione del membro dice» — una risposta migliore di uno che questo agente ha inventato, e che qualsiasi chiamante che predate questo invia. Nome solo UN è rifiutato: correre al loro modello ma Lo sforzo di qualcun altro non è quello che o la risposta ha significato. Ultra Code è xhigh più una parola chiave nel MESSAGE, e una sessione interattiva non ha alcun messaggio per l'agente di metterlo dentro. Quindi corre a xhigh e la parola stessa, che è il comportamento onesto piuttosto che un silenzioso downgrade vestito come qualcos'altro. 215 test.
· kamo-internal
Nome una testa di esagonale dopo la finestra che sta per
Il tooltip di un hexhead ha letto "User w12" — la testa id, che è la finestra id, in un stringa scritta per gli avatar membri. Una banchina di sei finestre minimizzate era di sei etichette identiche, quindi l'unico modo per trovare quello che volevi era aprirle. Il titolo era già lì: ogni abito porta il titolo della finestra (il negozio richiede), il menu contestuale lo mostra già, e HexHead aveva già un `alt` prop alimentando sia il suo tooltip e il suo nome accessibile che nulla mai passato. Discussione `head.title` lungo il palco e la primavera in esso. Tienilo aggiornato. Una testa è deposta con il titolo che la finestra aveva al momento è stato minimizzato, e i titoli continuano a muoversi dopo che — una chat rinominata sopra la presa, un cambio roster, una sessione AI chiamata dal server una volta che risposte. Il bus degli strumenti ora rispecchia `tool:title` come `hexheads:title`, e motore si applica il modo in cui si applica conteggi non letti: assoluto, stesso-array su no cambiamento, e mai deporre una testa per una finestra che non ha nessuno.
· SecurityService
Rifiutare un sign-in il cui host non nomina organizzazione
Un tale ospite potrebbe firmare fino ad ora. È caduto attraverso al workspace-choice percorso e riuscito a aderire da solo, che lo ha reso una porta dove nessuno controlli propri dell'inquilino applicati: regole di accesso e blocchi geo sono per-organizzazione, così decidere(ip, host) potrebbe mai rispondere "permesso - nessuna organizzazione possiede questo ospite". Nulla è stato bypassato in modo definitivo, perché l'adesione era ancora provata e completeSignIn ricontrolla le regole una volta scelto uno spazio di lavoro. Ma le credenziali controllarsi seduto dietro nessun criterio inquilino, raggiungibile indicando qualsiasi DNS nome all'ingresso, e la scala di blocco aggiunto accanto a esso non aveva bloccolist per escalare in e contato sotto un inquilino sintetico. Rifiutata prima che le credenziali vengano lette e prima della porta di blocco. Ordine è metà del punto: un host sconosciuto non è una password sbagliata, quindi contarlo sarebbe camminare un utente legittimo verso un blocco sopra l'errore DNS di un operatore, e rifiutare qui significa che i contatori sintetici non sono mai creati affatto. Ha detto chiaramente piuttosto che dietro il rifiuto delle credenziali generiche. Che ospita questo risposte della piattaforma su non è un segreto — Traefik già percorsi da esso — e un operatore che solleva un nuovo dominio inquilino che viene detto "password sbagliata" spenderà il pomeriggio a resettare uno. Due carve-out, entrambi deliberati: localhost. OrgResolutionService.byHost lo esclude esplicitamente, quindi non può mai nome di un'organizzazione e il cancello altrimenti fare lo sviluppo locale impossibile. E 'deciso dal HOST, rispecchiando che carve-out esistente, NON da "l'indirizzo del chiamante non è pubblico" — ogni richiesta all'interno del cluster guarda in quel modo, così il giorno X-Forwarded-Per rotture di inoltro in produzione che la versione del test avrebbe spento il cancello attraverso la flotta. Loopback solo letterali; un nome di servizio nudo non è esente. Un interruttore di emergenza, un interruttore di emergenza. Se una tabella di dominio problema ferma mai legittimi padroni di casa risolvendo, signin deve essere riaperto senza ridistribuzione — e riapertura restaura il vecchio sentiero esattamente piuttosto che un terzo comportamento. Un ospite esente deve mantenere DEFERRING a scelta dello spazio di lavoro, non semplicemente superare il Il cancello. Inviarlo lungo il percorso risolto dall'ospite invece lo rompe più tranquillamente: la forma a tre argomenti dell'utente si rifiuta senza un FQDN risolto, quindi "ospite sconosciuto" sarebbe arrivato vestito come una password sbagliata. E' vero. difetto nel primo taglio di questo cambiamento, catturato chiedendo che cosa localhost fa Il prossimo.
· KlusterServices
Un terminale coder indossa il nome coder ha dato la conversazione
da tempo era stato intitolato "Iniziare l'implementazione delle commissioni e Harmony regolazione del conto". Due cose separate stavano ingoiando quel nome. La lista. Il titolo era WRITTEN una volta, a bootstrap, come segnaposto. Si'. una conversazione in pochi secondi e lo rinomina più tardi se il lavoro risulta essere qualcos'altro, quindi una copia memorizzata è sbagliata quasi immediatamente — lo stesso argomento il resto di questo file già fa per la lettura di tmux e il disco piuttosto che tenere un tavolo. Costa ~6ms anche contro una trascrizione di 205 MB, perché coderSessionIndex legge solo le due estremità di un file e memorizza su (mtime, dimensioni). **La finestra.** il `set-titles` di tmux è OFF per impostazione predefinita, quindi l'applicazione emettere tutto il tempo — il titolo del pannello era già giusto mentre la finestra dell'utensile perché il default di tmux prefiggerebbe ogni nome con è il nome host: che andrebbe in pensione ogni terminale "desktop-1" sopra il nome L'ha dato il membro. a colpo d'occhio e il nome non cambia forma tra l'apertura della finestra e l'elenco di cattura — lo stesso modulo SecurityService utilizza già per etichetta iniziale. Un nome il MEMBER digitato vince ancora ed è lasciato esattamente come digitato; un nome derivato che sopravvaluta avrebbe fatto la bugia del campo di rinomina. L'unica eccezione è un memorizzato titolare lo è, quindi i terminali aperti prima che questo cambiamento inizi a derivare loro piuttosto che bisogno di opzioni tmux di qualcuno riscritto. L'unione vive nel /terminals handler piuttosto che dentro la metà — TerminalManager conosce solo tmux, coderSession Indice conosce solo il disco, e né dovrebbe conoscere l'altro per rispondere alla sua domanda. 212 test. Verificato contro la live machine: il terminale in esecuzione si risolve
· kamo-internal
Mostra il blocco di segnale come regola che non può essere spento
SecurityService applica ora un blocco progressivo di segnale a ogni organizzazione se esiste o meno una fila per essa — cinque tentativi liberi, poi cinque secondi, allora serrature di cinque, quindici e trenta minuti, poi un blocco IP permanente. Rilevazione Le regole sono dove un amministratore va a scoprire cosa li protegge, quindi deve dirlo. È la prima regola su questo schermo il cui interruttore è bloccato su, che ha bisogno di più che un ingresso disabilitato. La fila siede prima, stagnata, con un lucchetto, un "sempre su" chip e la scala reso in sola lettura come chip — perché una protezione che non può essere configurato ancora deve essere leggibile, e "PROGRESSIVE LOGIN LOCKOUT" da solo dice a un amministratore nulla di ciò che accadrà ai loro utenti. Il pulsante di cancellazione è ABSENT piuttosto che disattivato. Deleting è l'altro modo per spegnere una regola; SecurityService lo rifiuta con un 409 in entrambi i modi, e un pulsante il cui unico risultato è un rifiuto è un pulsante che mente. Stesso ragionamento per la finestra di dialogo Modifica, che per questa regola mostra la scala in sola lettura e l'avviso — l'unico campo che un inquilino possiede effettivamente. Il server ignora l'altro campi sul modo in cui, così rendering loro offrirebbe modifiche che silenziosamente non Salva. L'interruttore bloccato si chiama attraverso slotProps.input. Le parole della fila vivono in un elemento fratellino, quindi senza di esso un lettore di schermo annuncia "checkbox, controllato" e nient'altro — e la punta dello strumento che porta la ragione per la serratura non è raggiungibile da quella parte. inputProps sarebbe stato abbandonato silenziosamente da MUI Interruttore; check-switch-aria esiste perché questo ha morso questo repo prima. Non c'è nulla che faccia rispettare, e i test dicono così: l'applicazione è bloccata Il Test di DetectionRuleMandatory di SecurityService. Ciò che è qui è che schermo non mente su di esso — l'interruttore non può muoversi, l'eliminazione non è offerto, la scala è visibile, e una regola ordinaria mantiene ogni controllo sempre avuto, quindi la serratura è su questo tipo di regola e non su regole di rilevamento in generale. Le chiavi del dizionario sono state spinte prima al kamo-traduttivo-dizionario; successivo rende un percorso chiave mancante verbatim, e messaggi / è gitignored qui, così il altre navi di ordine visibili gibberish che una costruzione locale verde non cattura.
· kamo-login
Mostra il blocco progressivo, quindi un segnale tenuto si spiega
Il server ora rifiuta i segni su una scala — cinque tentativi liberi, poi cinque secondi, poi serrature di cinque, quindici e trenta minuti, poi un blocco permanente. Senza alcuno di questo lo schermo risponderebbe a tutto questo con " username non valido o password" e un pulsante che tranquillamente non fa nulla, che legge come il sito essere rotto piuttosto che come un controllo di sicurezza funziona. Quattro stati, e le differenze tra loro sono il disegno: Un METER STRIKE appare sotto il campo password una volta che i guasti iniziano accumulando, dicendo quanti tentativi rimangono prima di firmare in pause e per Quanto tempo. Qualcuno che ha veramente dimenticato la loro password dovrebbe essere nudge verso il link di reset PRIMA che sono bloccati, non dopo. L'attesa FIVE-SECOND rimane in linea: il pulsante Sign in diventa un conto alla rovescia con un bar che lo scola. Portare via il modulo e rimetterlo a posto per cinque i secondi sarebbero più distruttivi dell'attesa. Un blocco di MINUTI prende sopra la carta — un anello che svuota, un mm:ss conto alla rovescia, e una fuga di password di reset, perché dal decimo fallimento la password è dimenticato piuttosto che mistypeed e il recupero è una porta questo blocco non vicino. Esso supera la forma piuttosto che sostituirla: i campi rimangono montati e disabilitato in modo che un gestore di password mid-fill non perde il suo obiettivo. Un BLOCK PERMANENTE non ottiene alcun conto alla rovescia, nessun anello e nessuna garanzia di riprovazione. An animazione che implica qualcosa sta arrivando quando niente sarebbe una bugia lentamente. Dice che il conto non è la cosa che è stato bloccato, perché questo è vero ed è la prima cosa che la persona vorrà sapere. Nessuna politica vive qui. Il browser possiede il conto alla rovescia e nient'altro — un secondo copia della scala in codice client è una copia che un attaccante può modificare e una copia che deriva il momento in cui entrambi i lati cambia. Questo repo è stato morso proprio da questo prima: il Node access-rule check rispetto tipi di regola contro "whitelist" mentre l'editore ha scritto "WHITELIST", non ha abbinato nulla, e nessuno l'ha notato. Quindi l'API percorsi relay i numeri del server intatti, incluso invio 429 come se stesso piuttosto che collassarlo in 400, che riferirebbe "una cattiva richiesta" risposta il cui contenuto è quanto tempo aspettare. Un blocco non scuote il campo password o seleziona il suo contenuto. Il frullato significa "ha digitato la password sbagliata", e durante una attesa la password non è mai stata ha guardato — incolpare il campo sarebbe incolpare la cosa sbagliata. Tutti e quattro gli stati resi e letti indietro con burattinaio contro server in scatola risposte, perché una costruzione verde non dimostra nulla su come una pagina sembra. Ridotto il movimento è onorato esplicitamente; il moto/reazione non lo onora da solo.
· SecurityService
Bloccaggio progressivo del segnale in, escalation a un blocco IP permanente
Una password sbagliata ora costa qualcosa, e il costo sale. Contato dal ultimo successo del soggetto: i primi cinque fallimenti sono liberi, il sesto e ogni dopo aspettare cinque secondi, e il decimo, il ventesimo e i trentesimi tengono la porta per cinque, quindici e trenta minuti. Il quarantesimo mette l'indirizzo sul blocco permanente dell'organizzazione e mails sysadmin. L'OMS è considerato la parte che vale la pena di leggere. L'argomento è normalmente il (indirizzo, Identificatore) PAIR, non solo a metà. Contare l'identificatore da solo avrebbe lasciato chi conosce un nome utente blocca il suo proprietario dall'altra parte del mondo; contare l'indirizzo da solo avrebbe lasciato una persona dietro un ufficio condiviso La NAT chiude i suoi colleghi. Una scala di sola coppia ha un foro, però — spray una password attraverso duecento nomi utente e nessuna singola coppia mai raggiunge sei — così un indirizzo visto fallire contro più di dieci identificatori DISTINCT diventa un soggetto a proprio diritto, e da allora su ogni guasto da esso conta su uno scala qualsiasi account che nomi. Il più duro dei due governa. Controllato PRIMA la password viene confrontata, ad ogni terminus porta credenziali: entrambi i percorsi di accesso e la sfida MFA, il cui spazio a sei cifre ottiene il proprio scala così un autenticatore fumbled non può spendere il budget del passaggio password. A chiamante che può ancora misurare la differenza tra una destra e una password sbagliata mentre chiuso fuori ha un oracolo funzionante e un blocco che spreca solo il loro tempo. I guasti sono contati per gli identificatori che il nome nessuno, esattamente come per quelli che do. Contare solo account reali farebbe un nome utente sbagliato a buon mercato e un diritto un costoso, che è un oracolo di elaborazione del conto costruito dalla latenza. Redis-backed, 30 giorni scorrevole TTL, sgomberato dove lastLoginService già francobolli un vero segnale. Fail-open su ogni errore Redis, corrispondente AccessDecisionService dottrina: un blocco che non si chiude su un wobble infrastruttura blocca ogni inquilino dalla loro piattaforma. I guasti sono registrati con il buttabile, non solo il suo messaggio — un difetto di questo cammino è altrimenti indistinguibile da un outage, e avrebbe disattivato silenziosamente l'intero controllo. Il quarantesimo fallimento blocca l'indirizzo da solo piuttosto che affidarsi a chiamante per andare avanti e scrivere la riga blocklist. Quella fila siede dietro un 30 secondi verdetto cache, e su un host che nomina nessuna organizzazione non c'è fila per scrivere a tutti; un controllo che dipende dal suo chiamante per essere efficace è uno dopo refactor si spegne per caso. PROGRESSIVE LOGIN LOCKOUT appare in Regole di rilevamento di regola che non possono essere spento o cancellato, e le cui soglie non sono dati inquilini — un modificabile soglia è un interruttore spento che indossa un cappello diverso. I destinatari rimangono modificabili, o l'avviso di blocco potrebbe raggiungere solo l'operatore della piattaforma. La serratura vive dentro il servizio, non il controller: un cancello che può essere raggiunto intorno non è un cancello. La riga è materializzata su READ, perché ogni organizzazione esistente già detiene le cinque regole originali e non raggiungerebbe mai il ramo seme-on-empty.
· kamo-internal
Mostra un membro l'URI redirect sul proprio dominio
Questo è lo schermo per cui l'intero cambiamento è. Un membro che imposta Google Workspace con la propria app OAuth della loro organizzazione viene qui per trovare il indirizzo per incollare nella console di Google — e trovato api.kamocrm.com, hardcoded in catalogo, per un'organizzazione che ha verificato la propria dominio e i cui membri non vedono mai il nome host di Kamo altrove. L'indirizzo viene ora dal server, per organizzazione, ed è reso sola lettura piuttosto che come casella di testo. Non è una scelta stilistica: niente leggere mai un valore digitato in quel campo. EmailService, MediaService e VOIPService ogni ripeti il proprio reindirizzamento configurato sul token scambio, quindi un URI un org digitato qui è stato mostrato loro e ignorato — e un org che ha digitato uno che non era d'accordo con quello che il servizio invia ottenuto un redirect uri mismatch da dentro Google con nulla su questo schermo a spiegalo. Non è più inviato su salvare, quindi nessuna stringa memorizzata può guardare autorevole sul prossimo carico. Ogni richiamo è reso, non solo il primo. One Microsoft la registrazione è l'app mailbox e l'app Teams-meetings; ogni metà completa sul callback del proprio servizio, quindi Entra ha bisogno sia e mostra uno lascia l'altro fallire senza sapere quale URI è stato inviato. Lo stesso vale per la carta della piattaforma, così callbackUrl è diventato callbackUrls lì anche — e Microsoft, Zoho, Zoom, Teams, Meta e Canva hanno guadagnato le voci non avevano mai avuto, che aveva lasciato un operatore di piattaforma senza indirizzo registrarsi a tutti. La lista del catalogo rimane solo sulla piattaforma e lo dice. L'app di Kamo sempre corre sull'host della piattaforma; riutilizzare quella lista per un'organizzazione mettere il nome host della piattaforma davanti a un inquilino bianco-labelled e dire loro per registrare un indirizzo il loro flusso non invia mai.
· SecurityService
Servire ogni org l'URL di callback sul proprio dominio
Questo endpoint è dove un membro trova la stringa che incollano in Google's console, quindi è il punto finale sbagliato: è tornato solo il reindirizzare l'org aveva digitato, e lo schermo riempito il vuoto con un hardcoded api.kamocrm.com — il nome host della piattaforma, di fronte a un inquilino bianco-labelled, per un'app che inquilino si è registrato. callbackUrls è server-computed e sola lettura. L'ospite viene da questo il dominio verificato dell'organizzazione e i percorsi da OAuthCallbackPaths, che è la stessa tabella EmailService, MediaService e VOIPService costruire il loro reindirizzamento da — così l'indirizzo indicato qui e l'indirizzo inviato sul filo sono una stringa per costruzione piuttosto che per accordo. Avere quel male non ha sintomo locale; si estrae all'interno di un terzo, settimane dopo, come redirect uri mismatch. Una lista, non una stringa: una registrazione Microsoft è l'app mailbox e l'app Teams-meetings, e ogni metà completa sul proprio servizio callback, quindi Entra ha bisogno sia registrato che lo schermo deve dirlo. Vuoto per un fornitore il cui callback Kamo non serve — X non ha connessione flusso, e ogni fornitore di payroll completa su una pagina interna kamo host workspace. Quelli mantengono il loro campo modificabile piuttosto che essere consegnati Api.* non ascolta nulla. OrgDomains.verifiedRootDomain ora delegati al predicato condiviso per la stessa ragione: due copie della regola permetterebbero questa schermata e la servizi non sono d'accordo su quali percorsi di dominio.
· VOIPService
Ripiegare il nome host dell'org per il reindirizzamento delle squadre
Un redirect l'org digitato nella propria registrazione vince ancora in modo definitivo — Microsoft richiede l'URI riprodotto sullo scambio di token per abbinare il autorizzazione byte-for-byte, quindi qualsiasi cosa sia entrata in quella app Entra è la solo risposta corretta, e una connessione esistente non deve muoversi. Ciò che cambia è il fallback sotto di esso. Un org sulla propria app senza il reindirizzamento memorizzato stava ottenendo il nome host della piattaforma; ora ottiene api. Un org su L'app multi-tenant di Kamo mantiene l'host della piattaforma, da quella registrazione ha un reindirizzamento e un indirizzo per-org contro di esso è un errore. Entrambi i controller VOIP OAuth hanno già percorso attraverso questo metodo, quindi l'org e il membro collegano le gambe si muovono insieme.
· MediaService
Invia un nome host dell'org come reindirizzamento dell'incontro OAuth
La stessa regola del flusso di posta ora segue, per gli incontri Zoom e Teams: un'organizzazione sulla sua app OWN ha registrato tale app contro api. Il callback è pubblico e senza sessione, così sia l'organizzazione che la il fornitore esce da `state` — il fornitore e l'org, perché un org può essere sulla propria app Zoom e l'app di Kamo Entra subito e la due devono avere risposte diverse. Un org sull'app di Kamo mantiene l'host della piattaforma: quella registrazione contiene una reindirizzare URI e un indirizzo per-org contro di esso è un errore nessuno può da dentro Kamo.
· EmailService
Inviare un nome host di org come la casella di posta OAuth redirect
Un'organizzazione che ha portato la propria Google o Entra app registrata che app nel proprio conto, sotto il proprio marchio, e ora è detto sul suo Impostazioni schermo per autorizzare api. Questo rende il servizio Mandalo. Entrambe le gambe passano attraverso uno scegliente, perché devono concordare: il valore sulla richiesta di autorizzazione e sul valore riprodotto sullo scambio di token deve essere byte-identical o il fornitore rifiuta lo scambio. Il richiamo leg è pubblica e senza sessione — il browser arriva dal fornitore senza sessione di Kamo — così l'organizzazione esce da `state`, che è perché orgIdFromState esiste accanto al providerFromState. E' arrivato sul punto di possedere il cliente, e quel cancello non e' incidentale. La registrazione della piattaforma di Kamo detiene esattamente un URI redirect, sul host piattaforma; inviare un indirizzo per-org contro di esso è un redirect uri mismatch l'org non può risolvere da nessuna parte all'interno di Kamo, perché non possiedono quel progetto Google. hasOrgOwnClient è lo stesso domanda PlatformOAuthClientResolver risponde quando sceglie quale client id per inviare, in modo che le credenziali e il reindirizzamento non possono mai disaccordo su che app sta collegando. Solo l'autorità viene riscritta, quindi GOOGLE OAUTH REDIRECT URI mantiene la sua percorso e il suo schema. OAuthRedirectUriTest chiama il proprio scegliente privato del controller piuttosto che riaffermare, e perni i default configurati contro OAuthCallbackPaths — la tabella la schermata delle impostazioni legge. Quella guardia è il punto del file di prova: se i due alla deriva, niente qui non riesce. Si'. fallisce all'interno di Google, settimane dopo, per un'organizzazione che ha copiato stringa fuori uno schermo che era già sbagliato. Ha anche catturato l'unico vero bug in questo cambiamento: piattaformaProviderFor accende l'enum, e un interruttore sopra un null enum lancia piuttosto che cadere al suo braccio predefinito — così un callback il cui stato non decodificare ha preso un NPE sulla strada per la sua pagina di errore.
· kamo-shared-library
Disporre i callback OAuth di un org al proprio dominio
Un URI redirect OAuth è tenuto da un terzo. Un membro lo incolla in Console di Google o Microsoft, e da allora sul valore del servizio invia sulla richiesta di autorizzazione e rigiochi sullo scambio di token per abbinare quello che hanno digitato, carattere per carattere. Così l'indirizzo una schermata delle impostazioni SHOWS e l'indirizzo un servizio SENDS sono una domanda, e fino ad ora sono stati risolti da diverse costanti in diversi repository — con il nome host della piattaforma cotta in entrambi. Un'organizzazione che ha verificato acme.com registra la propria app OAuth, nel proprio account Google, sotto il proprio marchio, e è stato detto di autorizzare api.kamocrm.com. OrgApiHosts risponde "che ospite" e OAuthCallback Percorsi risponde "che percorso", e tra loro sono l'unica definizione SecurityService, EmailService, MediaService e VOIPService tutti letti. Il predicato di dominio è quello che il percorso di accesso già percorsi su — attivo, alias-less, proprietà verified, ssl confirmed — e ogni la condizione guadagna il suo posto qui per la propria ragione. proprietà verified perché i duplicati tra org sono legali, quindi una riga non verificata invierebbe il callback di un fornitore, portando un codice di autorizzazione dal vivo, a qualcuno L'altro ospite. ssl confirmed perché `api` è una delle etichette del SSL sonda copre, in modo che la bandiera è ciò che rende api. certificato piuttosto che un browser interstiziale che ingoia il codice. riHost riscrive solo l'autorità, quindi un operatore che ha spostato un callback in configurazione mantiene il loro percorso e il loro schema, e un valore che non può essere parsed è restituito intatto piuttosto che sostituito da un'ipotesi. Un fornitore può possedere più di un callback: un singolo Microsoft la registrazione è la mailbox app e l'app Teams-meetings, e ogni metà completa sul proprio percorso di servizio — così Entra ha bisogno sia, e solo un la lista può dirlo.
· SecurityService
I dettagli del conto utente appartengono al loro proprietario, o a un operatore
Una regola, in un unico luogo, per i tre endpoint che scrivono un conto USER: il aggiornamento dei membri del profilo, l'indirizzo personale del profilo e la piattaforma Utenti scheda. Essi governano gli stessi dati e si erano allontanati in tre diverse risposte. UserAccountEditPolicy: la persona stessa, un operatore divinile, Utente di sistema, o un amministratore di piattaforma in possesso di MANAGE USERS / SYSTEM USER — la scheda Utenti su /account. La precondizione dell'organizzazione di alto livello cavalca lungo free, dal momento che PlatformRightsResolver non risolve nulla per una sessione in un inquilino. Due cose che cade deliberatamente. MANAGE MEMBERS e MANAGE MEMBER SECURITY non raggiungono più il nome legale, il nome preferito o la data di nascita. Questi sono diritti TENANT su un conto ogni organizzazione la persona appartiene alle azioni, e un amministratore inquilino può modificare i modelli di sicurezza della propria organizzazione — in modo che un inquilino possa concedersi la capacità di riscrivere l'identità che tutti gli altri vedono. Lo stesso ragionamento ha sempre li ha tenuti fuori dalla password. Questa era anche l'unica regola del punto finale esecutiva, quindi ora è più severa di prima piuttosto che semplicemente diversa. "L'organizzazione attuale possiede il conto" è andato. Si legge come il naturale salvaguardare ed era un vicolo cieco: la piattaforma fornisce il conto 77 di 141 membri, e 37 di queste persone non sono membri dell'organizzazione che possiede il proprio account — quindi non esisteva spazio di lavoro in cui potrebbero mai modificare il proprio nome, nome preferito o indirizzo personale. Ha anche risposto domanda sbagliata per il proprietario, che è un PERSON, non un'organizzazione. Prova della mailbox è intatto ed è la salvaguardia che in realtà conta per l'indirizzo. La politica risolve i propri armamenti anche quando l'account di destinazione non può essere Leggi. Rifiutare tutti su un obiettivo sconosciuto suona come fallire chiuso ed è veramente sbagliando: lascerebbe un conto che nessuno potrebbe correggere, che è lo stato un operatore esiste per uscire. `isSelf` sull'aggiornamento dei membri soggiorna da MEMBER id: una sessione di impersonazione ha ha avuto il suo membroID scambiato al bersaglio, e una sessione sudo è destinata ad agire come quel membro lo farebbe.
· kamo-shared-library
Una regola di rilevamento un org non può spegnere, e la lettera che invia
PROGRESSIVE LOGIN LOCKOUT unisce DetectionRuleType. Ogni altro valore su questo enum descrive qualcosa in cui un inquilino opta; questo descrive un controllo Sicurezza Il servizio si applica a ogni firma-in se esiste una riga o meno. La fila esiste quindi la politica è visibile sulla schermata di sicurezza e i suoi destinatari di avviso sono configurabili — non così può essere spento. La scala stessa non è per-org dati e non vive nella tabella. 26 caratteri, quindi si adatta a rule type varchar(30) senza DDL, e la colonna è mappato EnumType.STRING, così appending rilabels nessuna riga esistente. LOGIN LOCKOUT IP BLOCKED è la lettera inviata quando un indirizzo esaurisce l'intero scala e atterra sul blocco permanente. È l'unico avvertimento in questa famiglia il cui soggetto non è membro — si tratta di un indirizzo di attacco — così ogni il campo che trasporta è controllato dagli aggressori e ognuno di loro utilizza il gemello. TemplateRenderer non esce da solo.
· kamo-internal
Un operatore può impostare un indirizzo personale e chiedere informazioni sul conto giusto
Due modifiche al profilo del membro, sia sulla stessa confusione: quale persona la domanda è in corso. La carta di posta elettronica personale non è più auto-solo. Un operatore divinile e L'utente di sistema può impostare chiunque, perché il membro che ne ha bisogno è cambiato di solito chi ha appena detto la loro vecchia casella di posta è irraggiungibile — il caso il flusso del membro non può servire, dal momento che funziona spedindo quell'indirizzo. Deliberatamente non MANAGE MEMBERS o MANAGE MEMBER SECURITY: questa è una delle tre identificativi firma-in accetta e l'unica password di recupero scrive a, quindi impostarlo sta prendendo il conto. Stessa linea che la carta di password disegna. La scheda si legge attraverso il punto finale del lettore anche sul proprio profilo, quindi c'è un percorso di codice e il SERVER decide se può essere modificato e in cui forma. `mode` sceglie la formulazione, la scrittura, e se un la password è richiesta — un operatore ha già dimostrato chi sono, e chiedendo loro per una password che non hanno sarebbe teatro. Tre cose che la variante dell'operatore non deve fare, ognuna delle quali ha fatto prima: - rendere il pannello di cambio in sospeso. La sua conferma, Invia-again e Discard chiamata endpoint SELF-scoped, quindi un operatore sarebbe stato consegnato tre pulsanti che agiscono silenziosamente sul loro conto OWN mentre mostra l'indirizzo di un collega. - essere soppresso da un cambiamento che il membro aveva in sospeso. La sovrapposizione è punto; l'operatore viene invece detto su di esso, compreso che imposta un l'indirizzo lo cancella. - offrire al membro "dove vive il tuo account". Un operatore sa che cosa è un account utente; ciò che non possono vedere è che questa scrittura non è verificato e non rimane tranquillo, quindi si dice che invece. Separatamente, èSecurityProviderOrg ora significa "questo org possiede il conto dietro il MEMBER BEING VIEWED" e viene dal server. E 'stato usato per essere derivato nel browser del proprio account READER, che è un fatto su chiunque stia cercando: un amministratore autorizzato a fissare il nome legale di un collega potrebbe essere rifiutato perché il loro account proveniva da un'altra parte, e uno che non aveva diritto potrebbe essere offerto la scatola. Per un membro sul proprio profilo le due letture coincidono, quindi niente sui cambiamenti del caso di sé. Il banner che dice "il tuo account è gestito da X" mantiene il lettore-scopio rispondere, perché è l'unica cosa che qui realmente circa il lettore — e ora rende solo sul proprio profilo. Dire a qualcuno la vita del loro account altrove, mentre stanno guardando i registri di un collega risponde a una domanda loro non ha chiesto. Sei test indicano il cancello come limite, il più acuto è che un amministratore tenere sia MANAGE MEMBERS che MANAGE MEMBER SECURITY non può vedere né modificare l'indirizzo.
· SecurityService
Lasciare un operatore dio e l'utente di sistema impostare l'indirizzo di qualcuno
L'indirizzo personale era solo auto. È anche l'indirizzo che un amministratore ha essere in grado di correggere — un membro che ha perso la casella di posta sul loro conto non può dimostrare il nuovo, che è esattamente il caso del proprio percorso non può servire. Chi: un chiamante dio-ELIGIBILE, o la piattaforma System User. Deliberatamente NON MANAGE MEMBERS o MANAGE MEMBER SECURITY. Questo indirizzo è uno dei tre identificativi sign-in accetta e il recupero di una password scrive a, quindi essendo — la stessa linea PasswordChangeController disegna, per lo stesso motivo. L'ammissibilità è letta SessionPlatformFatti piuttosto che raggiungendo per `GD`, perché quel parser esiste proprio così l'ammissibilità e una finestra OPEN-mode non può essere confusa. Il membro di destinazione deve essere nella propria organizzazione del chiamante, come la password Il punto finale richiede. Ciò che NON si applica è la regola di sicurezza-provider: esiste per fermare un inquilino cambiando come qualcuno si firma in un altro, e un operatore dio e l'Utente del Sistema sono identità di piattaforma piuttosto che un inquilino. Mantenerlo lasciare la capacità inutilizzabile dallo spazio di lavoro un operatore è in realtà In piedi. Nessun viaggio di verifica su questo percorso, e l'indirizzo è contrassegnato UNVERIFIED — nessuno l'ha provato, e lasciare un indirizzo scritto ereditare la posizione verificata di quello che ha sostituito renderebbe la bandiera una bugia. L'unicità all'interno del fornitore ancora detiene, perché è un identificativo di segnale tuttavia è stato scritto. The l'avviso alla vecchia mailbox va ancora, e conta più qui che sul membro proprio percorso: questo è il caso in cui il titolare del conto non abbia avviato il cambiamento. Tutto ciò che il membro aveva in sospeso è annullato, quindi il link di conferma di ieri non può annullare silenziosamente la correzione. L'utente di sistema può ora CALL questo controller — amministrare di altre persone I conti sono il punto. Potrebbe ancora non essere il TARGET. /context reports isGodEligible ed isSystemUser in modo che la console possa decidere cosa offrire. Né è derivabile là: il primo deve passare attraverso il condiviso parser, e la seconda è una colonna in nessuna sessione, quindi senza di essa L'utente di sistema aprirebbe un profilo e non verrà mostrato la scheda che ha diritto uso. Entrambi allargano uno schermo; ogni scrittura li re-deriva.
· KlusterServices
Budget gli ultimi quattro servizi per ottenere una seconda replica
BillingService, EmailService, KamoLOS e SecurityService ora eseguire due pod, ciascuno avendo messo il suo effetto condiviso programmato spazza dietro un contratto di locazione distribuito prima. Tra loro che copre il lavoro dove correre due volte sarebbe stato più costoso: ricaricare un cliente, addebitare un conto bancario, inviare una campagna e rinfrescare una borsa di studio OAuth.
· SecurityService
Bloccare le spazzate condivise, e eseguire due pod
Sedici delle 17 spazzate programmate di SecurityService hanno un effetto condiviso e ora prendono un nome locazione distribuita prima di eseguire. Non c'è ShedLock ovunque su questa piattaforma, quindi la replica il conteggio era quello che li ha resi corretti — questo servizio aveva il lavoro più programmato nella flotta ed era quindi il più saldamente fissato a una capsula. Quelli che valgono la denominazione: ****************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************** il nuovo token e scollegare il calendario BulkExportRunner.pollForWork due pod che sostengono le stesse righe in coda avrebbero eseguito stesso EHR/PHI esportazione due volte DomainVerification Watcher capovolge proprietà verified, che decide quale host percorsi a cui org DocReminderSweep invia promemoria di documenti ai mutuatari LeadLockSweeper potrebbe rilasciare una serratura un altro pod appena concesso ****************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************** ha preso il contratto a mano piuttosto che attraverso la stessa modifica meccanica del resto. Quattro test ora esercitano il corpo bloccato direttamente (sweepLocked, reverifyConfirmedLocked, sondaggioForWorkLocked). In precedenza hanno chiamato il punto di ingresso programmato, che ora chiede un mocked SintonTaskRunner per un contratto di locazione che non concede mai — così ogni affermazione in loro sarebbe passata contro un corpo che non è mai scappato. In AccessRuleService e OrgObjectStorageSep il campo iniettato è dichiarato LAST: @RequiredArgsConstructor di Lombok, che costruisce la sua lista dei parametri in ordine di campo, in modo da metterlo altrove riordina silenziosamente gli argomenti esistenti del costruttore. repliche 1 -> 2. Verificato in un trattato di lavoro isolato fuori origine/principio perché questo checkout attualmente trasporta il refattore OrgNetworkRowBuilder di un'altra sessione, che non compila; con solo questi file applicati il servizio costruisce e la sua suite è verde a parte due guasti che riprodurre in modo identico su origine/principale (UnauthenticatedEndpointRatchet flags UserAccountController #verifyByToken, che non fa parte di questo cambiamento).
· kamolos
Bloccare ogni lavoro cron che muove soldi, e eseguire due pod
KamoLOS ha eseguito un pod e i suoi dieci lavori di cron sono stati corretti solo a causa di esso. Non c'è ShedLock ovunque su questa piattaforma, quindi una seconda replica avrebbe eseguito ciascuno di loro due volte: AutoDebitRunJob DEBITS BORROWERS' BANK ACCOUNTS InteressiAccrual Lavoro matura l'interesse sui prestiti in vivo — il doppio degli interessi addebitati due volte StatementGenerationJob due dichiarazioni per un periodo ReminderDispatchCategoria professionale due promemoria di pagamento YearEndTaxJob due documenti per mutuatario più offrire scadenza, delinquenza, anticipo di raffreddamento, programmazione di promemoria e riconciliazione Ogni ora prende un affitto chiamato attraverso SingletonTaskRunner prima di fare nulla. Non e' volutamente chiuso. Scarica l'elenco OFAC SDN e sostituisce un Set tenuto nella memoria di questo baccello, quindi deve correre ovunque — bloccandolo avrebbe lasciato ogni baccello ma i richiedenti di screening del leasing contro una lista di sanzioni EMPTY, che è peggio che la duplicazione che avrebbe impedito. repliche 1 -> 2.
· EmailService
Bloccare le spazzate condivise, e eseguire due pod
Nove delle dieci spazzate programmate di EmailService hanno un effetto condiviso e ora prendere un affitto chiamato prima Correre. Il più consequenziale è CampaignDispatcher: a due baccelli senza serratura, ogni destinatario di ogni campagna in esecuzione avrebbe ricevuto un duplicato. ReminderSchedulerService è lo stesso Per i promemoria delle riunioni, e per le notifiche snoozed. Il decimo non e' volutamente chiuso. Cammina. le caselle di posta guardate dai clienti collegati a QUESTO baccello e nudge quelli che nulla sta spingendo, quindi deve correre ovunque — bloccarlo congelare il distintivo illeggibile per ogni membro il cui WebSocket è atterrato su un baccello che non è il locatario. @Transactional è ora su sia il wrapper programmato e il corpo bloccato in ReminderSchedulerService e SyncService. L'esterno è quello che realmente si applica (il corpo è raggiunto attraverso questo: riferimento, che non passa mai attraverso il proxy di primavera); l'interno è dichiarato perché questo è il metodo che emette la query @Modifying, che è ciò che l'arco ratchet legge — e il ratchet catturato esattamente questo quando l'annotazione era solo sul wrapper. replica 1 -> 2. 590 test, un guasto preesistente non correlato a questo cambiamento ******************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************.
· BillingService
Bloccare ogni spazzata denaro-moving, e eseguire due pod
BillingService ha eseguito un pod e le sue sette spazzate programmate erano corrette solo a causa di esso. Ecco. non è ShedLock ovunque su questa piattaforma, quindi una seconda replica avrebbe eseguito ciascuno di loro due volte a Tick: ****************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************** inviato due volte, il cliente viene addebitato due volte DunningSweep retries pagamenti falliti E le email su di loro StorageAutoExpandSweep acquista storage per conto del cliente, e lo fattura TrialExpirySweep termina le prove e sposta gli abbonamenti su MailboxBillingReconciler / PbxBilling Reconciler lotta sugli stessi articoli di abbonamento StorageSnapshotSweep double-counts ogni figura di uso notturno di org Ogni ora prende un affitto chiamato attraverso SingletonTaskRunner prima di fare nulla. StorageSnapshotSweep è l'unica eccezione in forma: la sua spazzata() è ALSO chiamata direttamente da StorageUsageController quando un operatore chiede un'istantanea ora, e restituisce il numero di riga per il risposta. Così l'annotazione @Scheduled si è spostato in un nuovo programmaSweep() che prende il contratto di locazione, e spazza() stesso è intoccabile e ancora direttamente richiamabile — la richiesta esplicita dell'operatore non dovrebbe essere silenziosamente saltato perché un altro pod capita di essere mid-sweep. repliche 1 -> 2.
· KlusterServices
Budget i sei servizi che hanno appena guadagnato una seconda replica
AIService, KBService, ESigService, VOIPService, DocsService e TranslateService ora eseguire due pod, così uno scarico di un nodo deve sfrattare loro uno alla volta piuttosto che entrambi in una volta. I primi cinque sono arrivati lì mettendo il loro effetto condiviso programmato spazza dietro un distribuito locazione; TranslateService non aveva bisogno di alcuna serratura, perché il suo metodo programmato rinfresca una cache nella memoria del baccello e dovrebbe correre ovunque.
· TranslateService
Eseguire due baccelli
L'unico metodo @Scheduled, qui, e'... popola una mappa tenuto nella memoria di questo baccello. Dovrebbe correre su ogni capsula, non c'è niente di condiviso per un seconda replica a duplicare, e deliberatamente non ottiene serratura — blocco che lascerebbe ogni pod ma il locatario con una tabella di lingua vuota. Nessun altro in questo servizio detiene lo stato tra le richieste.
· DocsService
Bloccare le spazzate condivise, e eseguire due pod
Ogni @Scheduled spazzare qui il cui effetto è condiviso ora prende un nome locazione distribuito attraverso SingletonTaskRunner prima che faccia qualcosa, quindi corre una volta attraverso la flotta invece di una volta per Pod. Questa era l'unica cosa che mantiene questo servizio in una replica — non c'è ShedLock ovunque su questa piattaforma, così il conteggio replica è stato ciò che ha reso le spazzate corrette. @Transactional e gli amici rimangono sul metodo OUTER dove presente: Primavera li applica con un proxy, e il metodo interno è raggiunto attraverso un questo:: riferimento, che non passa mai attraverso uno. Trasferirli verso l'interno lascerebbe la spazzata silenziosamente non transazionale. repliche 1 -> 2, con un PodDisruptionBudget in KlusterServices in modo che un nodo scarico aspetta.
· VOIPService
Bloccare le spazzate condivise, e eseguire due pod
Ogni @Scheduled spazzare qui il cui effetto è condiviso ora prende un nome locazione distribuito attraverso SingletonTaskRunner prima che faccia qualcosa, quindi corre una volta attraverso la flotta invece di una volta per Pod. Questa era l'unica cosa che mantiene questo servizio in una replica — non c'è ShedLock ovunque su questa piattaforma, così il conteggio replica è stato ciò che ha reso le spazzate corrette. @Transactional e gli amici rimangono sul metodo OUTER dove presente: Primavera li applica con un proxy, e il metodo interno è raggiunto attraverso un questo:: riferimento, che non passa mai attraverso uno. Trasferirli verso l'interno lascerebbe la spazzata silenziosamente non transazionale. repliche 1 -> 2, con un PodDisruptionBudget in KlusterServices in modo che un nodo scarico aspetta.

Il tuo universo ti sta aspettando.
Aggiungi i prodotti quando sei pronto: nessuna migrazione, nessun nuovo login, nessuna richiesta di pagamento.
Gratis per sempre — nessuna carta di credito richiesta