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

[1.x] Remove the Protocol Buffer usage #1419

Closed
wants to merge 15 commits into from

Conversation

Friendseeker
Copy link
Member

@Friendseeker Friendseeker commented Oct 3, 2024

Summary

This PR back ports #1388 along with implementing #1412, fixing gaps in consistent analysis format and replacing use of ParallelGzipOutputStream with Snappy.

Implementing #1412 (Content Hashing)

This PR replaces timestamp in detectAPIChanges with two types of content hashes. bytecodeHash computes content hash of all class files associated with a source file. extraBytecodeHash is a hash of all upstream classes's bytecodeHash, similar to #1388 (comment).

For a non-macro class, we employ bytecodeHash as a direct replacement of compilation timestamp.

For a macro class, there are cases for which the macro has same bytecodeHash after the macro is recompiled but the macro's upstream dependency is changed hence the macro expansion result would be different. Therefore if a class is macro we also compare by extraBytecodeHash to detect such change.

Fixing gaps in consistent analysis format

The following two issues are fixed

  • Consistent Analysis Format was not serializing DependencyByMacroExpansion.
  • Consistent Analysis Format was not serializing extraHash.

Replacing use of ParallelGzipOutputStream with Snappy

There were sporadic CI scripted test timeout failures such as https://github.com/sbt/zinc/actions/runs/11173856057/job/31062605736 and https://github.com/sbt/zinc/actions/runs/11173276915/job/31061098761. These failures commonly happen with (ubuntu-latest, 8, 1) but sometimes happen with (windows-latest, 8, 2). It only happens with Java 8. These failures also cease to happen when we run scripted test one by one.

The CI failures disappear when we use any other compression stream than ParallelGzipOutputStream. Hence this PR uses Snappy to compress/decompress Analysis instead. Snappy is slightly faster than ParallelGzipOutputStream and is an actively maintained library. c.c. #1419 (comment) for raw benchmark result.

eed3si9n and others added 4 commits October 2, 2024 19:21
**Problem/Solution**
We currently have three (3) implementations of Analysis persistence.
Given that the "consistent" binary is the best, we should remove
the protobuf one, so we don't need to update three code bases as we refactor for 2.x.
@@ -142,6 +145,8 @@ class ConsistentAnalysisFormat(val mappers: ReadWriteMappers, sort: Boolean) {
out.int(ac.apiHash())
out.bool(ac.hasMacro)
out.string(ac.provenance())
out.int(ac.extraHash())
out.int(ac.bytecodeHash())
Copy link
Member Author

Choose a reason for hiding this comment

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

Need to forward port

@@ -166,6 +171,8 @@ class ConsistentAnalysisFormat(val mappers: ReadWriteMappers, sort: Boolean) {
val ah = in.int()
val hm = in.bool()
val p = in.string()
val eh = in.int()
val bh = in.int()
Copy link
Member Author

Choose a reason for hiding this comment

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

Need to forward port

@@ -178,7 +185,7 @@ class ConsistentAnalysisFormat(val mappers: ReadWriteMappers, sort: Boolean) {
val comp =
if (storeApis) Companions.of(readClassLike(in), readClassLike(in))
else APIs.emptyCompanions
AnalyzedClass.of(ts, name, SafeLazyProxy.strict(comp), ah, nameHashes, hm, ah, p)
AnalyzedClass.of(ts, name, SafeLazyProxy.strict(comp), ah, nameHashes, hm, eh, p, bh)
Copy link
Member Author

Choose a reason for hiding this comment

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

Need to forward port

"name": "bytecodeHash",
"type": "int",
"default": "0",
"since": "1.11.0",
Copy link
Member Author

@Friendseeker Friendseeker Oct 3, 2024

Choose a reason for hiding this comment

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

Can change it to some other version if we do not plan to release 1.11.0 next.

@Friendseeker Friendseeker force-pushed the consistent-fixes branch 2 times, most recently from 502f7ce to b7bf35c Compare October 4, 2024 01:40
@Friendseeker
Copy link
Member Author

Friendseeker commented Oct 4, 2024

Would appreciate any tip on why Ubuntu Java 8 CI might be failing... I tried running scripted locally using Amazon Corretto 1.8.0_422 aarch64 on my M1 Mac. It passed the first try....

@Friendseeker
Copy link
Member Author

Friendseeker commented Oct 4, 2024

I am so, so confused... The (8, 1) job passed on my own repo... Why is it failing there?

https://github.com/Friendseeker/zinc/actions/runs/11173227513/job/31060972851

When upstream project macro is recompiled, we need to hash bytecodes the macro calls into
for child project to detect upstream macro API change.
@@ -344,6 +361,8 @@ class ConsistentAnalysisFormat(val mappers: ReadWriteMappers, sort: Boolean) {
wrS("inheritance.external", rs.inheritance.external)
wrS("localInheritance.internal", rs.localInheritance.internal)
wrS("localInheritance.external", rs.localInheritance.external)
wrS("macroExpansion.internal", rs.macroExpansion.internal)
wrS("macroExpansion.external", rs.macroExpansion.external)
Copy link
Member Author

@Friendseeker Friendseeker Oct 4, 2024

Choose a reason for hiding this comment

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

Need to forward port

@Friendseeker
Copy link
Member Author

Friendseeker commented Oct 4, 2024

There were sporadic CI scripted test timeout failures such as https://github.com/sbt/zinc/actions/runs/11173856057/job/31062605736 and https://github.com/sbt/zinc/actions/runs/11173276915/job/31061098761. These failures commonly happen with (ubuntu-latest, 8, 1) but happened once with (windows-latest, 8, 2). It only happens with Java 8 job. These failures also seems to cease to happen when we run scripted test one by one.

@adpi2 @eed3si9n Would appreciate advice from both of you. This PR is otherwise good to go but I am struggling to even form an hypothesis on what is causing the timeouts. In fact I cannot even reproduce the same timeout failure on my M1 mac running Java 8.


Update: Still no clue on what is going on, but I suspect the problem is in Parallel GZIP compression. Here's a thread dump from a failed CI run. There's a queue getting blocked and threads doing IO.

Full thread dump OpenJDK 64-Bit Server VM (25.422-b05 mixed mode):

"Thread-104" #264 prio=5 os_prio=0 tid=0x0000022499f9d000 nid=0x8 runnable [0x0000007212ffe000]
   java.lang.Thread.State: RUNNABLE
	at java.io.FileInputStream.readBytes(Native Method)
	at java.io.FileInputStream.read(FileInputStream.java:255)
	at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:284)
	at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326)
	at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178)
	- locked <0x00000000e990a100> (a java.io.InputStreamReader)
	at java.io.InputStreamReader.read(InputStreamReader.java:184)
	at java.io.BufferedReader.fill(BufferedReader.java:161)
	at java.io.BufferedReader.readLine(BufferedReader.java:324)
	- locked <0x00000000e990a100> (a java.io.InputStreamReader)
	at java.io.BufferedReader.readLine(BufferedReader.java:389)
	at scala.sys.process.BasicIO$.$anonfun$processFully$2(BasicIO.scala:169)
	at scala.sys.process.BasicIO$$$Lambda$8187/1616480634.apply(Unknown Source)
	at scala.sys.process.BasicIO$.readFully$1(BasicIO.scala:182)
	at scala.sys.process.BasicIO$.$anonfun$processFully$1$adapted(BasicIO.scala:192)
	at scala.sys.process.BasicIO$$$Lambda$8181/415955626.apply(Unknown Source)
	at scala.sys.process.ProcessBuilderImpl$Simple.$anonfun$run$4(ProcessBuilderImpl.scala:83)
	at scala.sys.process.ProcessBuilderImpl$Simple$$Lambda$8184/1893847331.apply$mcV$sp(Unknown Source)
	at scala.sys.process.ProcessImpl$Spawn$$anon$1.run(ProcessImpl.scala:27)

"Thread-103" #263 prio=5 os_prio=0 tid=0x0000022499f95000 nid=0x1384 runnable [0x0000007212efe000]
   java.lang.Thread.State: RUNNABLE
	at java.io.FileInputStream.readBytes(Native Method)
	at java.io.FileInputStream.read(FileInputStream.java:255)
	at java.io.BufferedInputStream.read1(BufferedInputStream.java:284)
	at java.io.BufferedInputStream.read(BufferedInputStream.java:345)
	- locked <0x00000000e96a4310> (a java.io.BufferedInputStream)
	at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:284)
	at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326)
	at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178)
	- locked <0x00000000e99d2100> (a java.io.InputStreamReader)
	at java.io.InputStreamReader.read(InputStreamReader.java:184)
	at java.io.BufferedReader.fill(BufferedReader.java:161)
	at java.io.BufferedReader.readLine(BufferedReader.java:324)
	- locked <0x00000000e99d2100> (a java.io.InputStreamReader)
	at java.io.BufferedReader.readLine(BufferedReader.java:389)
	at scala.sys.process.BasicIO$.$anonfun$processFully$2(BasicIO.scala:169)
	at scala.sys.process.BasicIO$$$Lambda$8187/1616480634.apply(Unknown Source)
	at scala.sys.process.BasicIO$.readFully$1(BasicIO.scala:182)
	at scala.sys.process.BasicIO$.$anonfun$processFully$1$adapted(BasicIO.scala:192)
	at scala.sys.process.BasicIO$$$Lambda$13605/468778462.apply(Unknown Source)
	at scala.sys.process.ProcessBuilderImpl$Simple.$anonfun$run$3(ProcessBuilderImpl.scala:80)
	at scala.sys.process.ProcessBuilderImpl$Simple$$Lambda$8183/1321579266.apply$mcV$sp(Unknown Source)
	at scala.sys.process.ProcessImpl$Spawn$$anon$1.run(ProcessImpl.scala:27)

"sbt-bg-threads-1" #261 prio=5 os_prio=0 tid=0x0000022499f9a800 nid=0x1290 runnable [0x0000007211cfe000]
   java.lang.Thread.State: RUNNABLE
	at java.lang.ProcessImpl.waitForInterruptibly(Native Method)
	at java.lang.ProcessImpl.waitFor(ProcessImpl.java:516)
	at scala.sys.process.ProcessImpl$SimpleProcess.exitValue(ProcessImpl.scala:243)
	at sbt.Fork.apply(Fork.scala:39)
	at sbt.ForkRun.run(Run.scala:41)
	at sbt.Defaults$.$anonfun$bgRunTask$7(Defaults.scala:2040)
	at sbt.Defaults$$$Lambda$13597/856659449.apply$mcV$sp(Unknown Source)
	at sbt.Defaults$.$anonfun$termWrapper$2(Defaults.scala:1977)
	at sbt.Defaults$$$Lambda$13598/501745419.apply$mcV$sp(Unknown Source)
	at scala.runtime.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:23)
	at scala.util.Try$.apply(Try.scala:213)
	at sbt.internal.BackgroundThreadPool$BackgroundRunnable.run(DefaultBackgroundJobService.scala:367)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at java.lang.Thread.run(Thread.java:750)

"pool-24-thread-4" #248 prio=5 os_prio=0 tid=0x00000224b3207800 nid=0x1014 waiting on condition [0x00000072114fe000]
   java.lang.Thread.State: WAITING (parking)
	at sun.misc.Unsafe.park(Native Method)
	- parking to wait for  <0x00000000e97a2690> (a java.util.concurrent.CountDownLatch$Sync)
	at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
	at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:836)
	at java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireSharedInterruptibly(AbstractQueuedSynchronizer.java:997)
	at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireSharedInterruptibly(AbstractQueuedSynchronizer.java:1304)
	at java.util.concurrent.CountDownLatch.await(CountDownLatch.java:231)
	at sbt.internal.BackgroundThreadPool$BackgroundRunnable.awaitTermination(DefaultBackgroundJobService.scala:414)
	at sbt.internal.BackgroundThreadPool$BackgroundRunnableWithLoader.awaitTermination(DefaultBackgroundJobService.scala:454)
	at sbt.internal.AbstractBackgroundJobService.$anonfun$waitFor$1(DefaultBackgroundJobService.scala:210)
	at sbt.internal.AbstractBackgroundJobService.$anonfun$waitFor$1$adapted(DefaultBackgroundJobService.scala:210)
	at sbt.internal.AbstractBackgroundJobService$$Lambda$13601/983465231.apply(Unknown Source)
	at sbt.internal.AbstractBackgroundJobService.withHandle(DefaultBackgroundJobService.scala:198)
	at sbt.internal.AbstractBackgroundJobService.waitFor(DefaultBackgroundJobService.scala:210)
	at sbt.BackgroundJobService.waitForTry(BackgroundJobService.scala:62)
	at sbt.Defaults$.$anonfun$foregroundRunTask$3(Defaults.scala:2059)
	at sbt.Defaults$.$anonfun$foregroundRunTask$3$adapted(Defaults.scala:2056)
	at sbt.Defaults$$$Lambda$13564/1198156605.apply(Unknown Source)
	at scala.Function1.$anonfun$compose$1(Function1.scala:49)
	at scala.Function1$$Lambda$326/2091057189.apply(Unknown Source)
	at sbt.internal.util.$tilde$greater.$anonfun$$u2219$1(TypeFunctions.scala:63)
	at sbt.internal.util.$tilde$greater$$Lambda$3285/758991444.apply(Unknown Source)
	at sbt.std.Transform$$anon$4.work(Transform.scala:69)
	at sbt.Execute.$anonfun$submit$2(Execute.scala:283)
	at sbt.Execute$$Lambda$3313/2035354280.apply(Unknown Source)
	at sbt.internal.util.ErrorHandling$.wideConvert(ErrorHandling.scala:24)
	at sbt.Execute.work(Execute.scala:292)
	at sbt.Execute.$anonfun$submit$1(Execute.scala:283)
	at sbt.Execute$$Lambda$3297/1361952992.apply(Unknown Source)
	at sbt.ConcurrentRestrictions$$anon$4.$anonfun$submitValid$1(ConcurrentRestrictions.scala:265)
	at sbt.ConcurrentRestrictions$$anon$4$$Lambda$3309/1808986169.apply(Unknown Source)
	at sbt.CompletionService$$anon$2.call(CompletionService.scala:65)
	at java.util.concurrent.FutureTask.run(FutureTask.java:266)
	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
	at java.util.concurrent.FutureTask.run(FutureTask.java:266)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at java.lang.Thread.run(Thread.java:750)

"sbt-progress-report-scheduler" #245 prio=5 os_prio=0 tid=0x00000224b320d800 nid=0x1b94 waiting on condition [0x00000072111fe000]
   java.lang.Thread.State: TIMED_WAITING (parking)
	at sun.misc.Unsafe.park(Native Method)
	- parking to wait for  <0x00000000e9c9b068> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
	at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:215)
	at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2078)
	at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1093)
	at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:809)
	at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1074)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1134)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at java.lang.Thread.run(Thread.java:750)

"sbt-task-progress-report-thread" #243 prio=5 os_prio=0 tid=0x00000224b320a800 nid=0x12ec waiting on condition [0x000000720f7fe000]
   java.lang.Thread.State: WAITING (parking)
	at sun.misc.Unsafe.park(Native Method)
	- parking to wait for  <0x00000000e9c9b248> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
	at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
	at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
	at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)
	at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1074)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1134)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at java.lang.Thread.run(Thread.java:750)

"NioPathWatcher-loop-thread-4" #73 daemon prio=5 os_prio=0 tid=0x0000022499f94800 nid=0x1844 waiting on condition [0x00000072126ff000]
   java.lang.Thread.State: WAITING (parking)
	at sun.misc.Unsafe.park(Native Method)
	- parking to wait for  <0x0000000088904768> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
	at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
	at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
	at java.util.concurrent.LinkedBlockingDeque.takeFirst(LinkedBlockingDeque.java:492)
	at java.util.concurrent.LinkedBlockingDeque.take(LinkedBlockingDeque.java:680)
	at sun.nio.fs.AbstractWatchService.take(AbstractWatchService.java:118)
	at com.swoval.files.RegisterableWatchServices$RegisterableWatchServiceImpl.take(RegisterableWatchServices.java:61)
	at com.swoval.files.NioPathWatcherService$2.run(NioPathWatcherService.java:71)

"Thread-16" #72 daemon prio=5 os_prio=0 tid=0x0000022499f97800 nid=0xaac runnable [0x00000072125ff000]
   java.lang.Thread.State: RUNNABLE
	at sun.nio.fs.WindowsNativeDispatcher.GetQueuedCompletionStatus0(Native Method)
	at sun.nio.fs.WindowsNativeDispatcher.GetQueuedCompletionStatus(WindowsNativeDispatcher.java:1007)
	at sun.nio.fs.WindowsWatchService$Poller.run(WindowsWatchService.java:586)
	at java.lang.Thread.run(Thread.java:750)

"FileTreeRepository-callback-executor-1" #71 prio=5 os_prio=0 tid=0x000002249b832000 nid=0x9d4 waiting on condition [0x00000072124fe000]
   java.lang.Thread.State: WAITING (parking)
	at sun.misc.Unsafe.park(Native Method)
	- parking to wait for  <0x00000000888dc170> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
	at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
	at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
	at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)
	at com.swoval.files.Executor$ExecutorImpl$1.run(Executor.java:57)
	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
	at java.util.concurrent.FutureTask.run(FutureTask.java:266)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at java.lang.Thread.run(Thread.java:750)

"com.swoval.files.SymlinkWatcher.callback-executor-1" #70 prio=5 os_prio=0 tid=0x000002249b831800 nid=0x1620 waiting on condition [0x00000072123ff000]
   java.lang.Thread.State: WAITING (parking)
	at sun.misc.Unsafe.park(Native Method)
	- parking to wait for  <0x00000000888dca40> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
	at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
	at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
	at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)
	at com.swoval.files.Executor$ExecutorImpl$1.run(Executor.java:57)
	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
	at java.util.concurrent.FutureTask.run(FutureTask.java:266)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at java.lang.Thread.run(Thread.java:750)

"NioPathWatcher-loop-thread-3" #69 daemon prio=5 os_prio=0 tid=0x000002249b830800 nid=0x1098 waiting on condition [0x00000072122fe000]
   java.lang.Thread.State: WAITING (parking)
	at sun.misc.Unsafe.park(Native Method)
	- parking to wait for  <0x00000000888dd178> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
	at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
	at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
	at java.util.concurrent.LinkedBlockingDeque.takeFirst(LinkedBlockingDeque.java:492)
	at java.util.concurrent.LinkedBlockingDeque.take(LinkedBlockingDeque.java:680)
	at sun.nio.fs.AbstractWatchService.take(AbstractWatchService.java:118)
	at com.swoval.files.RegisterableWatchServices$RegisterableWatchServiceImpl.take(RegisterableWatchServices.java:61)
	at com.swoval.files.NioPathWatcherService$2.run(NioPathWatcherService.java:71)

"Thread-15" #68 daemon prio=5 os_prio=0 tid=0x0000022493347800 nid=0x12b0 runnable [0x00000072121fe000]
   java.lang.Thread.State: RUNNABLE
	at sun.nio.fs.WindowsNativeDispatcher.GetQueuedCompletionStatus0(Native Method)
	at sun.nio.fs.WindowsNativeDispatcher.GetQueuedCompletionStatus(WindowsNativeDispatcher.java:1007)
	at sun.nio.fs.WindowsWatchService$Poller.run(WindowsWatchService.java:586)
	at java.lang.Thread.run(Thread.java:750)

"NioPathWatcher-loop-thread-2" #67 daemon prio=5 os_prio=0 tid=0x0000022493346800 nid=0x70c waiting on condition [0x00000072120ff000]
   java.lang.Thread.State: WAITING (parking)
	at sun.misc.Unsafe.park(Native Method)
	- parking to wait for  <0x0000000088970698> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
	at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
	at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
	at java.util.concurrent.LinkedBlockingDeque.takeFirst(LinkedBlockingDeque.java:492)
	at java.util.concurrent.LinkedBlockingDeque.take(LinkedBlockingDeque.java:680)
	at sun.nio.fs.AbstractWatchService.take(AbstractWatchService.java:118)
	at com.swoval.files.RegisterableWatchServices$RegisterableWatchServiceImpl.take(RegisterableWatchServices.java:61)
	at com.swoval.files.NioPathWatcherService$2.run(NioPathWatcherService.java:71)

"Thread-14" #66 daemon prio=5 os_prio=0 tid=0x0000022493346000 nid=0x182c runnable [0x00000072119ff000]
   java.lang.Thread.State: RUNNABLE
	at sun.nio.fs.WindowsNativeDispatcher.GetQueuedCompletionStatus0(Native Method)
	at sun.nio.fs.WindowsNativeDispatcher.GetQueuedCompletionStatus(WindowsNativeDispatcher.java:1007)
	at sun.nio.fs.WindowsWatchService$Poller.run(WindowsWatchService.java:586)
	at java.lang.Thread.run(Thread.java:750)

"FileTreeRepository-callback-executor-1" #65 prio=5 os_prio=0 tid=0x0000022493345000 nid=0xf08 waiting on condition [0x00000072118ff000]
   java.lang.Thread.State: WAITING (parking)
	at sun.misc.Unsafe.park(Native Method)
	- parking to wait for  <0x000000008892c8d0> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
	at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
	at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
	at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)
	at com.swoval.files.Executor$ExecutorImpl$1.run(Executor.java:57)
	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
	at java.util.concurrent.FutureTask.run(FutureTask.java:266)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at java.lang.Thread.run(Thread.java:750)

"com.swoval.files.SymlinkWatcher.callback-executor-1" #64 prio=5 os_prio=0 tid=0x000002249334c000 nid=0x10d0 waiting on condition [0x00000072117fe000]
   java.lang.Thread.State: WAITING (parking)
	at sun.misc.Unsafe.park(Native Method)
	- parking to wait for  <0x000000008892d0e0> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
	at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
	at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
	at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)
	at com.swoval.files.Executor$ExecutorImpl$1.run(Executor.java:57)
	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
	at java.util.concurrent.FutureTask.run(FutureTask.java:266)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at java.lang.Thread.run(Thread.java:750)

"NioPathWatcher-loop-thread-1" #63 daemon prio=5 os_prio=0 tid=0x000002249334b800 nid=0x19a0 waiting on condition [0x00000072116ff000]
   java.lang.Thread.State: WAITING (parking)
	at sun.misc.Unsafe.park(Native Method)
	- parking to wait for  <0x000000008892d818> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
	at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
	at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
	at java.util.concurrent.LinkedBlockingDeque.takeFirst(LinkedBlockingDeque.java:492)
	at java.util.concurrent.LinkedBlockingDeque.take(LinkedBlockingDeque.java:680)
	at sun.nio.fs.AbstractWatchService.take(AbstractWatchService.java:118)
	at com.swoval.files.RegisterableWatchServices$RegisterableWatchServiceImpl.take(RegisterableWatchServices.java:61)
	at com.swoval.files.NioPathWatcherService$2.run(NioPathWatcherService.java:71)

"Thread-12" #61 daemon prio=5 os_prio=0 tid=0x000002249334a800 nid=0x1510 runnable [0x00000072115ff000]
   java.lang.Thread.State: RUNNABLE
	at sun.nio.fs.WindowsNativeDispatcher.GetQueuedCompletionStatus0(Native Method)
	at sun.nio.fs.WindowsNativeDispatcher.GetQueuedCompletionStatus(WindowsNativeDispatcher.java:1007)
	at sun.nio.fs.WindowsWatchService$Poller.run(WindowsWatchService.java:586)
	at java.lang.Thread.run(Thread.java:750)

"Timer-0" #44 daemon prio=5 os_prio=0 tid=0x000002249b82b000 nid=0x1b04 in Object.wait() [0x0000007210ffe000]
   java.lang.Thread.State: WAITING (on object monitor)
	at java.lang.Object.wait(Native Method)
	at java.lang.Object.wait(Object.java:502)
	at java.util.TimerThread.mainLoop(Timer.java:526)
	- locked <0x00000000824fdaf0> (a java.util.TaskQueue)
	at java.util.TimerThread.run(Timer.java:505)

"sbt-command-exchange-fastTrack" #19 daemon prio=5 os_prio=0 tid=0x0000022496ad6800 nid=0xbe0 waiting on condition [0x0000007210efe000]
   java.lang.Thread.State: WAITING (parking)
	at sun.misc.Unsafe.park(Native Method)
	- parking to wait for  <0x0000000080a17f20> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
	at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
	at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
	at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)
	at sbt.internal.CommandExchange$FastTrackThread.impl$2(CommandExchange.scala:472)
	at sbt.internal.CommandExchange$FastTrackThread.run(CommandExchange.scala:502)

"classloader-cache-cleanup-0" #17 daemon prio=5 os_prio=0 tid=0x0000022494493800 nid=0xba8 in Object.wait() [0x0000007210dff000]
   java.lang.Thread.State: TIMED_WAITING (on object monitor)
	at java.lang.Object.wait(Native Method)
	at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:144)
	- locked <0x0000000080a478c0> (a java.lang.ref.ReferenceQueue$Lock)
	at sbt.internal.classpath.ClassLoaderCache$CleanupThread.run(ClassLoaderCache.scala:107)

"boot-server-socket-thread-1" #16 prio=5 os_prio=0 tid=0x0000022493a8b000 nid=0x474 runnable [0x0000007210cfe000]
   java.lang.Thread.State: RUNNABLE
	at com.sun.jna.Native.invokeInt(Native Method)
	at com.sun.jna.Function.invoke(Function.java:426)
	at com.sun.jna.Function.invoke(Function.java:361)
	at com.sun.jna.Library$Handler.invoke(Library.java:270)
	at com.sun.proxy.$Proxy0.GetOverlappedResult(Unknown Source)
	at org.scalasbt.ipcsocket.JNAWin32NamedPipeLibraryProvider.GetOverlappedResult(JNAWin32NamedPipeLibraryProvider.java:187)
	at org.scalasbt.ipcsocket.Win32NamedPipeServerSocket.accept(Win32NamedPipeServerSocket.java:182)
	at sbt.internal.BootServerSocket.lambda$new$1(BootServerSocket.java:275)
	at sbt.internal.BootServerSocket$$Lambda$144/1024597427.run(Unknown Source)
	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
	at java.util.concurrent.FutureTask.run(FutureTask.java:266)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at java.lang.Thread.run(Thread.java:750)

"JNA Cleaner" #15 daemon prio=5 os_prio=0 tid=0x00000224944c9000 nid=0x19fc in Object.wait() [0x0000007210bff000]
   java.lang.Thread.State: WAITING (on object monitor)
	at java.lang.Object.wait(Native Method)
	- waiting on <0x0000000080a631c0> (a java.lang.ref.ReferenceQueue$Lock)
	at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:144)
	- locked <0x0000000080a631c0> (a java.lang.ref.ReferenceQueue$Lock)
	at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:165)
	at com.sun.jna.internal.Cleaner$1.run(Cleaner.java:58)

"pool-1-thread-3" #13 prio=5 os_prio=0 tid=0x0000022493b83800 nid=0x6c8 waiting on condition [0x0000007210aff000]
   java.lang.Thread.State: WAITING (parking)
	at sun.misc.Unsafe.park(Native Method)
	- parking to wait for  <0x00000000802aa4e0> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
	at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
	at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
	at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)
	at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1074)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1134)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at java.lang.Thread.run(Thread.java:750)

"pool-1-thread-2" #12 prio=5 os_prio=0 tid=0x0000022493b8a000 nid=0x8b0 waiting on condition [0x00000072109fe000]
   java.lang.Thread.State: WAITING (parking)
	at sun.misc.Unsafe.park(Native Method)
	- parking to wait for  <0x00000000802aa4e0> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
	at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
	at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
	at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)
	at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1074)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1134)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at java.lang.Thread.run(Thread.java:750)

"pool-1-thread-1" #10 prio=5 os_prio=0 tid=0x00000224ffb4f800 nid=0x1b80 waiting on condition [0x00000072107fe000]
   java.lang.Thread.State: WAITING (parking)
	at sun.misc.Unsafe.park(Native Method)
	- parking to wait for  <0x00000000802aa4e0> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
	at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
	at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
	at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)
	at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1074)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1134)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at java.lang.Thread.run(Thread.java:750)

"Service Thread" #9 daemon prio=9 os_prio=0 tid=0x00000224fe5fa800 nid=0x814 runnable [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"C1 CompilerThread2" #8 daemon prio=9 os_prio=2 tid=0x00000224fe57d000 nid=0x1734 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"C2 CompilerThread1" #7 daemon prio=9 os_prio=2 tid=0x00000224fe577000 nid=0xd04 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"C2 CompilerThread0" #6 daemon prio=9 os_prio=2 tid=0x00000224fe573800 nid=0x60c waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"Attach Listener" #5 daemon prio=5 os_prio=2 tid=0x00000224fe56d000 nid=0x1064 runnable [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"Signal Dispatcher" #4 daemon prio=9 os_prio=2 tid=0x00000224fe56c000 nid=0x5f4 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"Finalizer" #3 daemon prio=8 os_prio=1 tid=0x00000224fe549800 nid=0x1224 in Object.wait() [0x000000720ffff000]
   java.lang.Thread.State: WAITING (on object monitor)
	at java.lang.Object.wait(Native Method)
	at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:144)
	- locked <0x0000000080089c18> (a java.lang.ref.ReferenceQueue$Lock)
	at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:165)
	at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:188)

"Reference Handler" #2 daemon prio=10 os_prio=2 tid=0x00000224fe53e800 nid=0xbc0 in Object.wait() [0x000000720fefe000]
   java.lang.Thread.State: WAITING (on object monitor)
	at java.lang.Object.wait(Native Method)
	at java.lang.Object.wait(Object.java:502)
	at java.lang.ref.Reference.tryHandlePending(Reference.java:191)
	- locked <0x0000000080089e38> (a java.lang.ref.Reference$Lock)
	at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:153)

"main" #1 prio=5 os_prio=0 tid=0x00000224fb41a000 nid=0x628 waiting on condition [0x000000720f8fc000]
   java.lang.Thread.State: WAITING (parking)
	at sun.misc.Unsafe.park(Native Method)
	- parking to wait for  <0x00000000e9a62de0> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
	at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
	at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
	at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)
	at java.util.concurrent.ExecutorCompletionService.take(ExecutorCompletionService.java:193)
	at sbt.ConcurrentRestrictions$$anon$4.take(ConcurrentRestrictions.scala:311)
	at sbt.Execute.next$1(Execute.scala:118)
	at sbt.Execute.processAll(Execute.scala:128)
	at sbt.Execute.runKeep(Execute.scala:96)
	at sbt.EvaluateTask$.liftedTree1$1(EvaluateTask.scala:520)
	at sbt.EvaluateTask$.run$1(EvaluateTask.scala:519)
	at sbt.EvaluateTask$.runTask(EvaluateTask.scala:542)
	at sbt.internal.Aggregation$.$anonfun$timedRun$4(Aggregation.scala:104)
	at sbt.internal.Aggregation$$$Lambda$8465/1454418285.apply(Unknown Source)
	at sbt.EvaluateTask$.withStreams(EvaluateTask.scala:432)
	at sbt.internal.Aggregation$.timedRun(Aggregation.scala:102)
	at sbt.internal.Aggregation$.runTasks(Aggregation.scala:116)
	at sbt.internal.Aggregation$.$anonfun$applyDynamicTasks$4(Aggregation.scala:185)
	at sbt.internal.Aggregation$$$Lambda$13561/999823853.apply(Unknown Source)
	at sbt.Command$.$anonfun$applyEffect$2(Command.scala:146)
	at sbt.Command$$$Lambda$1289/37926966.apply(Unknown Source)
	at sbt.internal.Act$.$anonfun$actParser0$8(Act.scala:500)
	at sbt.internal.Act$$$Lambda$8455/35575092.apply(Unknown Source)
	at sbt.Command$.process(Command.scala:194)
	at sbt.MainLoop$.$anonfun$processCommand$7(MainLoop.scala:267)
	at sbt.MainLoop$$$Lambda$1239/1906879951.apply(Unknown Source)
	at scala.Option.getOrElse(Option.scala:189)
	at sbt.MainLoop$.process$1(MainLoop.scala:267)
	at sbt.MainLoop$.processCommand(MainLoop.scala:312)
	at sbt.MainLoop$.$anonfun$next$5(MainLoop.scala:171)
	at sbt.MainLoop$$$Lambda$1208/259219561.apply(Unknown Source)
	at sbt.State$StateOpsImpl$.runCmd$1(State.scala:290)
	at sbt.State$StateOpsImpl$.process$extension(State.scala:326)
	at sbt.MainLoop$.$anonfun$next$4(MainLoop.scala:171)
	at sbt.MainLoop$$$Lambda$1207/686989583.apply(Unknown Source)
	at sbt.internal.util.ErrorHandling$.wideConvert(ErrorHandling.scala:24)
	at sbt.MainLoop$.next(MainLoop.scala:171)
	at sbt.MainLoop$.run(MainLoop.scala:152)
	at sbt.MainLoop$.$anonfun$runWithNewLog$1(MainLoop.scala:127)
	at sbt.MainLoop$$$Lambda$1180/270095066.apply(Unknown Source)
	at sbt.io.Using.apply(Using.scala:28)
	at sbt.MainLoop$.runWithNewLog(MainLoop.scala:120)
	at sbt.MainLoop$.runAndClearLast(MainLoop.scala:74)
	at sbt.MainLoop$.runLoggedLoop(MainLoop.scala:59)
	at sbt.MainLoop$.runLogged(MainLoop.scala:50)
	at sbt.StandardMain$.runManaged(Main.scala:225)
	at sbt.xMain$.$anonfun$run$11(Main.scala:135)
	at sbt.xMain$$$Lambda$141/2100961961.apply(Unknown Source)
	at sbt.internal.util.Terminal$.withStreams(Terminal.scala:421)
	at sbt.xMain$.withStreams$1(Main.scala:88)
	at sbt.xMain$.run(Main.scala:123)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at sbt.internal.XMainConfiguration.run(XMainConfiguration.java:59)
	at sbt.xMain.run(Main.scala:47)
	at xsbt.boot.Launch$.$anonfun$run$1(Launch.scala:149)
	at xsbt.boot.Launch$$$Lambda$96/103887628.apply(Unknown Source)
	at xsbt.boot.Launch$.withContextLoader(Launch.scala:176)
	at xsbt.boot.Launch$.run(Launch.scala:149)
	at xsbt.boot.Launch$.$anonfun$apply$1(Launch.scala:44)
	at xsbt.boot.Launch$$$Lambda$69/95395916.apply(Unknown Source)
	at xsbt.boot.Launch$.launch(Launch.scala:159)
	at xsbt.boot.Launch$.apply(Launch.scala:44)
	at xsbt.boot.Launch$.apply(Launch.scala:21)
	at xsbt.boot.Boot$.runImpl(Boot.scala:78)
	at xsbt.boot.Boot$.run(Boot.scala:73)
	at xsbt.boot.Boot$.main(Boot.scala:21)
	at xsbt.boot.Boot.main(Boot.scala)

"VM Thread" os_prio=2 tid=0x00000224fe512800 nid=0x9c0 runnable 

"GC task thread#0 (ParallelGC)" os_prio=0 tid=0x00000224fb433800 nid=0xb50 runnable 

"GC task thread#1 (ParallelGC)" os_prio=0 tid=0x00000224fb434800 nid=0xd60 runnable 

"GC task thread#2 (ParallelGC)" os_prio=0 tid=0x00000224fb437800 nid=0x176c runnable 

"GC task thread#3 (ParallelGC)" os_prio=0 tid=0x00000224fb438800 nid=0xc4 runnable 

"VM Periodic Task Thread" os_prio=2 tid=0x00000224fe604800 nid=0x6ec waiting on condition 

JNI global references: 20456

Heap
 PSYoungGen      total 483328K, used 322682K [0x00000000d5580000, 0x00000000fce00000, 0x0000000100000000)
  eden space 328704K, 90% used [0x00000000d5580000,0x00000000e7825408,0x00000000e9680000)
  from space 154624K, 16% used [0x00000000e9680000,0x00000000eaef9538,0x00000000f2d80000)
  to   space 148480K, 0% used [0x00000000f3d00000,0x00000000f3d00000,0x00000000fce00000)
 ParOldGen       total 777728K, used 288861K [0x0000000080000000, 0x00000000af780000, 0x00000000d5580000)
  object space 777728K, 37% used [0x0000000080000000,0x0000000091a177a0,0x00000000af780000)
 Metaspace       used 386234K, capacity 427658K, committed 428016K, reserved 1423360K
  class space    used 52378K, capacity 54944K, committed 55040K, reserved 1048576K

@Friendseeker
Copy link
Member Author

Friendseeker commented Oct 5, 2024

Yes it is the GZIP Parallel compression causing the transient CI failures... I did Github Action runs on two zinc branches on my fork, one using java.util.zip.GZIPOutputStream, the other using ParallelGzipOutputStream, Github Action runs on all former branch commits consistently succeeded while Github Action runs consistently failed on latter branch commits. To be sure, I added stress test commits that lets scripted task to be executed for 30 times on both branches, again former succeeded while latter failed.

I guess I shall remove the use of ParallelGzipOutputStream in this PR for now. If we do need performant compression I think we can use some established libraries like https://github.com/xerial/snappy-java, https://github.com/lz4/lz4-java instead of ParallelGzipOutputStream.

@Friendseeker
Copy link
Member Author

Friendseeker commented Oct 5, 2024

Here's the benchmark result. Shall switch to use Snappy as it is slightly faster than ParallelGZIP. LZ4 would likely be even faster but LZ4-java is dead.

Format Write Time (ms/op) Read Time (ms/op)
ConsistentBinaryWithParallelGZIP 284.774 ± 6.749 160.292 ± 1.284
ConsistentBinaryWithParallelGZIP (No Sort) 202.954 ± 1.903 N/A
ConsistentBinaryWithSnappy 267.960 ± 7.312 152.017 ± 1.065
ConsistentBinaryWithSnappy (No Sort) 219.906 ± 4.312 N/A
ConsistentBinaryWithStandardGZIP 581.248 ± 3.852 158.442 ± 1.322
ConsistentBinaryWithStandardGZIP (No Sort) 625.460 ± 5.160 N/A

Result compiled from https://github.com/Friendseeker/zinc/actions/runs/11189486493/job/31109922634

@Friendseeker Friendseeker marked this pull request as ready for review October 5, 2024 04:13
@eed3si9n
Copy link
Member

eed3si9n commented Oct 5, 2024

@Friendseeker Thanks for the contribution!

Here's my opinion: I think demonstrating that we have the capability to no longer depend on timestamp is great for both Zinc 1.x and 2.x, and I appreciate the effort you've put in here. However, I don't think it's a good idea to actually go through with the removal in Zinc / sbt 1.x series, since we'd end up taking on known-unknown risks, the risk budget I'd rather focus on forwarding sbt / Zinc 2.x.

@Friendseeker
Copy link
Member Author

Friendseeker commented Oct 5, 2024

@Friendseeker Thanks for the contribution!

Here's my opinion: I think demonstrating that we have the capability to no longer depend on timestamp is great for both Zinc 1.x and 2.x, and I appreciate the effort you've put in here. However, I don't think it's a good idea to actually go through with the removal in Zinc / sbt 1.x series, since we'd end up taking on known-unknown risks, the risk budget I'd rather focus on forwarding sbt / Zinc 2.x.

I shall open another PR that targets 2.x porting all the changes in this PR, along with making a PR targeting 1.x only porting the bug-fixes.

Indeed I was also thinking that such major change should only target 2.x branch. In fact one of the main reason I targeted 1.x branch in the first place is that all scripted tests can be ran to iron out problems.

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