diff --git a/README.md b/README.md
index 7d58525..42257a0 100644
--- a/README.md
+++ b/README.md
@@ -18,20 +18,20 @@ A Clojure library providing facilities for async programming and communication.
This project follows the version scheme MAJOR.MINOR.COMMITS where MAJOR and MINOR provide some relative indication of the size of the change, but do not follow semantic versioning. In general, all changes endeavor to be non-breaking (by moving to new names rather than by breaking existing names). COMMITS is an ever-increasing counter of commits since the beginning of this repository.
-Latest release: 1.8.741
+Latest release: 1.9.865
* [All Released Versions](http://search.maven.org/#search%7Cgav%7C1%7Cg%3A%22org.clojure%22%20AND%20a%3A%22core.async%22)
[deps.edn](https://clojure.org/reference/deps_and_cli) dependency information:
```clj
- org.clojure/core.async {:mvn/version "1.8.741"}
+ org.clojure/core.async {:mvn/version "1.9.865"}
```
[Leiningen](https://github.com/technomancy/leiningen) dependency information:
```clj
- [org.clojure/core.async "1.8.741"]
+ [org.clojure/core.async "1.9.865"]
```
[Maven](http://maven.apache.org/) dependency information:
@@ -40,7 +40,7 @@ Latest release: 1.8.741
org.clojure
core.async
- 1.8.741
+ 1.9.865
```
@@ -64,6 +64,17 @@ Copyright © Rich Hickey and contributors
## Changelog
+* Release 1.10.870-alpha2 on 2026-04-06
+ * [ASYNC-275](https://clojure.atlassian.net/browse/ASYNC-275) (CLJ) Fixed flow/futurize to retain original behavior of propagating exceptions
+* Release 1.10.864-alpha1 on 2026-03-19
+ * Alpha release of core.async.flow - all APIs subject to change
+ * [ASYNC-274](https://clojure.atlassian.net/browse/ASYNC-274) (CLJ) Fixed flow/futurize stopped returning a future on Executor change
+ * [ASYNC-270](https://clojure.atlassian.net/browse/ASYNC-270) (CLJ) futurize with no :exec arg throws
+* Release 1.9.865 on 2026-03-19 (accumulated changes since 1.8.741)
+ * Added datafy support for channels and buffers
+ * [ASYNC-273](https://clojure.atlassian.net/browse/ASYNC-273) (CLJ) alts!! callbacks should dispatch on caller when possible
+ * [ASYNC-272](https://clojure.atlassian.net/browse/ASYNC-272) (CLJ) Use JVM virtual threads in io-thread
+ * [ASYNC-269](https://clojure.atlassian.net/browse/ASYNC-269) (CLJ) Noop callbacks dispatch on caller thread
* Release 1.9.859-alpha4 on 2026-03-16
* [ASYNC-273](https://clojure.atlassian.net/browse/ASYNC-273) (CLJ) alts!! callbacks should dispatch on caller when possible
* [ASYNC-274](https://clojure.atlassian.net/browse/ASYNC-274) (CLJ) Fixed flow/futurize stopped returning a future on Executor change
diff --git a/VERSION_TEMPLATE b/VERSION_TEMPLATE
index 0b201e4..bd1b496 100755
--- a/VERSION_TEMPLATE
+++ b/VERSION_TEMPLATE
@@ -1 +1 @@
-1.9.GENERATED_VERSION-alpha4
+1.10.GENERATED_VERSION-alpha2
diff --git a/pom.xml b/pom.xml
index d010746..2498912 100644
--- a/pom.xml
+++ b/pom.xml
@@ -3,7 +3,7 @@
org.clojure
core.async
- 1.9.860-SNAPSHOT
+ 1.10.865-SNAPSHOT
jar
core.async
Facilities for async programming and communication in Clojure
diff --git a/src/main/clojure/clojure/core/async/flow/impl.clj b/src/main/clojure/clojure/core/async/flow/impl.clj
index 8486eaa..36d0b0b 100644
--- a/src/main/clojure/clojure/core/async/flow/impl.clj
+++ b/src/main/clojure/clojure/core/async/flow/impl.clj
@@ -14,7 +14,7 @@
[clojure.core.async.impl.dispatch :as disp]
[clojure.walk :as walk]
[clojure.datafy :as datafy])
- (:import [java.util.concurrent Future Executor TimeUnit CompletableFuture]
+ (:import [java.util.concurrent Future Executor TimeUnit FutureTask]
[java.util.concurrent.locks ReentrantLock]))
(set! *warn-on-reflection* true)
@@ -31,8 +31,8 @@
(let [^Executor e (if (instance? Executor exec)
exec
(disp/executor-for exec))
- fut (CompletableFuture.)]
- (.execute e #(.complete fut (apply f args)))
+ fut (FutureTask. #(apply f args))]
+ (.execute e fut)
fut)))
(defn prep-proc [ret pid {:keys [proc, args, chan-opts] :or {chan-opts {}}}]
diff --git a/src/test/clojure/clojure/core/async/flow_test.clj b/src/test/clojure/clojure/core/async/flow_test.clj
index d215258..fa81b90 100644
--- a/src/test/clojure/clojure/core/async/flow_test.clj
+++ b/src/test/clojure/clojure/core/async/flow_test.clj
@@ -5,20 +5,28 @@
;; By using this software in any fashion, you are agreeing to be bound by
;; the terms of this license.
;; You must not remove this notice, or any other, from this software.
-
(ns clojure.core.async.flow-test
(:require [clojure.test :refer :all]
- [clojure.core.async.flow :as flow]))
+ [clojure.core.async.flow :as flow])
+ (:import [java.util.concurrent TimeUnit Future ExecutionException]))
+
+(set! *warn-on-reflection* true)
(deftest test-futurize
- (testing ""
+ (testing "Happy path use of futurize"
(let [in-es? (atom false)
es (reify java.util.concurrent.Executor
- (^void execute [_ ^Runnable f]
- (reset! in-es? true)
- (future-call f)))]
+ (^void execute [_ ^Runnable r]
+ (reset! in-es? true)
+ (future (.run r))))]
(is (= 16 @((flow/futurize #(* % %) {:exec :mixed}) 4)))
(is (= 16 @((flow/futurize #(* % %)) 4)))
(is (= 16 @((flow/futurize #(* % %) {:exec es}) 4)))
- (is @in-es?))))
-
+ (is @in-es?)))
+ (testing "ASYNC-275 regression: futurize Future instance propagates exceptions"
+ (let [cause (ex-info "boom" {})
+ fut ((flow/futurize (fn [] (throw cause)) {:exec :mixed}))
+ ex (try
+ (.get ^Future fut 1000 TimeUnit/MILLISECONDS)
+ (catch ExecutionException e e))]
+ (is (= cause (.getCause ^ExecutionException ex))))))