Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

OTR(Backend & Frontend) OPHOTRKEH-248: NPE/Enum korjaus kun ONR-tiedot muuttuneet #587

Merged
merged 7 commits into from
Oct 25, 2023

Conversation

jrkkp
Copy link
Contributor

@jrkkp jrkkp commented Oct 13, 2023

Yhteenveto

Estetään NPE ja logitetaan virhe kun tulkin tietoja ei löydy cachesta. Toistuu untuvalla. Oletettavasti koska AKR ylikirjoittanut tiedot.

java.lang.NullPointerException: Cannot invoke "fi.oph.otr.onr.model.PersonalData.getNickName()" because "personalData" is null
	at fi.oph.otr.service.PublicInterpreterService.toDTO(PublicInterpreterService.java:90)
	at fi.oph.otr.service.PublicInterpreterService.lambda$list$0(PublicInterpreterService.java:66)
	at java.base/java.util.stream.ReferencePipeline$3$1.accept(Unknown Source)
	at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(Unknown Source)
	at java.base/java.util.stream.AbstractPipeline.copyInto(Unknown Source)
	at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(Unknown Source)
	at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(Unknown Source)
	at java.base/java.util.stream.AbstractPipeline.evaluate(Unknown Source)
	at java.base/java.util.stream.ReferencePipeline.collect(Unknown Source)
	at fi.oph.otr.service.PublicInterpreterService.list(PublicInterpreterService.java:68)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)

@markpilkku
Copy link
Contributor

markpilkku commented Oct 16, 2023

Toi ongelma vaikuttaa olevan oire toisesta - jostakin syystä API-kutsu ONR:ään ei toimi:

[scheduling-1] ERROR fi.oph.otr.onr.OnrService: Updating personal data cache failed java.util.concurrent.ExecutionException: java.util.concurrent.TimeoutException: Request timeout to virkailija.untuvaopintopolku.fi/54.171.88.146:443 after 60000 ms at java.base/java.util.concurrent.CompletableFuture.reportGet(Unknown Source) at java.base/java.util.concurrent.CompletableFuture.get(Unknown Source) at fi.vm.sade.javautils.nio.cas.CasClient.executeBlocking(CasClient.java:23) at fi.oph.otr.onr.OnrOperationApiImpl.fetchPersonalDatas(OnrOperationApiImpl.java:43) at fi.oph.otr.onr.OnrService.updateCache(OnrService.java:30) at fi.oph.otr.scheduled.OnrCacheUpdater.lambda$updateOnrCache$0(OnrCacheUpdater.java:41) at fi.oph.otr.util.SchedulingUtil.runWithScheduledUser(SchedulingUtil.java:20) at fi.oph.otr.scheduled.OnrCacheUpdater.updateOnrCache(OnrCacheUpdater.java:38) at jdk.internal.reflect.GeneratedMethodAccessor184.invoke(Unknown Source) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.base/java.lang.reflect.Method.invoke(Unknown Source) at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:343) at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:750) at net.javacrumbs.shedlock.core.DefaultLockingTaskExecutor.executeWithLock(DefaultLockingTaskExecutor.java:74) at net.javacrumbs.shedlock.spring.aop.MethodProxyScheduledLockAdvisor$LockingInterceptor.invoke(MethodProxyScheduledLockAdvisor.java:86) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:750) at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:702) at fi.oph.otr.scheduled.OnrCacheUpdater$$SpringCGLIB$$0.updateOnrCache(<generated>) at jdk.internal.reflect.GeneratedMethodAccessor184.invoke(Unknown Source) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.base/java.lang.reflect.Method.invoke(Unknown Source) at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:84) at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54) at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source) at java.base/java.util.concurrent.FutureTask.runAndReset(Unknown Source) at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(Unknown Source) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at java.base/java.lang.Thread.run(Unknown Source)

Toinen huomio, että en lähtisi korjaamaan dataongelmaa koodilla. Oikein toimivassa ympäristössä kääntäjän/tulkin oidNumero viittaa olemassa olevaan henkilöön ONR:ssä. Nyt tolla fixillä piilotetaan kääntäjiä/tulkkeja kokonaan pois käyttöliittymästä.

Itse korjaisin tuon siten, että lisäisin ylimääräisen lokituksen oidNumerosta ja sen perusteella korjaisin dataa Untuvalla/Pallerolla. Tuotannossa tota tilannetta ei pitäisi syntyä, koska tietokantaan lisätään olemassa olevat henkilöt ONR:sta.

@jrkkp
Copy link
Contributor Author

jrkkp commented Oct 16, 2023

Nyt tolla fixillä piilotetaan kääntäjiä/tulkkeja kokonaan pois käyttöliittymästä.

Ajattelin tässä, että olisi kuitenkin parempi näyttää ne tulkit, joiden tiedot löytyy, kuin että ei näytetä mitään. Joka tapauksessa NPE pitäisi varmaankin ottaa kiinni ja vaikka palauttaa jokin hallittu virhe APIsta. 🤔

Tuotannossa tota tilannetta ei pitäisi syntyä

Onkohan mahdollista, että tulkki poistuu ONR:stä mutta pysyy edelleen OTR:ssä? En ole kovin tarkkaan katsonut niin en tiedä onko siellä jotain poistorutiinia. 🤔

@markpilkku
Copy link
Contributor

markpilkku commented Oct 16, 2023

Ajattelin tässä, että olisi kuitenkin parempi näyttää ne tulkit, joiden tiedot löytyy, kuin että ei näytetä mitään

Tuossa on se vaara, että toi fixi piilottaa alkuperäisen ongelman, joka johti tähän tilanteeseen ja jota pitää korjata ensi sijassa. Toimintalogiikan ei kai pidä varautua kaikkiin teoreettisiin tilanteisiin, jos niihin ei voi päätyä ohjelmaa oikein käytettynä.

Joka tapauksessa NPE pitäisi varmaankin ottaa kiinni ja vaikka palauttaa jokin hallittu virhe APIsta

Joo, toi varmaan vois tehdä.

Onkohan mahdollista, että tulkki poistuu ONR:stä mutta pysyy edelleen OTR:ssä?

Veikkaisin, ettei ONR poista muista järjestelmistä mitään. Toisaalta epäilen suuresti, että ONR poistaisi omatoimisesti henkilöä, vaikka teoriassa se on kai mahdollista...

@markpilkku
Copy link
Contributor

...ja jos päätetään sisällyttää tämä null check, se pitää myös korjata ainakin kahteen muuhun luokkaan: ClerkInterpreterService ja ClerkEmailService (jos searchaa IDE:ssä onrService.getCachedPersonalDatas). Eli sanoisin, että toi on vahvasti dataongelma, ja se kannattaa korjatakin datan puolella.

@jrkkp jrkkp marked this pull request as draft October 18, 2023 10:58
import com.fasterxml.jackson.annotation.JsonProperty;

@JsonIgnoreProperties(ignoreUnknown = true)
public enum ContactDetailsGroupSource {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pitäisikö se lisätä myös ContactDetailsGroupType? Siihen voi myös tulla uusia tyyppejä.

@jrkkp jrkkp marked this pull request as ready for review October 24, 2023 08:14
@jrkkp jrkkp changed the title OTR(Backend) OPHOTRKEH-248: NPE korjaus kun tulkkia ei löydy ONR:stä OTR(Backend & Frontend) OPHOTRKEH-248: NPE/Enum korjaus kun ONR-tiedot muuttuneet Oct 24, 2023
@Transactional(readOnly = true)
public List<ClerkInterpreterDTO> list() {
final List<ClerkInterpreterDTO> result = listWithoutAudit();
auditService.logOperation(OtrOperation.LIST_INTERPRETERS);
return result;
}

@Transactional(readOnly = true)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@transactional ymmärtääkseni vaikuttaa vain tietokantakutsuihin, tuossa sillä ei ole väliä, koska tietokantaa ei kutsuta.

@jrkkp jrkkp merged commit fb9e894 into dev Oct 25, 2023
@jrkkp jrkkp deleted the feature/OPHOTRKEH-248 branch October 25, 2023 06:42
pkoivisto pushed a commit that referenced this pull request Oct 26, 2023
…t muuttuneet (#587)

* OTR(Backend) OPHOTRKEH-248: NPE fix when interpreter is not found from cache

* OTR(Backend) OPHOTRKEH-248: NPE fix when not found from cache. Also fix unknown enum in contact source

* OTR(Backend) OPHOTRKEH-248: test for ONR response deserialization

* OTR(Backend) OPHOTRKEH-248: test for ONR response deserialization

* OTR(Frontend) OPHOTRKEH-248: show alert if interpreters are not synchronized between OTR and ONR [deploy]

* OTR(Frontend) OPHOTRKEH-248: mock-up endpoint for missing interpreters [deploy]

* OTR(Frontend) OPHOTRKEH-248: error handler for missing interpreters [deploy]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants