20 KiB
Handoff: actualizare blocata pe ROMFAST 10.0.20.36 (16.09.2026, seara)
Stare, nu concluzie finala. Nimic modificat pe productie: exclusiv SELECT-uri.
Ce e DOVEDIT
-
Nu e problema de certificat.
ORA-29024vine de pe ramura a doua a luiCONTAFIN_ORACLE.PACK_UTILS.URL2Clob. Cod instalat, citit dinall_source:- linia 285:
IF lcPowerShellDownload = '1' THEN-> ramura 1 (curl extern); - linia 291:
llDownloaded := DownloadFileOS(tcURL, lcDir, lcFileName);culcDir := 'DMPDIR'; - linia 293-301: daca a mers, citeste si
RETURN; - linia 305:
l_clob := HTTPURITYPE.createuri(tcURL).getclob();<- ramura 2, cade aici; - linia 307-313:
WHEN OTHERS-> cleanup ->RAISE. Stiva reala (PACK_UTILS313 si 305) se potriveste exact. Deci ORA-29024 = ramura 1 nu a produs fisierul.
- linia 285:
-
Ramura 1 E activata pe ROMFAST.
CONTAFIN_ORACLE.SERVER_INFO:POWERSHELLDOWNLOAD = 1,POWERSHELLTIMEOUT = 30,POWERSHELLPATH = C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe,ROAUPDATEPATH = D:\ROAUPDATE. Nu exista randCURLPATH, dar codul are fallback peC:\Windows\System32\curl.exe(PACK_UTILSbody 690-692), deci absenta lui nu e fatala. -
Esecul dureaza exact cat timeout-ul.
all_scheduler_job_run_details,UPDATEROA_JOB:- 21:17:51 SUCCEEDED (error# 0)
- 22:10:36 FAILED, error# 29273 — pornire 22:10:05 => 31 secunde
- 22:27:42 FAILED, error# 29273 — pornire 22:27:12 => 30 secunde
POWERSHELLTIMEOUT = 30. Bucla de polling (PACK_UTILSbody 709-713) a mers pana la capat siPACK_UTILS_FILE.FileExistsa intors fals. Fisierul nu a aparut niciodata, nu a aparut tarziu.
-
Corelatia temporala cu patch-ul de azi.
all_objects, ownerCONTAFIN_ORACLE:PACK_UTILS(spec+body),PACK_UTILS_FILE(spec+body)last_ddl_time = 16.09 21:17:51;PACK_UPDATE(spec+body)21:17:52. Toate VALID. Rularea de la 21:17:30-21:20:14 e cea care a instalat noul cod; descarcarea din ea s-a facut inainte de recompilare, deci cu codul vechi. Toate rularile de DUPA recompilare (22:10, 22:27) au esuat. => noulPACK_UTILSnu a descarcat niciodata nimic cu succes pe ROMFAST. -
Serverul de update raspunde. Masurat de pe statia de lucru, 16.09.2026:
https://roa.romfast.ro/contafinupdate/roaupdate/-> HTTP 200 in 0.127s.http://10.0.20.122/-> 404 in 0.0016s de laMicrosoft-HTTPAPI/2.0(normal, situl real e pe portul 81 cu ruta/contafinupdate/...; 404 de lahttp.sysNU inseamna server picat). -
Versiuni (
SERVER_INFO.VERSIUNE_*): majoritatea schemelor la202609150001(15.09);CONTAFIN_ORACLEla202609160003,ROMFASTla202609160005. Actualizarea de azi a inceput si s-a oprit pe drum. -
UPD_LOGse goleste la fiecare rulare (last_ddl_time22:27:02 pe tabela si indecsi). Singurul rand ramas:16.09 22:34:38 ACTUALIZARE INCHEIATA MANUAL. Nu e sursa de istoric. -
sys.ExecuteScriptOS(all_source, owner SYS,last_ddl_time05.02.2026, deci neatins azi) creeaza un jobexec_ps_<8hex>de tipexecutablecu argumentele-ExecutionPolicy Bypass -File <script>si ilENABLE-aza. Joburile sunt SYS-owned, deciCONTAFIN_ORACLEnu le vede inall_scheduler_job_run_details(interogat: zero randuriEXEC_PS%). Aici e gaura de vizibilitate.
Ce NU e dovedit (ipoteze deschise, in ordinea probabilitatii)
- A. Patch-ul de azi a rupt ramura 1. Cel mai probabil, pe baza punctului 4. Ce s-a schimbat azi
(antet
PACK_UTILSbody linia 4): „DownloadFileOS descarca in .part si redenumeste la final, nume unic de script ps". Scriptul generat (body 694-699):& "<curl>" -k -o "<dest>.part" "<url>"+if ($LASTEXITCODE -eq 0) { Move-Item ... } else { Remove-Item ... }. Scris cupack_utils_file.clob2fileX(701), citit cuFile2ClobX(295) — ambele functii noi. Nedeterminat care linie anume pica. Nu am comparat inca versiunea instalata cu cea anterioara. - B. PowerShell/curl nu ruleaza deloc pe server (drepturi pe jobul extern,
C:\DMPDIRnescriibil, curl absent). Ar da acelasi simptom si ar fi independent de patch — dar atunci ar fi picat si inainte de 21:17, ceea ce contrazice punctul 3. Slaba, dar nu exclusa. - C. Legatura cu incidentul conpress de azi. Capatul departat al db link-ului
DBL_ROMFAST2este chiar 10.0.20.36; la conpress s-a omorat sesiunea de pe partea apropiata (ROA_CENTRAL) fara sa se priveasca vreodata partea departata. Neverificata.
Urmatorul pas care departajeaza (nerulat)
Pe serverul 10.0.20.36, in afara Oracle: ruleaza manual scriptul pe care il genereaza codul si vezi
codul de iesire al lui curl.exe — el e singura informatie pe care lantul o pierde complet
($LASTEXITCODE decide doar redenumirea, valoarea nu se logheaza nicaieri). Si verifica ce ramane in
C:\DMPDIR dupa o rulare esuata: daca ramane un .part, curl a mers si a picat Move-Item; daca nu
ramane nimic, curl a esuat sau PowerShell n-a pornit.
Alternativ, din Oracle ca SYS: dba_scheduler_job_run_details pentru joburile EXEC_PS% — acolo
sunt esecurile jobului extern, invizibile din CONTAFIN_ORACLE.
Stare periculoasa / de curatat
- Tunelul Bitvise e RIDICAT — proces
stnlc, profilD:\vm303-profile\romfast.tlp, forwardari active pe127.0.0.1:1521(ROMFAST,SID=ROA), 1522, 1523 si altele. De inchis cand nu mai e nevoie:Stop-Process -Id (Get-NetTCPConnection -LocalPort 1521 -State Listen).OwningProcess. - Nimic modificat pe productie. Doar
SELECT-uri. Niciun script relansat, niciun job atins. SERVER_INFOcontine parole (PASSWORD_SYS,PASSWORD_CONTAFIN_ORACLEbase64+gzip,EMAIL_PASSWORDin clar). Nu le pune in niciun raport, doc sau commit.- Modificare necomisa in alt repo:
COMUN/docs/depanare-server-update-roa.md, +60 linii (doua sectiuni noi, doar insertii). Neverificata linie cu linie de Marius. - Lane opencode
srcinca rula la scrierea acestui fisier; livrabilul lui ar fidocs/raport_src.md(diff conceptual intre versiunea de azi a lui PACK_UTILS si cea anterioara).
Cum se reia conexiunea
"C:\Program Files (x86)\Bitvise SSH Client\stnlc.exe" "-profile=D:/vm303-profile/romfast.tlp"
D:\ROA\instantclient_19_18\sqlplus.exe -S -L "CONTAFIN_ORACLE/<parola>@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=127.0.0.1)(PORT=1521))(CONNECT_DATA=(SID=ROA)))" "@script.sql"
Din Git Bash, calea profilului se da cu bare oblice — backslash-urile sunt inghitite si dau
„CreateFile(): Windows error 2". Parola se cere de la Marius, nu se ghiceste
(FAILED_LOGIN_ATTEMPTS poate bloca schema in productie).
COMPLETARE (dupa lane-ul src + dba_scheduler_job_run_details)
CONTAFIN_ORACLE are drept pe vederile DBA. Joburile externe PowerShell sunt vizibile si
schimba diagnosticul:
EXEC_PS_40900C5A SUCCEEDED 16.09 22:27:13 error# 0
UPDATEROA_JOB FAILED 16.09 22:27:42 error# 29273
EXEC_PS_804FF579 SUCCEEDED 16.09 22:10:06 error# 0
UPDATEROA_JOB FAILED 16.09 22:10:36 error# 29273
EXEC_PS_B5715BCA / BF32458E / A31FD48B / 6FC1191C / 8E28DF1C / 15128026 SUCCEEDED 16.09 21:17:31-38
UPDATEROA_JOB SUCCEEDED 16.09 21:17:51
EXEC_PS_* x7 SUCCEEDED 16.09 04:00:01-08 (rularea automata, cod vechi)
Ce dovedeste asta:
- PowerShell PORNESTE si iese cu cod 0. Ipoteza B din handoff (job extern neconfigurat, lipsa
drepturi,
curlabsent) e INFIRMATA.sys.ExecuteScriptOSfunctioneaza pe ROMFAST. - Esecul e INAUNTRUL scriptului
.ps1. Jobul ejob_type=>'executable'pepowershell.exe;SUCCEEDEDinseamna doar capowershell.exea iesit cu 0. Scriptul iese cu 0 si pe ramura de esec, fiindcaelse { Remove-Item ... }(PACK_UTILS body 698-699) nu propaga nimic. Deci: oricurla esuat si.parta fost sters, oricurla mers siMove-Itema picat. Ambele sunt inghitite tacit. - Sub codul vechi mergea, sub cel nou nu. La 04:00 (automat) au rulat 7 joburi PS, toate
reusite, si actualizarea a mers; la 21:17 sase joburi PS reusite,
UPDATEROA_JOBSUCCEEDED — toate inainte de recompilarea de la 21:17:51. Dupa recompilare: la 22:10 si 22:27 ruleaza exact un singur job PS, apoi esec la 30 de secunde. Adica prima descarcare sub noul cod pica, si lantul se opreste acolo.
Diferentele reale introduse azi (lane src, comparatie co_2026_09_16_02 vs
co_2026_01_14_01_PACK_UTILS.sql):
- numele scriptului
.ps1: fixdownload_file.ps1-> unicdownload_<timestamp>.ps1; - se sterge fisierul destinatie INAINTE de descarcare (body 685) — nou;
- se descarca in
<dest>.partsi se muta cuMove-Item -Force— nou; .ps1se sterge la final (body 719) — nou;- in
PACK_UTILS_FILE,FileDeletea devenit best-effort (when others then null), deci nu mai ridica ORA-29283/29291 care inainte semnalau problema. - Gardele si preconditiile sunt NESCHIMBATE — deci nu s-a pierdut nicio configurare.
Suspectul principal ramas: scriptul .ps1 nou. Doua variante, nedepartajate:
(a) curl.exe -k -o "<dest>.part" esueaza (dar mergea la 21:17 cu aceeasi retea si acelasi URL);
(b) Move-Item -Force din .part in destinatie pica — si e exact pasul care NU exista inainte.
Varianta (b) explica de ce simptomul a aparut fix la prima rulare de dupa recompilare.
A treia varianta, de exclus: clob2fileX (functie noua) scrie .ps1-ul incomplet/gol — powershell
ar rula un fisier gol si ar iesi tot cu 0, exact ce se vede.
Cum se departajeaza, pe OS, pe 10.0.20.36, in C:\DMPDIR:
- raman fisiere
url2clob_*.tmp.part->curla mers,Move-Itema picat -> varianta (b); - nu ramane nimic ->
curla esuat -> varianta (a); - raman
download_*.ps1-> scriptul nu a fost sters, deci bucla nu a ajuns la capat; - deschide un
download_*.ps1ramas si vezi daca are continut -> departajeazaclob2fileX. Rularea manuala a aceluiasi.ps1din consola, pe server, arata direct codul de iesire al luicurl.
COMPLETARE 2: dovada de pe disc (\10.0.20.36\c\DMPDIR)
roadigi.romfast.ro ESTE 10.0.20.36; share-ul \10.0.20.36\c\ e accesibil direct de pe statie.
Continut relevant:
url2clob_20260916222712422000000.tmp.part 10863 octeti
CreationTime = LastWriteTime = 16.09 22:27:12.990
- Numele contine timestamp-ul generat de PL/SQL: 22:27:12.422.
EXEC_PS_40900C5A(jobul PowerShell) s-a incheiat SUCCEEDED la 22:27:13.UPDATEROA_JOBa esuat la 22:27:42 (30s =POWERSHELLTIMEOUT).- Continutul
.partesteroa_app.xmlcomplet si valid (<?xml ... Windows-1252?><VFPData>...</VFPData>), lista de programe de la ROAACNPRO la ROAVIN. - Niciun
download_*.ps1ramas in DMPDIR (stergerea de la body 719 a functionat).
Ce e DOVEDIT acum:
curl.exea mers perfect: a descarcat tot fisierul, in ~0.5 secunde, in locatia corecta. Ipoteza (a) — „curl esueaza" — e INFIRMATA.- Redenumirea
.part-> destinatie nu s-a facut. NiciRemove-Itemde pe ramuraelsenu s-a facut, altfel fisierul ar fi disparut. - PowerShell a iesit imediat dupa
curl(22:27:12.990 -> job incheiat 22:27:13), cu cod 0. - NTFS pe
C:\DMPDIR:Authenticated Users:(M)— Modify, deci si drept de stergere. Ipoteza „lipsa drept de delete/rename" e INFIRMATA.
Intrebarea ramasa, singura, nedepartajata: de ce nu s-a executat linia a doua a scriptului. Doua variante, ambele compatibile cu toate dovezile de mai sus:
- (b)
Move-Itema rulat si a esuat ca eroare ne-terminanta -> scrisa pe stderr, ignorata, PowerShell iese 0. Motivul esecului ramane nestiut (jobul extern nu captureaza stderr). - (c) fisierul
.ps1a fost scris trunchiat la primul CRLF, deci PowerShell a executat doar linia cucurlsi a iesit. Scrierea se face cuPACK_UTILS_FILE.Clob2FileX(dbms_xslprocessor.clob2file(clob, dir, file, csid => 0)), iar scriptul de azi este primul script cu mai mult de o linie — inainte era o singura comandacurldirect in destinatie, deci o trunchiere la primul CRLF ar fi fost invizibila. Asta explica de ce simptomul apare exact la prima rulare de dupa patch.
Testul minim care departajeaza (cere o scriere, NU s-a facut): pe o instanta de test, apeleaza
PACK_UTILS_FILE.Clob2FileX cu un clob de doua linii separate prin chr(13)||chr(10) si uita-te la
fisierul rezultat: daca are o singura linie -> varianta (c), si reparatia e in felul in care se scrie
.ps1-ul, nu in curl. Daca are doua linii -> varianta (b), si atunci trebuie capturat stderr-ul
scriptului ca sa se vada de ce pica Move-Item.
Fisierul .part de la 22:27 e singura proba fizica ramasa — nu-l stergeti si nu-l redenumiti
pana nu se decide testul. Cel de la rularea 22:10 nu mai exista (nu se stie cine l-a sters).
CAUZA RADACINA — DEMONSTRATA prin reproducere pe ROMFAST (16.09.2026, 23:07)
Marius a aprobat rularea directa pe productie. Probele au fost rulate prin
PACK_UTILS_FILE.Clob2FileX + sys.ExecuteScriptOS, adica prin exact acelasi mecanism si sub
exact acelasi cont ca lantul real. Toate fisierele de proba au fost sterse dupa (vezi „Curatenie").
Proba 1 — Clob2FileX scrie corect (varianta (c) INFIRMATA)
Clob de doua linii separate prin chr(13)||chr(10) -> fisier de 248 octeti, ambele linii intacte,
\r \n pastrat, fara BOM, fara trunchiere (od -c). Scrierea .ps1-ului nu e problema.
Proba 2 — Move-Item functioneaza sub contul jobului (varianta (b) INFIRMATA)
Script rulat prin ExecuteScriptOS: creeaza un fisier in C:\DMPDIR, il muta, il sterge.
Rezultat in log: MOVE OK, DEL OK. Si cwd=C:\. Deci nici drepturile, nici Move-Item nu pica.
(NTFS pe C:\DMPDIR: Authenticated Users:(M).)
Proba 3 — reproducerea scriptului real
Script identic cu cel generat de DownloadFileOS, pe URL-ul real
https://roa.romfast.ro/contafinupdate/default.aspx/updroa/download/1/roa_app.xml
(optiuni.UPD_URL_APP + sys.auth_detalii.detalii = 1):
lastexit=
part_ramas=False dest_creat=False
erori=1
Cannot find path 'C:\DMPDIR\claude_repro.tmp.part' because it does not exist.
$LASTEXITCODE gol; Remove-Item a picat pentru ca fisierul inca nu exista. Fisierul .part
a aparut DUPA ce scriptul se terminase.
Proba 4 — mecanismul, cu ceas
t0=23:07:08.671
t1=23:07:08.707 ec=[] exists=False <- la 36 de milisecunde dupa lansarea curl
t2=23:07:13.735 exists=True <- dupa Start-Sleep 5
proc_curl=0
Verdict
Sub jobul extern DBMS_SCHEDULER (proces fara consola), operatorul & din PowerShell nu asteapta
procesul nativ. Scriptul trece la linia urmatoare in ~36 ms, $LASTEXITCODE nu e niciodata setat
(deci $null -eq 0 = False), se executa ramura else pe un fisier inca inexistent, iar cand curl
termina in fundal lasa <destinatie>.part pe disc pentru totdeauna. Fisierul destinatie nu apare
niciodata -> bucla de polling din DownloadFileOS expira dupa POWERSHELLTIMEOUT (30s) ->
llDownloaded = FALSE -> URL2Clob cade pe HTTPURITYPE (body 305) -> pe https fara wallet ->
ORA-29273 / ORA-29024.
De ce mergea inainte: codul vechi scria cu curl -o DIRECT in fisierul destinatie. Nu exista
pas de redenumire, deci nu depindea de terminarea lui curl: bucla de polling din Oracle astepta
oricum aparitia fisierului, iar asincronia era inofensiva. Patch-ul de azi a introdus un pas
(Move-Item) care presupune ca curl s-a terminat — presupunere falsa in acest mediu.
Asta explica exact de ce simptomul apare la prima rulare de dupa recompilarea de la 21:17:51.
Directia de reparatie (NEAPLICATA, nediscutata inca)
Scriptul trebuie sa astepte explicit procesul, nu sa se bazeze pe & si pe $LASTEXITCODE. Varianta
minima, in PACK_UTILS.DownloadFileOS body ~694-699, inlocuind linia cu &:
$p = Start-Process -FilePath "<curl>" -ArgumentList '-k','-o','<dest>.part','<url>' -Wait -PassThru -NoNewWindow
if ($p.ExitCode -eq 0) { Move-Item ... } else { Remove-Item ... }
Alternativ, & "<curl>" ... | Out-Null forteaza consumarea iesirii, deci asteptarea — dar Start-Process -Wait -PassThru e explicit si nu depinde de un efect secundar al pipeline-ului.
Ambele variante trebuie probate prin acelasi mecanism (ExecuteScriptOS) inainte de a fi propuse
pentru commit — mediul jobului extern e exact ce a invalidat presupunerea initiala.
Curatenie
Toate fisierele de proba sterse din C:\DMPDIR (test_clob2file_claude.txt, diag_claude.*,
repro_claude.*, claude_repro.*, async_claude.*). A ramas doar proba originala
url2clob_20260916222712422000000.tmp.part (10863 octeti, 22:27) — nu o stergeti, e dovada fizica
a incidentului.
Nu s-a modificat niciun pachet, niciun job, nicio optiune. Singurele scrieri pe productie au fost
fisiere temporare in C:\DMPDIR, toate sterse.
INCHEIERE BLOC (16.09.2026, ~23:40)
Livrat si comis
| ce | unde | revizie |
|---|---|---|
co_2026_09_16_06_COMUN_PACK_UTILS.sql |
^/DATABASE/Branches/RB-1.00 |
r18146 (comis de Marius), r18148 (scoaterea lui &) |
docs/depanare-server-update-roa.md |
^/COMUN/Trunk |
r18147 |
Aplicat pe servere
- ROMFAST 10.0.20.36: aplicat 23:19:32,
PACK_UTILSVALID,VERSIUNE_CONTAFIN_ORACLE = 202609160006.PACK_UPDATE.UpdateROArulat de Marius 23:21:50-23:24:19,UPDATEROA_JOBSUCCEEDED, sase joburiEXEC_PS_*reusite,UPD_LOGfara randuriERR, 65 de scheme pe20260916.URL2Clobintoarce documentul complet in ~2s. - ROA_CENTRAL 10.0.20.122: aplicat de Marius. A afisat
SP2-0317: expected symbol name is missing— cauza: un&la sfarsit de rand intr-un COMENTARIU (linia 756), citit de sqlplus ca variabila de substitutie fara nume. Efect strict cosmetic: pachetul s-a compilat („Package body created"), codul e intact. Reparat in r18148 prin reformularea comentariilor. NU e BOM — fisierul are 0 octeti non-ASCII, verificat la scriere si la commit. Nu s-a verificat independent starea de pe ROA_CENTRAL (nu s-a deschis tunel acolo).
Capcana de retinut
La aplicarea unui script prin sqlplus, nu filtra iesirea — asa am ratat acelasi SP2-0317 pe
ROMFAST. Un & la sfarsit de rand, chiar si in comentariu, produce eroarea; & urmat de virgula
sau spatiu e tolerat.
Ramas deschis
- Tunelul Bitvise catre ROMFAST e inca RIDICAT (
stnlc, profilD:\vm303-profile\romfast.tlp, porturi 1521/1522/1523). De inchis:Stop-Process -Id (Get-NetTCPConnection -LocalPort 1521 -State Listen).OwningProcess. C:\DMPDIR\url2clob_20260916222712422000000.tmp.part— proba fizica a incidentului, pastrata intentionat. Acum ca e documentata, poate fi stearsa.- Necomise, intentionat (documente de lucru):
docs/handoff_update_romfast.md,docs/raport_src.md,docs/raport_doc.md. - Intrebare deschisa, neinrudita cu reparatia asta: capatul departat al db link-ului
DBL_ROMFAST2este chiar 10.0.20.36; la incidentul conpress s-a omorat sesiunea de pe partea apropiata (ROA_CENTRAL) fara sa se priveasca partea departata. Cele doua incidente pot avea radacini diferite — reparatia de azi NU il explica pe cel de la conpress. - Restul serverelor de client: scriptul ajunge la ele prin fluxul normal de actualizare.
Stare periculoasa
Niciuna. Pe productie nu a ramas nimic in lucru: niciun job atins, nicio tranzactie deschisa, toate
fisierele de proba sterse din C:\DMPDIR.
ACTUALIZARE FINALA (23:45)
Tunelul Bitvise catre ROMFAST este INCHIS. Anuleaza randul „Tunelul ... e inca RIDICAT" din
sectiunea „Ramas deschis" de mai sus: procesul stnlc a fost oprit, iar porturile 1521/1522/1523
nu mai asculta (verificat cu Get-NetTCPConnection). Nu mai exista acces deschis la productie din
aceasta sesiune.
Reluarea conexiunii, cand va fi nevoie:
"C:\Program Files (x86)\Bitvise SSH Client\stnlc.exe" "-profile=D:/vm303-profile/romfast.tlp"
Din Git Bash calea profilului se da cu bare oblice — backslash-urile sunt inghitite si dau „CreateFile(): Windows error 2".
Restul sectiunii „Ramas deschis" ramane valabil: proba .part din C:\DMPDIR, documentele de lucru
necomise, si intrebarea deschisa despre db link-ul DBL_ROMFAST2.