Fork me on GitHub
#clojure-hungary
<
2022-07-07
>
onetom01:07:03

nezegettem, h milyen off-the-shelf megoldasok vannak retry logic-ra, amit mindenfele network operation-ok kore raknank. ezeket talaltam emlitesre meltonak: https://github.com/BrunoBonacci/safely https://github.com/joegallo/robert-bruce https://github.com/liwp/again https://github.com/grammarly/perseverance van nektek ebben tapasztalatotok? melyik megoldast ajanlanatok?

onetom01:07:50

mi ennek egy valtozatat hasznaljuk: https://github.com/Datomic/ion-starter/blob/master/src/datomic/ion/starter/utils.clj#L4-L34 de ez csak Datomic Cloud-hoz egy peldakent lett osszedobva es nincs hozza teszt, meg exception dobalasaval jelzi a muvelet, h szukseg van retry-ra, ahelyett h csak egy anomaly-t adna vissza. 0 observability, h hanyszor lett valami ujra probalva. szal nagyon minimal es nagyon bespoke megoldas.

imre09:06:52

robert bruce-t használjuk egy-egy helyen, meg again-t. Most az utóbbival van kis viszketésem, mert csak exceptionre működik énnekem meg valami return value esetén is akarok retryolni, és kicsit drága csak ezért exceptionölni

onetom09:06:03

talaltam amugy egy megoldast valamelyik railway-oriented-programming clojure lib-ben amivel tudsz olyan exceptiont csinalni ami nem capture-oli a stacktrace-t

onetom09:06:56

de amugy nekunk is pont ez volt a fajdalmunk, h felesleges bonyolitas exception-oket bevonni a retry mechanizmusba.

imre09:06:18

viszont a callback az meg hasznos

imre09:06:53

lehet le kéne forkolnom, mert nem lenne bonya beadni valamit, ami retvalon is működik

onetom11:06:40

https://github.com/fmnoise/flow/blob/1e618e30fb683999662f0b17e1b8590982867d3b/src/fmnoise/flow/Fail.java#L22-L23 setting that writableStackTrace parameter of the RuntimeException protected constructor to false is what prevents generation of the stack trace. this Fail class makes a public visibility constructor, to allow controlling the writableStackTrace parameter. btw, the interpretation of the writableStackTrace is defined all the way down in java.lang.Throwable, so technically u can even extend that. https://github.com/openjdk/jdk/blob/4a20691e9b0276e2dc5e7eb6a4d05393d6b4c99c/src/java.base/share/classes/java/lang/Throwable.java#L379-L394

imre11:06:23

zsír, köszi!

👍 1
onetom11:06:32

most latom csak h angolul irtam :) rossz uzemmodban maradt az agyam :)

onetom11:06:30

jo lenne atirni ezt a Fail class-t clojure-be, de annyira nem vagyok profi interop meg :gen-class téren még h pikk pakk meg birjam csinálni. csak ezert az egy class kedveert meg nem akarom a build process-t javac-vel bonyolítani....

onetom11:06:13

@U08BJGV6E te vagod h h kene?

imre12:06:18

Hehe, én is ilyeneken gondolkodtam. gen-class elvileg működhet, de annak is kell egy precompile step, ha jól tudom, see docs + https://clojure.org/guides/deps_and_cli#prep_libs

imre12:06:01

Én végül fogtam és berántottam a flow libet cakkumpakk, nem nagy méret és a mvn artifactba már bele van forgatva 🙂

imre12:06:33

(do
    (require 'criterium.core)
    (criterium.core/with-progress-reporting
     (criterium.core/quick-bench
      (try
        (throw (ex-info "Fail" {:operation "foo"}))
        (catch Exception e
          (assert (ex-data e))))
      )))


  (do
    (require 'criterium.core)
    (require 'fmnoise.flow)
    (criterium.core/with-progress-reporting
     (criterium.core/quick-bench
      (try
        (fmnoise.flow/fail-with {:msg "Fail" :data {:operation "foo"}})
        (catch Exception e
          (assert (ex-data e))))
      )))

imre12:06:45

11us vs 37ns

imre12:06:50

jelentős

imre12:06:04

így talán mégis megmaradhat az again

onetom12:06:56

mekkora nemmindegy, kicsi biorobot vagy nagy? :) a ti esetetekben amugy elofordul olyan suruseggel a retry, h szamitson ez a 11 microsec? alex miller is ezt kerdezte annak a jira ticketnek a kapcsan, ami felvetette h tamogassa az ex-info a stack trace nelkuli exception keszitest, de nem jott valasz ra

onetom12:06:27

en amugy nem a teljesitmeny miatt neztem ennek utana, hanem azert mert bosszantott h mikor kiprinteltem egy ilyen exceptiont ami retry-ra van hasznalva, akkor a stack trace teleokádta a kepernyot es a lenyegi adat nem latszott... de most hogy igy mondom... lehet azt kene csinalni, h legyartasz egy ex-info peldanyt egyszer, kifejezetten olyan celra h retry-t triggerelj es azon meghivod a .clearStackTrace-t es az application code-bol mindig ugyanezt az egy ex-info peldanyt throw-olod

onetom12:06:07

tehat gyakorlatilag sentinel value-kent kezeled.

onetom12:06:54

(ns lab)

(def empty-stack-trace
  (make-array StackTraceElement 0))

(defn clear-stack-trace! [^Throwable t]
  (doto t (.setStackTrace empty-stack-trace)))

(def retry-ex
  (-> "Retry" (ex-info {:asd 123}) clear-stack-trace!))

(comment
  (-> retry-ex throw)
  (-> *e)
  (-> *e clojure.repl/pst)
  )

imre13:06:09

az se egy rossz ötlet

onetom15:06:49

Nem láttam meggyőző érvet a SO cikkben ami ellent mondana ennek a use-case-nek, bar azt nem tudom hogy mi az a TargetSite amiről beszélnek. De az tény hogy nem próbáltam hogy másik thread-ből dobva mi történik.