Skip to content

Commit b943147

Browse files
committed
Bump cats-effect to 3.6.3
1 parent 97e42b7 commit b943147

File tree

5 files changed

+108
-66
lines changed

5 files changed

+108
-66
lines changed

build.sbt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -338,6 +338,7 @@ lazy val logbackMdcCatsEffect3 = module(ProjectName("logback-mdc-cats-effect3
338338
)
339339
.dependsOn(
340340
core,
341+
slf4jMdc,
341342
monix % Test,
342343
slf4jLogger % Test,
343344
)
@@ -626,7 +627,7 @@ lazy val props =
626627
final val RepoName = "logger-f"
627628

628629
final val Scala3Versions = List("3.3.0")
629-
final val Scala2Versions = List("2.13.14", "2.12.18")
630+
final val Scala2Versions = List("2.13.15", "2.12.18")
630631

631632
// final val ProjectScalaVersion = Scala3Versions.head
632633
final val ProjectScalaVersion = Scala2Versions.head
@@ -653,7 +654,7 @@ lazy val props =
653654

654655
final val CatsVersion = "2.7.0"
655656

656-
val CatsEffect3Version = "3.6.0-RC1"
657+
val CatsEffect3Version = "3.6.3"
657658

658659
val Monix3Version = "3.4.0"
659660

modules/logger-f-logback-mdc-cats-effect3/shared/src/main/scala/loggerf/logger/logback/Ce3MdcAdapter.scala

Lines changed: 36 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,10 @@ import cats.effect.{IOLocal, SyncIO}
44
import cats.syntax.all._
55
import ch.qos.logback.classic.LoggerContext
66
import logback_scala_interop.JLoggerFMdcAdapter
7-
import org.slf4j.{LoggerFactory, MDC}
7+
import org.slf4j.LoggerFactory
88

99
import java.util.{Map => JMap, Set => JSet}
1010
import scala.jdk.CollectionConverters._
11-
import scala.util.control.NonFatal
1211

1312
/** @author Kevin Lee
1413
* @since 2023-07-07
@@ -55,35 +54,51 @@ class Ce3MdcAdapter extends JLoggerFMdcAdapter {
5554
override def getKeys: JSet[String] = localContext.unsafeThreadLocal().get.keySet.asJava
5655

5756
}
58-
object Ce3MdcAdapter {
57+
object Ce3MdcAdapter extends Ce3MdcAdapterOps
58+
59+
trait Ce3MdcAdapterOps {
5960

6061
@SuppressWarnings(Array("org.wartremover.warts.Null"))
61-
private def initialize0(): Ce3MdcAdapter = {
62-
val field = classOf[MDC].getDeclaredField("mdcAdapter")
63-
field.setAccessible(true)
64-
val adapter = new Ce3MdcAdapter
65-
field.set(null, adapter) // scalafix:ok DisableSyntax.null
66-
field.setAccessible(false)
67-
adapter
62+
protected def initialize0(ce3MdcAdapter: Ce3MdcAdapter): Ce3MdcAdapter = {
63+
org.slf4j.SetMdcAdapter(ce3MdcAdapter)
64+
ce3MdcAdapter
6865
}
6966

7067
@SuppressWarnings(Array("org.wartremover.warts.AsInstanceOf", "scalafix:DisableSyntax.asInstanceOf"))
71-
def initialize(): Ce3MdcAdapter = {
72-
val loggerContext =
73-
LoggerFactory.getILoggerFactory.asInstanceOf[LoggerContext]
74-
initializeWithLoggerContext(loggerContext)
75-
}
68+
protected def getLoggerContext(): LoggerContext =
69+
LoggerFactory.getILoggerFactory.asInstanceOf[LoggerContext]
70+
71+
def initialize(): Ce3MdcAdapter =
72+
initializeWithCe3MdcAdapterAndLoggerContext(new Ce3MdcAdapter, getLoggerContext())
73+
74+
def initializeWithCe3MdcAdapter(ce3MdcAdapter: Ce3MdcAdapter): Ce3MdcAdapter =
75+
initializeWithCe3MdcAdapterAndLoggerContext(ce3MdcAdapter, getLoggerContext())
7676

77-
def initializeWithLoggerContext(loggerContext: LoggerContext): Ce3MdcAdapter = {
78-
val adapter = initialize0()
79-
try {
80-
val field = classOf[LoggerContext].getDeclaredField("mdcAdapter")
77+
def initializeWithLoggerContext(loggerContext: LoggerContext): Ce3MdcAdapter =
78+
initializeWithCe3MdcAdapterAndLoggerContext(new Ce3MdcAdapter, loggerContext)
79+
80+
@SuppressWarnings(Array("org.wartremover.warts.Equals"))
81+
def initializeWithCe3MdcAdapterAndLoggerContext(
82+
ce3MdcAdapter: Ce3MdcAdapter,
83+
loggerContext: LoggerContext,
84+
): Ce3MdcAdapter = {
85+
val adapter = initialize0(ce3MdcAdapter)
86+
87+
loggerContext.setMDCAdapter(adapter)
88+
if (loggerContext.getMDCAdapter == adapter) {
89+
// println("[LoggerContext] It's set by setMDCAdapter.")
90+
adapter
91+
} else {
92+
// println(
93+
// "[LoggerContext] The old setMDCAdapter doesn't replace `mdcAdapter` if it has already been set, " +
94+
// "so it will use reflection to set it in the `mdcAdapter` field."
95+
// )
96+
val loggerContextClass = classOf[LoggerContext]
97+
val field = loggerContextClass.getDeclaredField("mdcAdapter")
8198
field.setAccessible(true)
8299
field.set(loggerContext, adapter)
83100
field.setAccessible(false)
84101
adapter
85-
} catch {
86-
case NonFatal(_) => adapter
87102
}
88103
}
89104
}

modules/logger-f-logback-mdc-cats-effect3/shared/src/main/scala/loggerf/logger/logback/Ce3MdcAdapterWithIoRuntime.scala

Lines changed: 42 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,10 @@ package loggerf.logger.logback
33
import cats.effect.{IOLocal, unsafe}
44
import ch.qos.logback.classic.LoggerContext
55
import logback_scala_interop.JLoggerFMdcAdapter
6-
import org.slf4j.{LoggerFactory, MDC}
6+
import org.slf4j.LoggerFactory
77

88
import java.util.{Map => JMap, Set => JSet}
99
import scala.jdk.CollectionConverters._
10-
import scala.util.control.NonFatal
1110

1211
/** @author Kevin Lee
1312
* @since 2023-07-07
@@ -46,37 +45,56 @@ class Ce3MdcAdapterWithIoRuntime(private val ioRuntime: unsafe.IORuntime) extend
4645
override def getKeys: JSet[String] = localContext.unsafeThreadLocal().get.keySet.asJava
4746

4847
}
49-
object Ce3MdcAdapterWithIoRuntime {
48+
object Ce3MdcAdapterWithIoRuntime extends Ce3MdcAdapterWithIoRuntimeOps
49+
50+
trait Ce3MdcAdapterWithIoRuntimeOps {
5051

5152
@SuppressWarnings(Array("org.wartremover.warts.Null"))
52-
private def initialize0(ioRuntime: unsafe.IORuntime): Ce3MdcAdapterWithIoRuntime = {
53-
val field = classOf[MDC].getDeclaredField("mdcAdapter")
54-
field.setAccessible(true)
55-
val adapter = new Ce3MdcAdapterWithIoRuntime(ioRuntime)
56-
field.set(null, adapter) // scalafix:ok DisableSyntax.null
57-
field.setAccessible(false)
58-
adapter
53+
protected def initialize0(ce3MdcAdapter: Ce3MdcAdapterWithIoRuntime): Ce3MdcAdapterWithIoRuntime = {
54+
org.slf4j.SetMdcAdapter(ce3MdcAdapter)
55+
ce3MdcAdapter
5956
}
6057

6158
@SuppressWarnings(Array("org.wartremover.warts.AsInstanceOf", "scalafix:DisableSyntax.asInstanceOf"))
62-
def initialize()(implicit ioRuntime: unsafe.IORuntime): Ce3MdcAdapterWithIoRuntime = {
63-
val loggerContext =
64-
LoggerFactory.getILoggerFactory.asInstanceOf[LoggerContext]
65-
initializeWithLoggerContext(loggerContext)
66-
}
67-
68-
def initializeWithLoggerContext(
69-
loggerContext: LoggerContext
70-
)(implicit ioRuntime: unsafe.IORuntime): Ce3MdcAdapterWithIoRuntime = {
71-
val adapter = initialize0(ioRuntime)
72-
try {
73-
val field = classOf[LoggerContext].getDeclaredField("mdcAdapter")
59+
protected def getLoggerContext(): LoggerContext =
60+
LoggerFactory.getILoggerFactory.asInstanceOf[LoggerContext]
61+
62+
def initialize()(implicit ioRuntime: unsafe.IORuntime): Ce3MdcAdapterWithIoRuntime =
63+
initializeWithCe3MdcAdapterWithIoRuntimeAndLoggerContext(
64+
new Ce3MdcAdapterWithIoRuntime(ioRuntime),
65+
getLoggerContext(),
66+
)
67+
68+
def initializeWithCe3MdcAdapterWithIoRuntime(ce3MdcAdapter: Ce3MdcAdapterWithIoRuntime): Ce3MdcAdapterWithIoRuntime =
69+
initializeWithCe3MdcAdapterWithIoRuntimeAndLoggerContext(ce3MdcAdapter, getLoggerContext())
70+
71+
def initializeWithLoggerContext(loggerContext: LoggerContext)(
72+
implicit ioRuntime: unsafe.IORuntime
73+
): Ce3MdcAdapterWithIoRuntime =
74+
initializeWithCe3MdcAdapterWithIoRuntimeAndLoggerContext(new Ce3MdcAdapterWithIoRuntime(ioRuntime), loggerContext)
75+
76+
@SuppressWarnings(Array("org.wartremover.warts.Equals"))
77+
def initializeWithCe3MdcAdapterWithIoRuntimeAndLoggerContext(
78+
ce3MdcAdapter: Ce3MdcAdapterWithIoRuntime,
79+
loggerContext: LoggerContext,
80+
): Ce3MdcAdapterWithIoRuntime = {
81+
val adapter = initialize0(ce3MdcAdapter)
82+
83+
loggerContext.setMDCAdapter(adapter)
84+
if (loggerContext.getMDCAdapter == adapter) {
85+
// println("[LoggerContext] It's set by setMDCAdapter.")
86+
adapter
87+
} else {
88+
// println(
89+
// "[LoggerContext] The old setMDCAdapter doesn't replace `mdcAdapter` if it has already been set, " +
90+
// "so it will use reflection to set it in the `mdcAdapter` field."
91+
// )
92+
val loggerContextClass = classOf[LoggerContext]
93+
val field = loggerContextClass.getDeclaredField("mdcAdapter")
7494
field.setAccessible(true)
7595
field.set(loggerContext, adapter)
7696
field.setAccessible(false)
7797
adapter
78-
} catch {
79-
case NonFatal(_) => adapter
8098
}
8199
}
82100
}

modules/logger-f-logback-mdc-cats-effect3/shared/src/test/scala/loggerf/logger/logback/Ce3MdcAdapterSpec.scala

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -103,10 +103,12 @@ object Ce3MdcAdapterSpec extends Properties {
103103
before()
104104

105105
val beforeSet = (MDC.get("key-1") ==== null).log("before set") // scalafix:ok DisableSyntax.null
106-
// MDC.put("key-1", a)
106+
MDC.put("key-1", a)
107+
108+
val afterBeforeSetBeforeBefore = (MDC.get("key-1") ==== a).log("after beforeSet and before before")
107109

108110
val test = for {
109-
_ <- IO(MDC.put("key-1", a))
111+
// _ <- IO(MDC.put("key-1", a))
110112
before <- IO((MDC.get("key-1") ==== a).log("before"))
111113
beforeIsolated <- IO((MDC.get("key-1") ==== a).log("beforeIsolated"))
112114
.start
@@ -138,6 +140,7 @@ object Ce3MdcAdapterSpec extends Properties {
138140
} yield Result.all(
139141
List(
140142
beforeSet,
143+
afterBeforeSetBeforeBefore,
141144
before,
142145
beforeIsolated,
143146
isolated1Before,
@@ -158,7 +161,7 @@ object Ce3MdcAdapterSpec extends Properties {
158161
def testPutAndGetMultipleIsolatedNestedModifications2: Property =
159162
for {
160163
a <- Gen.string(Gen.alpha, Range.linear(1, 2)).map("a:" + _).log("a")
161-
// a2 <- Gen.string(Gen.alpha, Range.linear(1, 2)).map("a2:" + a + _).log("a2")
164+
a2 <- Gen.string(Gen.alpha, Range.linear(1, 2)).map("a2:" + a + _).log("a2")
162165
b1 <- Gen.string(Gen.alpha, Range.linear(3, 4)).map("b1:" + _).log("b1")
163166
c2 <- Gen.string(Gen.alpha, Range.linear(5, 6)).map("c1:" + _).log("c1")
164167
a3 <- Gen.string(Gen.alpha, Range.linear(7, 8)).map("a3:" + _).log("a3")
@@ -168,14 +171,15 @@ object Ce3MdcAdapterSpec extends Properties {
168171

169172
before()
170173

171-
val beforeSet = (MDC.get("key-1") ==== null).log("before set") // scalafix:ok DisableSyntax.null
172-
// MDC.put("key-1", a2)
173-
// val beforeAndAfterSet =
174-
// (MDC.get("key-1") ==== a2).log(s"""before: MDC.get("key-1") should be $a2""") // scalafix:ok DisableSyntax.null
174+
val beforeSet = (MDC.get("key-1") ==== null).log("before set") // scalafix:ok DisableSyntax.null
175+
MDC.put("key-1", a2)
176+
val afterBeforeSet =
177+
(MDC.get("key-1") ==== a2)
178+
.log(s"""after beforeSet: MDC.get("key-1") should be $a2""") // scalafix:ok DisableSyntax.null
175179

176180
val test = for {
177181
// beforeSet2 <- IO((MDC.get("key-1") ==== a2).log(s"""before set2: MDC.get("key-1") should be $a2""")) // scalafix:ok DisableSyntax.null
178-
_ <- IO(MDC.put("key-1", a))
182+
// _ <- IO(MDC.put("key-1", a))
179183
beforeSet2 <- IO(
180184
(MDC.get("key-1") ==== a).log(s"""before set2: MDC.get("key-1") should be $a""")
181185
) // scalafix:ok DisableSyntax.null
@@ -301,7 +305,7 @@ object Ce3MdcAdapterSpec extends Properties {
301305
) // scalafix:ok DisableSyntax.null
302306
} yield List(
303307
beforeSet,
304-
// beforeAndAfterSet,
308+
afterBeforeSet,
305309
beforeSet2,
306310
) ++ before ++ List(
307311
beforeIsolated

modules/logger-f-logback-mdc-cats-effect3/shared/src/test/scala/loggerf/logger/logback/Ce3MdcAdapterWithIoRuntimeSpec.scala

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -102,11 +102,12 @@ object Ce3MdcAdapterWithIoRuntimeSpec extends Properties {
102102

103103
before()
104104

105-
val beforeSet = (MDC.get("key-1") ==== null).log("before set") // scalafix:ok DisableSyntax.null
106-
// MDC.put("key-1", a)
105+
val beforeSet = (MDC.get("key-1") ==== null).log("before set") // scalafix:ok DisableSyntax.null
106+
MDC.put("key-1", a)
107+
val afterBeforeSet = (MDC.get("key-1") ==== a).log("""after beforeSet: `MDC.get("key-1") ==== a` failed""")
107108

108109
val test = for {
109-
_ <- IO(MDC.put("key-1", a))
110+
// _ <- IO(MDC.put("key-1", a))
110111
before <- IO((MDC.get("key-1") ==== a).log("before"))
111112
beforeIsolated <- IO((MDC.get("key-1") ==== a).log("beforeIsolated"))
112113
.start
@@ -138,6 +139,7 @@ object Ce3MdcAdapterWithIoRuntimeSpec extends Properties {
138139
} yield Result.all(
139140
List(
140141
beforeSet,
142+
afterBeforeSet,
141143
before,
142144
beforeIsolated,
143145
isolated1Before,
@@ -158,7 +160,7 @@ object Ce3MdcAdapterWithIoRuntimeSpec extends Properties {
158160
def testPutAndGetMultipleIsolatedNestedModifications2: Property =
159161
for {
160162
a <- Gen.string(Gen.alpha, Range.linear(1, 2)).map("a:" + _).log("a")
161-
// a2 <- Gen.string(Gen.alpha, Range.linear(1, 2)).map("a2:" + a + _).log("a2")
163+
a2 <- Gen.string(Gen.alpha, Range.linear(1, 2)).map("a2:" + a + _).log("a2")
162164
b1 <- Gen.string(Gen.alpha, Range.linear(3, 4)).map("b1:" + _).log("b1")
163165
c2 <- Gen.string(Gen.alpha, Range.linear(5, 6)).map("c1:" + _).log("c1")
164166
a3 <- Gen.string(Gen.alpha, Range.linear(7, 8)).map("a3:" + _).log("a3")
@@ -168,13 +170,14 @@ object Ce3MdcAdapterWithIoRuntimeSpec extends Properties {
168170

169171
before()
170172

171-
val beforeSet = (MDC.get("key-1") ==== null).log("before set") // scalafix:ok DisableSyntax.null
172-
// MDC.put("key-1", a2)
173-
// val beforeAndAfterSet =
174-
// (MDC.get("key-1") ==== a2).log(s"""before: MDC.get("key-1") should be $a2""") // scalafix:ok DisableSyntax.null
173+
val beforeSet = (MDC.get("key-1") ==== null).log("before set") // scalafix:ok DisableSyntax.null
174+
MDC.put("key-1", a2)
175+
val afterBeforeSet =
176+
(MDC.get("key-1") ==== a2)
177+
.log(s"""after beforeSet: MDC.get("key-1") should be $a2""") // scalafix:ok DisableSyntax.null
175178

176179
val test = for {
177-
// beforeSet2 <- IO((MDC.get("key-1") ==== a2).log("before set2")) // scalafix:ok DisableSyntax.null
180+
beforeSet1 <- IO((MDC.get("key-1") ==== a2).log("before set2")) // scalafix:ok DisableSyntax.null
178181
_ <- IO(MDC.put("key-1", a))
179182
beforeSet2 <- IO(
180183
(MDC.get("key-1") ==== a).log(s"""before set2: MDC.get("key-1") should be $a""")
@@ -302,7 +305,8 @@ object Ce3MdcAdapterWithIoRuntimeSpec extends Properties {
302305
) // scalafix:ok DisableSyntax.null
303306
} yield List(
304307
beforeSet,
305-
// beforeAndAfterSet,
308+
afterBeforeSet,
309+
beforeSet1,
306310
beforeSet2,
307311
) ++ before ++ List(
308312
beforeIsolated

0 commit comments

Comments
 (0)