av9ash/GitBugs huggingface dataset:
Bug: Support optimize skewed partitions in Distribution and Ordering if numPartitions is not specified
Status: Resolved | Priority: Major | Resolution: Fixed
Created: 02/Dec/21 19:36
Affects Version/s: 3.2.1

When doing repartition in distribution and sort, if data source requests for a specific number of partitions, we should not optimize repartition. However, if data source does not request for a specific number of partitions, Spark should optimize repartition and split the skewed partitions if necessary.
Bug: Escape dot character in partition names
Status: In Progress | Priority: Major | Resolution: 
Created: 23/Dec/21 05:32
Affects Version/s: 3.3.0

Some file systems (for example, ABFS) do not support file names/paths ending with the {{.}} character. The following error is thrown: 
{code:java}
Caused by: java.lang.IllegalArgumentException: ABFS does not allow files or directories to end with a dot.  {code}
We should escape dots in partition names by treating {{.}} character as a special one.
Bug: Comparation between string(great than Int.MaxValue, such as '2147483648') and int return null
Status: In Progress | Priority: Major | Resolution: 
Created: 25/Dec/21 08:26
Affects Version/s: 3.2.0

Comparation between string(great than Int.MaxValue, such as '2147483648') and int return null:

```

>select '2147483648'>1;

NULL

```
Bug: Fix FsHistoryProvider race condition between list and delet log info
Status: Resolved | Priority: Major | Resolution: Fixed
Created: 16/Dec/21 06:13
Affects Version/s: 3.1.2

After SPARK-29043, FsHistoryProvider will list the log info without waitting all `mergeApplicationListing` task finished.

However the `LevelDBIterator` of list log info is not thread safe if some other threads delete the related log info at same time.

There is the error msg:
{code:java}
21/12/15 14:12:02 ERROR FsHistoryProvider: Exception in checking for event log updates
java.util.NoSuchElementException: 1^@__main__^@+hdfs://xxx/application_xxx.inprogress
        at org.apache.spark.util.kvstore.LevelDB.get(LevelDB.java:132)
        at org.apache.spark.util.kvstore.LevelDBIterator.next(LevelDBIterator.java:137)
        at scala.collection.convert.Wrappers$JIteratorWrapper.next(Wrappers.scala:44)
        at scala.collection.Iterator.foreach(Iterator.scala:941)
        at scala.collection.Iterator.foreach$(Iterator.scala:941)
        at scala.collection.AbstractIterator.foreach(Iterator.scala:1429)
        at scala.collection.IterableLike.foreach(IterableLike.scala:74)
        at scala.collection.IterableLike.foreach$(IterableLike.scala:73)
        at scala.collection.AbstractIterable.foreach(Iterable.scala:56)
        at scala.collection.generic.Growable.$plus$plus$eq(Growable.scala:62)
        at scala.collection.generic.Growable.$plus$plus$eq$(Growable.scala:53)
        at scala.collection.mutable.ListBuffer.$plus$plus$eq(ListBuffer.scala:184)
        at scala.collection.mutable.ListBuffer.$plus$plus$eq(ListBuffer.scala:47)
        at scala.collection.TraversableLike.to(TraversableLike.scala:678)
        at scala.collection.TraversableLike.to$(TraversableLike.scala:675)
        at scala.collection.AbstractTraversable.to(Traversable.scala:108)
        at scala.collection.TraversableOnce.toList(TraversableOnce.scala:299)
        at scala.collection.TraversableOnce.toList$(TraversableOnce.scala:299)
        at scala.collection.AbstractTraversable.toList(Traversable.scala:108)
        at org.apache.spark.deploy.history.FsHistoryProvider.checkForLogs(FsHistoryProvider.scala:588)
        at org.apache.spark.deploy.history.FsHistoryProvider.$anonfun$startPolling$3(FsHistoryProvider.scala:299)
{code}
Bug: Schedule Tasks By Input Size
Status: In Progress | Priority: Major | Resolution: 
Created: 03/Dec/21 04:23
Affects Version/s: 3.4.0

In general, the larger input data size means longer running time. So ideally, we can let DAGScheduler submit bigger input size task first. It can reduce the whole stage running time.

[design doc|https://docs.google.com/document/d/1vPcuEADUokO4XpqBV1rFH90Zi4rKdsgZtZMYX80c2gw/edit?usp=sharing]
Bug: Long running Spark Job(Spark ThriftServer) throw HDFS_DELEGATE_TOKEN not found in cache Exception
Status: In Progress | Priority: Major | Resolution: 
Created: 30/Dec/21 14:07
Affects Version/s: 3.0.0

*HDFS_DELEGATE_TOKEN not found in cache exception* occurs when accessing spark thriftserver service. The specific exception is as follows:

[Exception Log | https://raw.githubusercontent.com/huangzhir/Temp/main/image-3.png]

!https://raw.githubusercontent.com/huangzhir/Temp/main/image-3.png!

the HadoopDelegationTokenManager thow Exception when renewal DelegationToken,as follows:

 

We are also find HadoopDelegationTokenManager log as follows:
INFO [Credential Renewal Thread] org.apache.spark.deploy.security.HadoopDelegationTokenManager logInfo - *Scheduling renewal in 1921535501304.2 h.*

[hdfs Exceptin log in HadoopDelegationTokenManager  |https://raw.githubusercontent.com/huangzhir/Temp/main/spark%20thriftserver%20Exceptin.png]

!https://raw.githubusercontent.com/huangzhir/Temp/main/spark%20thriftserver%20Exceptin.png!
Bug: ANSI mode: disable ANSI reserved keywords by default
Status: Resolved | Priority: Major | Resolution: Fixed
Created: 23/Dec/21 08:03
Affects Version/s: 3.3.0

The reserved keywords thing is a big stopper for many users that want to try ANSI mode. They have to update the SQL queries to pass the parser, which is nothing about data quality but just trouble.

By disabling the feature as default, I think we can get better adoption of the ANSI mode.
Bug: ANSI mode: optionally return null result if element not exists in array/map
Status: Resolved | Priority: Major | Resolution: Fixed
Created: 27/Dec/21 08:17
Affects Version/s: 3.3.0

Add a new configuration `spark.sql.ansi.failOnElementNotExists` which controls whether throwing exceptions or returning null results when element not exists in the [] operator in array/map type.

The default value of the new configuration is true.
Bug: Support datasource v2 complete aggregate pushdown 
Status: Resolved | Priority: Major | Resolution: Fixed
Created: 14/Dec/21 12:32
Affects Version/s: 3.3.0

Currently , Spark supports push down aggregate with partial-agg and final-agg . For some data source (e.g. JDBC ) , we can avoid partial-agg and final-agg by running completely on database.
Bug: New SQL function: map_contains_key
Status: Resolved | Priority: Major | Resolution: Fixed
Created: 08/Dec/21 12:09
Affects Version/s: 3.3.0

Add a new function map_contains_key, which returns true if the map contains the key

Examples:
> SELECT map_contains_key(map(1, 'a', 2, 'b'), 1);
true
> SELECT map_contains_key(map(1, 'a', 2, 'b'), 3);
false
Bug: Add the convert_timezone() function
Status: Resolved | Priority: Major | Resolution: Fixed
Created: 05/Dec/21 18:33
Affects Version/s: 3.3.0

CONVERT_TIMEZONE is a common SQL function provided by many other database systems, e.g.
 # [https://docs.aws.amazon.com/redshift/latest/dg/CONVERT_TIMEZONE.html]
 # [https://docs.snowflake.com/en/sql-reference/functions/convert_timezone.html]

The ticket aims to support such function in Spark SQL to make migration from other systems easier.
Bug: Support 2-arguments by the convert_timezone() function
Status: Resolved | Priority: Major | Resolution: Fixed
Created: 07/Dec/21 12:51
Affects Version/s: 3.3.0

# If sourceTs is a timestamp_ntz, take the sourceTz from the session time zone, see the SQL config spark.sql.session.timeZone
# If sourceTs is a timestamp_ltz, convert it to a timestamp_ntz using the targetTz
Bug: ByteArrayMethods arrayEquals should fast skip the check of aligning with unaligned platform
Status: Resolved | Priority: Major | Resolution: Fixed
Created: 31/Dec/21 06:02
Affects Version/s: 3.3.0

The method `arrayEquals` in `ByteArrayMethods` is critical function which is used in `UTF8String.` `equals`, `indexOf`,`find` etc.

After SPARK-16962, it add the complexity of aligned. It would be better to fast sikip the check of aligning if the platform is unaligned.
Bug: Add appId interface to KubernetesConf
Status: Resolved | Priority: Major | Resolution: Fixed
Created: 24/Dec/21 09:54
Affects Version/s: 3.3.0

The appId now can be only access in KuberntesDriverConf and KubernetesExecutorConf, but can't be accesss in KubernetesConf.

 

Some user featurestep are using KubernetesConf as init constructor parameter in order to share the featurestep between driver and executor. So, we'd better add appId to KubernetesConf to help such featurestep access appId.
Bug: Support the binary type by startswith() and endswith()
Status: Resolved | Priority: Major | Resolution: Fixed
Created: 08/Dec/21 12:03
Affects Version/s: 3.3.0

New function were exposed by https://github.com/apache/spark/pull/34782 but they accept the string type only. To make migration from other systems easier, it would be nice to support the binary type too.
Bug: ExecutorMonitor should ignore SparkListenerBlockUpdated event if executor was not active
Status: Resolved | Priority: Major | Resolution: Fixed
Created: 20/Dec/21 03:14
Affects Version/s: 3.1.2

When a executor was not alive, and `ExecutorMonitor` received late `SparkListenerBlockUpdated` event. The `onBlockUpdated` hander will call `ensureExecutorIsTracked`, which will create a new executor tracker with UNKNOWN_RESOURCE_PROFILE_ID for the dead executor. And `ExecutorAllocationManager` will not remove executor with UNKNOWN_RESOURCE_PROFILE_ID, which cause a executor slot is occupied by the dead executor, so a new one cannot be created . 

The ExecutorAllocationManager log was like this:
21/08/24 15:38:14 WARN [spark-dynamic-executor-allocation] ExecutorAllocationManager: Not removing executor 34324 because the ResourceProfile was UNKNOWN!
21/08/24 15:38:14 WARN [spark-dynamic-executor-allocation] ExecutorAllocationManager: Not removing executor 34324 because the ResourceProfile was UNKNOWN!
21/08/24 15:38:14 WARN [spark-dynamic-executor-allocation] ExecutorAllocationManager: Not removing executor 34324 because the ResourceProfile was UNKNOWN!
21/08/24 15:38:14 WARN [spark-dynamic-executor-allocation] ExecutorAllocationManager: Not removing executor 34324 because the ResourceProfile was UNKNOWN!
Bug: Security issue from Log4j 1.X exploit
Status: Resolved | Priority: Major | Resolution: Duplicate
Created: 13/Dec/21 15:27
Affects Version/s: 2.4.8

log4j is being used in version [1.2.17|#L122]]

 

This version has been deprecated and since [then have a known issue that hasn't been adressed in 1.X versions|https://www.cvedetails.com/cve/CVE-2019-17571/].

 

*Solution:*
 * Upgrade log4j to version 2.15.0 which correct all known issues. [Last known issues |https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2021-44228]
Bug: DSV2 InputMetrics are not getting update in corner case
Status: Resolved | Priority: Major | Resolution: Fixed
Created: 08/Dec/21 14:07
Affects Version/s: 3.0.3

In some corner cases, DSV2 is not updating the input metrics.

 

This is very special case where the number of records read are less than 1000 and *hasNext* is not called for last element(cz input.hasNext returns false so MetricsIterator.hasNext is not called)

 

hasNext implementation of MetricsIterator

 
{code:java}
override def hasNext: Boolean = {
  if (iter.hasNext) {
    true
  } else {
    metricsHandler.updateMetrics(0, force = true)
    false
  } {code}
 

You reproduce this issue easily in spark-shell by running below code
{code:java}
import scala.collection.mutable
import org.apache.spark.scheduler.{SparkListener, SparkListenerTaskEnd}spark.conf.set("spark.sql.sources.useV1SourceList", "")
val dir = "Users/tmp1"
spark.range(0, 100).write.format("parquet").mode("overwrite").save(dir)
val df = spark.read.format("parquet").load(dir)
val bytesReads = new mutable.ArrayBuffer[Long]()
val recordsRead = new mutable.ArrayBuffer[Long]()val bytesReadListener = new SparkListener() {
  override def onTaskEnd(taskEnd: SparkListenerTaskEnd): Unit = {
    bytesReads += taskEnd.taskMetrics.inputMetrics.bytesRead
    recordsRead += taskEnd.taskMetrics.inputMetrics.recordsRead
  }
}
spark.sparkContext.addSparkListener(bytesReadListener)
try {
df.limit(10).collect()
assert(recordsRead.sum > 0)
assert(bytesReads.sum > 0)
} finally {
spark.sparkContext.removeSparkListener(bytesReadListener)
} {code}
This code generally fails at *assert(bytesReads.sum > 0)* which confirms that updateMetrics API is not called
Bug: Allow for API user to disable Shuffle Operations while running locally
Status: In Progress | Priority: Major | Resolution: 
Created: 03/Dec/21 10:36
Affects Version/s: 3.3.0

We have been using Spark on local mode, as a small embedded, in-memory SQL DB for microservices.

Spark's powerful SQL features, and flexibility enables developers to build efficient data querying solutions. Due to the nature of our solution dealing with small datasets, which required to be queried through SQL, on very low latencies, we found the embedded approach a very good model.

We found through experimentation, that Spark on local mode, would gain significant performance improvements (on average between 20-30%) by disabling the shuffling on aggregation operations - ShuffleExchangeExec.

I will be raising a PR, to propose introducing a new configuration variable 

*spark.sql.localMode.shuffle.enabled*

This variable will default to true, and will be checked on the QueryExecution EnsureRequirements creation time, in conjunction with checking if Spark is running on local mode, will keep the execution plans unchanged if the value is false.

Looking forward any comments and feedback.
Bug: No namespace assigned in Executor Pod ConfigMap
Status: Resolved | Priority: Major | Resolution: Fixed
Created: 22/Dec/21 09:05
Affects Version/s: 3.1.1

Since Spark 3.X, Executor pod needs separate executor configmap. But, no namespace is assigned in configmap when building it. K8s views configmap without namespace as global resource. Once pod access is restricted (global resources cannot be read), and executor cannot obtain configmap itself.
Bug: Spark 3.2.0 driver pod does not mount checkpoint filesystem from Kubernetes PVC
Status: Closed | Priority: Major | Resolution: Not A Problem
Created: 03/Dec/21 13:28
Affects Version/s: 3.2.0

I have Spark 3.2.0 driver executing in Kubernetes pod in client mode and following configs has been defined in spark-submit:
{code:java}
--deploy-mode client
--conf spark.kubernetes.driver.volumes.persistentVolumeClaim.glustervol.mount.path=/mnt/distributedDisk
--conf spark.kubernetes.driver.volumes.persistentVolumeClaim.glustervol.readOnly=false
--conf spark.kubernetes.driver.volumes.persistentVolumeClaim.glustervol.options.claimName=lolastreamingapp-conf spark.kubernetes.executor.volumes.persistentVolumeClaim.glustervol.mount.path=/mnt/distributedDisk
--conf spark.kubernetes.executor.volumes.persistentVolumeClaim.glustervol.readOnly=false
--conf spark.kubernetes.executor.volumes.persistentVolumeClaim.glustervol.options.claimName=lolastreamingapp
  {code}
I face a problem when starting the driver pod that it cannot access the filesystem mounted from GlusterFS PVC. I can see that driver pod has not mounted the PVC when describing the pod. I can also see that PVC is not mounted when describing the PVC.

This has been working with Spark version 2.4.x, but not with Spark 3.2.0.

Only notable change we have between using Spark version 2.4.x and 3.2.0 is that in 2.4.x we used deploy-mode cluster and in 3.2.0 we use deploy-mode client.

 

Because the filesystem used for checkpointing is not mounted properly, we get following kind of error in our application:
{code:java}
java.io.FileNotFoundException: File /mnt/distributedDisk/SE/LolaStreamingApp/1.0.0/1468589949 does not exist
        at org.apache.hadoop.fs.RawLocalFileSystem.deprecatedGetFileStatus(RawLocalFileSystem.java:779) ~[hadoop-client-api-3.3.1.jar:?]
        at org.apache.hadoop.fs.RawLocalFileSystem.getFileLinkStatusInternal(RawLocalFileSystem.java:1100) ~[hadoop-client-api-3.3.1.jar:?]
        at org.apache.hadoop.fs.RawLocalFileSystem.getFileStatus(RawLocalFileSystem.java:769) ~[hadoop-client-api-3.3.1.jar:?]
        at org.apache.hadoop.fs.FilterFileSystem.getFileStatus(FilterFileSystem.java:462) ~[hadoop-client-api-3.3.1.jar:?]
        at org.apache.spark.streaming.StreamingContext.checkpoint(StreamingContext.scala:240) ~[spark-streaming_2.12-3.2.0.jar:3.2.0]
        at org.apache.spark.streaming.api.java.JavaStreamingContext.checkpoint(JavaStreamingContext.scala:509) ~[spark-streaming_2.12-3.2.0.jar:3.2.0] {code}
Bug: DSV2 is not updating Output Metrics
Status: Resolved | Priority: Major | Resolution: Fixed
Created: 08/Dec/21 09:28
Affects Version/s: 3.3.0

Repro code

./bin/spark-shell --master local  --jars /Users/jars/iceberg-spark3-runtime-0.12.1.jar

 
{code:java}

import scala.collection.mutable
import org.apache.spark.scheduler._val bytesWritten = new mutable.ArrayBuffer[Long]()
val recordsWritten = new mutable.ArrayBuffer[Long]()
val bytesWrittenListener = new SparkListener() {
  override def onTaskEnd(taskEnd: SparkListenerTaskEnd): Unit = {
    bytesWritten += taskEnd.taskMetrics.outputMetrics.bytesWritten
    recordsWritten += taskEnd.taskMetrics.outputMetrics.recordsWritten
  }
}
spark.sparkContext.addSparkListener(bytesWrittenListener)
try {
val df = spark.range(1000).toDF("id")
  df.write.format("iceberg").save("Users/data/dsv2_test")
  
assert(bytesWritten.sum > 0)
assert(recordsWritten.sum > 0)
} finally {
  spark.sparkContext.removeSparkListener(bytesWrittenListener)
} {code}
Bug: Migrate remaining pyspark.sql.functions to _invoke_* style
Status: Resolved | Priority: Major | Resolution: Fixed
Created: 19/Dec/21 10:33
Affects Version/s: 3.3.0

In SPARK-32084 we converted a number of dynamically created functions to standard def using newly added {{_invoke_function}} helpers. Remaining functions stayed untouched. 

These allow us to implement these with minimum amount of boilerplate code.

With recent migration of type hints to inline variant we had to type checker hints:

{code:python}
    sc = SparkContext._active_spark_context
    assert sc is not None and sc._jvm is not Non
{code}

to the functions not covered in SPARK-32084. This added to standard conversions (i.e. ({_to_java_column}}, {{Column(jc)}}) make these pretty verbose.

However, it is possible to convert remaining functions using {{_invoke_function}} helpers to address that.
Bug: Set `GCM` as the default mode in `aes_encrypt()`/`aes_decrypt()`
Status: Resolved | Priority: Major | Resolution: Fixed
Created: 16/Dec/21 19:14
Affects Version/s: 3.3.0

Change the default mode from ECB to GCM in AES functions: aes_encrypt() and aes_decrypt(). GCM is much more preferable because it is semantically secure. Also the mode is used the default one in other systems like Snowflake, see https://docs.snowflake.com/en/sql-reference/functions/encrypt.html
Bug: Add cipher mode option and set default cipher mode for aes_encrypt and aes_decrypt
Status: Resolved | Priority: Major | Resolution: Fixed
Created: 08/Dec/21 15:53
Affects Version/s: 3.3.0

https://github.com/apache/spark/pull/32801 added aes_encrypt/aes_decrypt functions to spark. However they rely on the jvm's configuration regarding which cipher mode to support, this is problematic as it is not fixed across versions and systems.

Let's hardcode a default cipher mode and also allow users to set a cipher mode as an argument to the function.

In the future, we can support other modes like GCM and CBC that have been already supported by other systems:
# Snowflake: https://docs.snowflake.com/en/sql-reference/functions/encrypt.html
# Bigquery: https://cloud.google.com/bigquery/docs/reference/standard-sql/aead-encryption-concepts#block_cipher_modes
Bug: Could/should sql.DataFrame.transform accept function parameters?
Status: Closed | Priority: Major | Resolution: Incomplete
Created: 10/Dec/21 00:14
Affects Version/s: 3.3.0

{code:python}

def foo(df: DataFrame, p: int) -> DataFrame
  ...

# current:

from functools import partial
df.transform(partial(foo, p=3))

# or:

df.transform(lambda df: foo(df, p=3))

# vs suggested:

df.transform(foo, p=3)
{code}
Bug: Add ARM based self-hosted runner to Apache Spark
Status: Open | Priority: Major | Resolution: 
Created: 28/Dec/21 02:50
Affects Version/s: 3.3.0

For Spark Test Runner:

{code:bash}
# Prepare the custom runner
mkdir actions-runner && cd actions-runner
curl -o actions-runner-linux-arm64-2.286.0-airflow1.tar.gz -L https://github.com/ashb/runner/releases/download/v2.286.0-airflow1/actions-runner-linux-arm64-2.286.0-airflow1.tar.gz
tar xzf ./actions-runner-linux-arm64-2.286.0-airflow1.tar.gz

# Configure the self-hosted runner, the Apache Infra Team will give a $TOKEN
# 8U16G for Spark
./config.sh --url https://github.com/apache/spark --token $TOKEN --labels ubuntu-20.04-arm64

# Test on connecting
./run.sh

# Start it as a service
sudo ./svc.sh install 
sudo ./svc.sh start
{code}

For PySpark Test Runner:
{code:bash}
# Prepare the custom runner
mkdir actions-runner && cd actions-runner
curl -o actions-runner-linux-arm64-2.286.0-airflow1.tar.gz -L https://github.com/ashb/runner/releases/download/v2.286.0-airflow1/actions-runner-linux-arm64-2.286.0-airflow1.tar.gz
tar xzf ./actions-runner-linux-arm64-2.286.0-airflow1.tar.gz

# Configure the self-hosted runner, the Apache Infra Team will give a $TOKEN
# 4U8G for PySpark
./config.sh --url https://github.com/apache/spark --token $TOKEN --labels ubuntu-20.04-arm64-pyspark

# Test on connecting
./run.sh

# Start it as a service
sudo ./svc.sh install 
sudo ./svc.sh start
{code}
Bug: Fix failed K8S integration test in SparkConfPropagateSuite
Status: Resolved | Priority: Major | Resolution: Fixed
Created: 20/Dec/21 22:49
Affects Version/s: 3.3.0

K8S integration test "Verify logging configuration is picked from the provided SPARK_CONF_DIR/log4j.properties" is failed after migrating to log4j2. We should fix it.
Bug: Upgrade log4j from 2.17 to 2.17.1
Status: Resolved | Priority: Major | Resolution: Fixed
Created: 29/Dec/21 05:09
Affects Version/s: 3.3.0

There is another CVE ([CVE-2021-44832)|https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2021-44832] in 2.17 (https://issues.apache.org/jira/browse/LOG4J2-3293)
Bug: Spark Thrift Server's query timeout doesn't cancel the synchronous query 
Status: Open | Priority: Major | Resolution: 
Created: 31/Dec/21 10:18
Affects Version/s: 3.2.0

override protected def cleanup(): Unit = {
    if (runInBackground) {
      val backgroundHandle = getBackgroundHandle()
      if (backgroundHandle != null) {
        logInfo("background handle is " + backgroundHandle.toString)
        backgroundHandle.cancel(true)
      } else {
        logInfo(" background handle is null")
      }
    } else {
      logInfo("not running in background")
    }
    // RDDs will be cleaned automatically upon garbage collection.
    if (statementId != null) {
      sqlContext.sparkContext.cancelJobGroup(statementId)
    }
  }

^^^ cleanup only happens when the thread is running in the background. sync queries are not executed in background.
Bug: Built-in ORC reader cannot read data file in sub-directories created by Hive Tez
Status: Open | Priority: Major | Resolution: 
Created: 27/Dec/21 07:09
Affects Version/s: 3.0.3

A Partitioned Hive Table is created and load data in HDP 3.1.4. The Hive engine is Tez, and the storage format is ORC. The data direcotry is like:

table1/statt_dt=2021-12-08/-ext-10000/000000_0

 

The result of SparkSQL which is "select * from table1" does not include the data of partition 2021-12-08.
Bug: Upgrade SBT to 1.6.1
Status: Resolved | Priority: Major | Resolution: Fixed
Created: 29/Dec/21 09:01
Affects Version/s: 3.3.0

SBT 1.6.1 was released, which log4j 2 to 2.17.1 for CVE-2021-44832.
https://github.com/sbt/sbt/releases/tag/v1.6.1