v0.3.11
What's Changed
- Fix/tent batch transfer merge boundary by @Primary33 in #1704
- docs: add TorchSpec in Mooncake README by @zhyncs in #1709
- [Store] Add eviction policy for BucketStorageBackend with batch master notification by @zhangzuo21 in #1646
- Support duration units for master TTL flags by @Primary33 in #1684
- E2E storage backend test by @maheshrbapatu in #1660
- [CI] Add hixl roce samples on ASCEND platforms. by @VNightMare in #1697
- Remove non-portable GCC-internal headers from Transfer Engine by @Copilot in #1716
- [STORE] introduce HA backend abstraction by @YiXR in #1678
- [TENT] fix: avoid resetting RDMA endpoint on duplicate concurrent bootstrap by @00fish0 in #1705
- [Bugfix] Fix tent_metrics build errors with TENT_METRICS_ENABLED=ON by @staryxchen in #1712
- [PG] Fix group size expansion by @caozhanhao in #1706
- build: add memory-aware compile/link parallelism by @staryxchen in #1718
- [Skill] feat: add trouble shooting skill by @stmatengss in #1724
- [EP] make num_ranks more flexible by @ympcMark in #1725
- [Misc] Improve developers' experience for EP & PG by @UNIDY2002 in #1708
- [TE] refactor ascend direct transport & adapt to dummy real mode of store by @ascend-direct-dev in #1720
- [STORE] add Redis leadership backend and HA regression coverage by @YiXR in #1722
- store: split client HA/control-plane threads and suppress zero-seg he… by @XucSh in #1736
- [Transfer Engine] add initial MACA build path and CUDA-like adapter by @Dayuxiaoshui in #1731
- add required library when build by @xleoken in #1674
- [PG] optimize p2p-proxy buffer size by @JunlinW113 in #1735
- [Store] Add hard pin mechanism for eviction-protected objects by @he-yufeng in #1728
- [PG] Increase kP2PBufferSize to unlock full performance potential by @UNIDY2002 in #1740
- Fix/tent store metadata override by @Primary33 in #1743
- [bug fix]Inconsistent parameter of NVMeoFTransport::submitTransferTask by @yz53665 in #1748
- add script for metadata management by @whybeyoung in #1746
- [Store] adapt to dummy real mode for ascend by @ascend-direct-dev in #1723
- [STORE] abstract snapshot catalog and add Redis snapshot backend by @YiXR in #1739
- Fix/tent slice queue race by @Primary33 in #1737
- [PG] Add GPU barrier support for mooncake-pg by @LuLuji04 in #1751
- [STORE] support Redis ACL username authentication and reorganize HA by @YiXR in #1757
- [TENT] fix tebench RPATH to find libasio.so at runtime by @alogfans in #1750
- add missing steps to efa transport readme by @bob-bins in #1759
- [PG] Enable asynchronous recovered-rank initialization with deferred join by @UNIDY2002 in #1744
- [DOC] Add troubleshooting for RDMA MKEY resource exhaustion by @00fish0 in #1765
- [TE] Fixed an issue where start_timestamp is retrieved but batch_desc has already been freed by @hjchen2 in #1760
- [TE] Fix simultaneous open handshake in RdmaEndpoint by @caozhanhao in #1733
- [tent] Set Auto_Connect as default by @Cheng-China in #1758
- [PG][TENT] Fix first-collective hangs on NVLink/MNNVL bootstrap by @KMSorSMS in #1755
- fix(tent): address build issues and enable CI coverage by @Primary33 in #1768
- [Skill] run mooncake unit tests locally by @stmatengss in #1774
- [Store] batch remove by @LujhCoconut in #1756
- fix: correct TP zero-copy put semantics by @zxpdemonio in #1685
- [Store] Fix SSD offload failure in Metadata Server mode (#1729) by @zhangzuo21 in #1771
- Fix TENT Python binding initialization and build output by @XucSh in #1778
- Bump version to 0.3.10.post1 in pyproject.toml by @ShangmingCai in #1788
- [Store] support resolving master RPC address from interface by @YiXR in #1784
- Bump google.golang.org/grpc from 1.59.0 to 1.79.3 in /mooncake-common/etcd by @dependabot[bot] in #1785
- [Transfer Engine] Round-robin slice batch across QPs in RdmaEndPoint::submitPostSend by @usernamehaha2022 in #1721
- [CI] Optimize CI/CD workflow execution order to implement a fail-fast mechanism by @LujhCoconut in #1782
- [STORE] split HA runtime and unify standby lifecycle by @YiXR in #1777
- [Build] add yalantinglibs submodule by @stmatengss in #1781
- [Store] Add C API for Mooncake Store by @jiangyukunok in #1763
- [P2P] fix: cannot disable NV_PEERMEM and enable CUDA at the same time by @stmatengss in #1797
- [Bugfix][Build] Fix S3SnapshotObjectStore Pimpl error & improve build reliability by @timzhang0727 in #1796
- fix: fix eviction notification unit test to ensure deterministic FIFO order by @00fish0 in #1800
- [TENT] Fix duplicate notify recv WR posting and PLOG misuse in RDMA endpoint by @dtcccc in #1803
- [CI] fix bugs with CI pr1782: fail-fast on format check and restore Ascend/Integration as PR gates by @LujhCoconut in #1806
- [Store] Add Upsert API for in-place object updates by @00fish0 in #1662
- [TENT] Disconnect before registering memory by @Cheng-China in #1807
- Update codeowners by @ykwd in #1819
- [Store] Add Go language bindings for Mooncake Store by @jiangyukunok in #1764
- [Misc] Fix silent failure in
code_format.shwhen clang-format is missing by @caozhanhao in #1824 - [PG] Implement graceful shutdown and reland CPU-only tests to CI by @caozhanhao in #1795
- [PG]: fix barrier imple problem by @KMSorSMS in #1792
- [TE] Enabling UB Transport on the Kunpeng SuperNode Phase 1 by @zchuango in #1805
- [PG] Introduce comprehensive test suite by @yuechen-sys in #1790
- [STORE] tighten snapshot correctness and reload snapshot-only standby from catalog by @YiXR in #1801
- Add native Rust bindings for Mooncake Store with usage example and CI integration by @Copilot in #1810
- [TENT] Fix NVLink IPC address for sub-allocated GPU tensors by @he-yufeng in #1831
- [PG][TE][TENT] Add dedicated peer liveness probe for recovery and enable elastic GPU test by @KMSorSMS in #1808
- [TE] feat: setup the RDMA for mlu device. by @phantomlei3 in #1799
- Optimize ci fail-fast scheme by @LujhCoconut in #1813
- fix: increase ParallelAllocation test pool to 32MB to avoid flaky slab race by @00fish0 in #1841
- [Bug fix] Fix get tcp port collision by @zhangzuo21 in #1816
- [TENT] Register base address of a buffer instead of its sub-allocated address into BufferDesc by @shuoerw in #1837
- [TE] Add Multi-Protocol Support for DRAM-CXL-SSD tiered storage by @hemist in #1832
- [TENT] Fix stale segment cache via withCachedSegment and async invalidation by @caozhanhao in #1826
- [Store] Introduce HA OpLog abstraction and LocalFS oplog store by @duhaode520 in #1804
- [TRANSFER_ENGINE] align USE_MACA with MUSA GPU paths and docs by @Dayuxiaoshui in #1814
- feat(store): expose drain job control via master HTTP API by @XucSh in #1815
- [TENT] Fix potential deadlock and UAF in
synchronizeLocalin #1826 by @caozhanhao in #1849 - fix(docker): respect PYTHON_VERSION build-arg when building wheel by @staryxchen in #1745
- [CI] Harden CI pipeline: path filtering, concurrency, on-demand E2E, and security fixes by @00fish0 in #1846
- [store] Add get_into_ranges to support Grouped Scatter RDMA Reads by @zxpdemonio in #1717
- [CI] fix: slash command /run-e2e-ci fails for fork PRs by @00fish0 in #1859
- [Store] Fix
with_hard_pinfailure in python API by @0oshowero0 in #1873 - [Bug fix] Prevent redundant replica pinning during offloading by @ertcmm in #1853
- [TransferEngine] Add retry, async execution, and graceful shutdown for TENT TCP transport by @staryxchen in #1866
- [TransferEngine][ROCm] Add ROCm HIP support to the Mooncake Python package by @knitcapcat-amd in #1742
- [Docs] Add SSD offload benchmark results by @zhangzuo21 in #1835
- [Store] Support SSD offload via Python setup() interface by @zhangzuo21 in #1857
- [MISC] Add CODEOWNERS for efa_transport directory by @stmatengss in #1885
- [TE] Enabling UB Transport on the Kunpeng SuperNode Phase 2 by @zchuango in #1855
- [TransferEngine][MACA] Align MACA build paths with CMake options by @Dayuxiaoshui in #1888
- [TENT] Wire up cross-transport failover with safety limits and observability by @staryxchen in #1878
- [TENT] Enhance memory registration with transport type support by @staryxchen in #1877
- [Store] Support SSD Metrics by @LujhCoconut in #1879
- [TENT] Fix crashes caused by negative numa_node and incorrect config type inference by @dtcccc in #1894
- [Store] Enable NUMA-segmented allocation for RDMA RealClient-only mode by @00fish0 in #1838
- [CI] fix: health_check_test flaky due to fixed sleep, use polling for master down detection by @herbertskyper in #1868
- [CI] add configurable GitHub mirror fallback for Ascend checkout by @staryxchen in #1896
- feat(tent): replace raw RdmaEndPoint* with weak_ptr for endpoint lifecycle safety by @staryxchen in #1897
- [Store] Fix hardcoded 127.0.0.1 bind address in standalone client RPC… by @zhangzuo21 in #1900
- [TENT] Fix static library link group for final targets and reformat related CMake files by @staryxchen in #1893
- [PG][TENT] Fix CUDA collective wait semantics and NVLink small-transfer completion by @KMSorSMS in #1863
- [Doc] Update Client Explanation by @ykwd in #1905
- [TE] Add fi_read support, endpoint LRU eviction, and multi-NIC striping for EFA transport by @whn09 in #1821
- [Store] Enabling setting SSD offload path using python interface by @zhangzuo21 in #1884
- [Store] Expose batch_replica_clear in Python binding by @hnts03-moreh in #1848
- [CI] add format hook by @stmatengss in #1904
- [TENT] Batch transfer requests using cudaMemcpyBatchAsync by @shuoerw in #1890
- Minor bug fixes and improvments for Mooncake Store and Transfer Engine by @nickyc975 in #1895
- [Store] Fix segfault in disk-replica/offload paths when handling GPU VRAM pointers by @LujhCoconut in #1892
- fix(ci): retry ascend submodule update via GitHub mirrors by @staryxchen in #1924
- [TENT] add FaultProxyTransport for fault injection testing by @staryxchen in #1907
- [TE] PTE-aware auto-split large MR registration for EFA transport by @whn09 in #1912
- [Store] Add client bandwidth metrics for real and dummy clients by @stmatengss in #1874
- [store] Bug Fix: Local Disk Replica Metadata Not Cleaned Up After Store Node Offline by @Colors-111 in #1914
- [Store] unify file storage backend env vars under MOONCAKE_OFFLOAD_ p… by @LujhCoconut in #1929
- [Integration] connector_v1: subclass SupportsHMA so PD-disagg works for hybrid models by @HarshavardhanK in #1931
- [Store] auto-enable MC_STORE_MEMCPY in TCP-only environments by @dtcccc in #1936
- [TE] Fix a 1-second stall in RDMA WorkerPool due to store-buffer reordering by @chestnut-Q in #1932
- [CI] Restore auto-triggered ascend-test and integration-test in ci.yml by @LujhCoconut in #1943
- [PG] Fix wait() hang during CUDA Graph capture by @caozhanhao in #1933
- [Store]: Wait for all tasks to complete before completing a batch by @nickyc975 in #1906
- Pin a patched Go toolchain and track etcd go.sum for wrapper builds by @Copilot in #1937
- Refactor ASIO shared target into mooncake-common by @Copilot in #1926
- Bump version to 0.3.10.post2 in pyproject.toml by @ShangmingCai in #1949
- Update build_wheel.sh package installation logic by @ShangmingCai in #1950
- [Store] setup logs dir for realclient_main by @mzygQAQ in #1925
- [Store] Support storage hierarchy with offload-on-evict mode by @hnts03-moreh in #1899
- [Store][K8s-Native][1/N] Go-library for k8s leader election by @vladnosiv in #1910
- [TE] EFA SRD shared-endpoint refactor: drop per-peer fid_ep model by @whn09 in #1944
- [Build] Upgrade yalantinglibs to 6a0e067d by @stmatengss in #1961
- [TE] reduce reg overhead by @stmatengss in #1964
- [Docs] Update Mooncake Conductor design and API docs by @yejj710 in #1977
- [docs] Document TCP port exhaustion and pool limitations by @zhangzuo21 in #1954
- [transfer_engine] fix: drain endpoint waiting list via periodic reclaim by @ccs1112 in #1952
- [transfer_engine] feat: make RDMA QP pkey_index configurable via MC_PKEY_INDEX by @yan-lgtm in #1985
- [bugfix] Enable Mermaid rendering in Sphinx docs by @yejj710 in #1981
- [Store] Fix DSO missing error when building with USE_3FS=ON by @yz53665 in #1983
- [CI] route fork PR to pull_request_target for ascend/integration tests by @staryxchen in #1989
- [CI] optimize build-flags job and add TENT compilation test by @00fish0 in #1775
- [Store] fix(test): avoid in-process master port collisions by @Lin-z-w in #1987
- [Store] Unified parallel tensor IO by @zxpdemonio in #1389
- [TENT][Sunrise] Add sunrise_link transport, platform support, and UT … by @HomeDish in #1915
- fix: hardcode Ascend mirror URL and remove pull_request_target routing by @staryxchen in #1992
- fix (CI): remove pull_request_target trigger completely by @staryxchen in #1994
- [Store] support host mem in ascend dummy-real mode by @ascend-direct-dev in #1917
- [Store] Add standalone HTTP mount_shm/unmount_shm API with reconfiguration support by @Lin-z-w in #1928
- [Store] Add Rust smoke test, benchmark, and CI coverage by @stmatengss in #1927
- [Bug fix]: async offload RPC to prevent client expiration and shm_not_mappedFix/issue 1711 async offload rpc by @zhangzuo21 in #1734
- [Store] Fix: KEYS_ULTRA_LIMIT error in eviction-enabled BucketStorageBackend by @Colors-111 in #1941
- [CI] fix: temporarily exclude ub_transport_test from CI by @00fish0 in #2007
- [Store] fix invalid acquire with release for atomic store by @NUABO in #1996
- [Store] Fix LOCAL_MEMCPY segfault for multi-process-per-node deployments (e.g. vLLM data-parallel) by @LCAIZJ in #1995
- [TENT] Recover cooled-down RDMA rails and add failover e2e tests by @staryxchen in #1984
- [TENT] Fix RPC server IPv6 binding on IPv6-only hosts by @Nishikant-K-P in #2014
- [TE] Fix DMA-BUF validation using wrong CUDA device index by @Nishikant-K-P in #2015
- [TE] To avoid inconvenience during debugging, remove redundant checks. by @Cheng-China in #2020
- [Store][Rust] Add batch_put_from, batch_get_into, batch_is_exist wrappers by @Dayuxiaoshui in #1993
- Save the active device with hipGetDevice on entry and restore it before by @Lzy17 in #2018
- [TE] Fix EFA segfault race and DP>1 peer_map_ thrashing by @whn09 in #2023
- [Store] Add lock-free MmapArena allocator for buffer mmap path by @Venkat2811 in #1820
- Allow customizing client port range by @riZZZhik in #2008
- [Build] Define BUILD_BENCHMARK option and gate benchmark subdirectories by @tmchow in #2033
- Updating news section in README by @Copilot in #2038
- [TransferEngine] Init CUDA primary context before dmabuf-based mem registration by @ivanium in #2034
- [TE][FIX]: Typo: PRC -> RPC in min/max ports by @riZZZhik in #2037
- [TransferEngine] Unify fabric allocator plumbing by @stmatengss in #2028
- [TE]: Fix possible dead lock in RDMA transport connection setup by @nickyc975 in #1959
- [TransferEngine] Use allocation base addr for dmabuf-based mem registration by @ivanium in #2035
- [PG] Inherit ProcessGroup to fix dynamic getSize() after extend_group_size_to by @UNIDY2002 in #2040
- [TE] fix(efa): request libfabric API 1.18 so device RDMA is the default on all EFA generations by @whn09 in #2041
- [TE] rdma: fix use-after-free crash in ibv_post_send caused by concurrent QP destruction by @dtcccc in #1903
- [doc] vllm MooncakeStoreConnector by @LujhCoconut in #2042
- [PG] Fix P2P regression caused by ProcessGroup inheritance (#2040) by @UNIDY2002 in #2043
- [PG] Refactor P2PProxy with shared chunk pools and receiver-driven credit-based flow control by @caozhanhao in #1971
- [EP] Add a comprehensive test for MooncakeEP by @caozhanhao in #1695
- fix(transfer-engine): add missing empty checks for batch methods by @SYaoJun in #2046
- docs: add vLLM Mooncake Store blog post to README updates by @Copilot in #2052
- [Tent][AMD] Add AMD CDNA4 (ROCm/HIP) platform support with benchmark tooling by @zhangnju in #2021
- [Store] Add DSA-like allocator benchmark workload by @yokinoshitayoki in #2051
- [Store] fix(master-metrics): track local SSD storage in Master metrics by @LujhCoconut in #1969
- [Store] feat(store): add allocate-backed segment mount and unmount APIs by @Lin-z-w in #2006
- [Doc] feat: readme hardware by @stmatengss in #2053
- [TENT] Add reference counting to RdmaTask to prevent UAF by @alogfans in #2047
- [Store]Fix SSD offload in Metadata Server mode: sync ClientBuffer to metadata server by @Colors-111 in #1939
- [engram] support engram by @zxpdemonio in #1483
- fix(rust): add missing empty check for batch_is_exist by @SYaoJun in #2045
- [Store] Fix disk replica read paths for GPU KV cache (LOCAL_DISK zero-copy, DISK temp-buf scatter) by @LujhCoconut in #2004
- [TransferEngine] Add maca_transport for Metax MACA C500 intra-node P2P by @Dayuxiaoshui in #2059
- [tebench] support nvlink xport and register buffers per-allocation by @jinke446 in #2073
- [TENT] fallback to per-task cudaMemcpyAsync when driver lacks batch s… by @jinke446 in #2072
- [TransferEngine] Fix GPU dependency in transfer_engine_bench by @xiejibing in #2068
- [TransferEngine][Integration] feat: add MACA/MetaX GPU support and fix RDMA dmabuf registration by @JoeZhang-0x000 in #2019
- [devcontainer] use build.dockerFile instead of dockerfile and add libxxhash-dev by @vie-serendipity in #2067
- [Store] Optimize SpinLock via adding a fast-path check by @LujhCoconut in #2076
- [Store][Fix]: enable local memcpy for metadata local replicas by @fang-tech in #2029
- [Store] Add DSA-like workload allocation strategy and update allocator benchmarks by @yokinoshitayoki in #2080
- [Store] Expose is_local_disk_replica() to Python + enable offload RPC in standalone mooncake_client by @zhewenl in #2083
- [Store] add SSD offload support for ascend platform by @ascend-direct-dev in #2005
- [Store] Add ObjectDataType enum for type-aware metadata by @he-yufeng in #1719
- [Docs] Tag 3fs Feature as Experimental by @ykwd in #2062
- [Doc] Align SSD offload docs with implementation by @stmatengss in #2027
- [Doc] Fix the inconsistent param description by @ykwd in #2103
- [Store] Add comprehensive test suite for Python binding error handling by @yurekami in #2097
- [CI] pin torch version to 2.11.0 by @UNIDY2002 in #2105
- feat(ci): update EP/PG torch versions — drop 2.9.0, add 2.12.0; switch CUDA 12.8→12.6 by @UNIDY2002 in #2101
- [Store][K8s-Native][2/N] K8s leader election by @vladnosiv in #1956
- [Store] Fix Rust store build path by @ZhenyuePan in #2114
- [TE] Expose sendProbe via Python binding by @kflansburg in #2088
- [Store] fix: prevent cross-process memcpy segfault when MC_STORE_MEMCPY auto-enables by @Yeuvoir in #2001
- [Store] feat: add graceful segment unmount APIs by @Lin-z-w in #2065
- [TENT] Fix batch getTransferStatus premature FAILED aggregation by @staryxchen in #2055
- fix: mooncake_master -version prints release version and git commit hash by @Copilot in #2110
- Fix scale-up semantics with two-phase extension protocol by @UNIDY2002 in #1968
- feat: add Hygon DCU/DTK and Iluvatar CoreX platform support by @UNIDY2002 in #2118
- [Doc] Add missing space by @ykwd in #2104
- [TENT] Apply TE's changes of RDMA transport by @alogfans in #2102
- [CI] change dependency
libboost-all-devtolibboost-devby @UNIDY2002 in #2129 - [Docs] clarify Redis build options by @Lin-z-w in #2136
- [Store] Report master metrics as per-second rates over time window by @Lin-z-w in #2082
- [Doc] fix ssd offload deployment doc by @Baichuan7 in #2139
- [CI/Build] Support configurable build dir in build_wheel.sh by @stmatengss in #2133
- [TE] Update IntraNode NVLink transfer method cuMemcpy -> cuMemcpyAsync by @TTThanos in #2012
- CI: refactor TENT build and add test step by @staryxchen in #2142
- [PG] support external TE by @UNIDY2002 in #2149
- [TransferEngine] Gate auto failover on status polling by @ZhenyuePan in #2122
- [CI/Build] Switch WITH_NVIDIA_PEERMEM to env variable by @stmatengss in #2066
- [TENT] Proxy manager bugfixes by @alogfans in #2091
- [Store] Fix std::terminate crash on mooncake client shutdown (Issue#2115) by @LujhCoconut in #2125
- [Doc] Update EFA transport doc: SGLang section + vllm-router + p5.48xlarge bench by @whn09 in #2154
- feat(store): add NoF segment metadata management by @zwtao40 in #2143
- [Store] correct GC interval default fallback in FromEnvironment by @LujhCoconut in #2126
- [TE] Fix pytorch precision problem when using IntraNode NVLINK by @TTThanos in #2163
- [Store] Fix Ascend dummy reconnect shm replay by @ascend-direct-dev in #2158
- Bump version to 0.3.11 in pyproject.toml by @ShangmingCai in #2166
- [Store] L2->L1 promotion-on-hit by @yzhan1 in #2071
- Use sudo -E for make install in release workflow by @ShangmingCai in #2169
New Contributors
- @Dayuxiaoshui made their first contribution in #1731
- @JunlinW113 made their first contribution in #1735
- @yz53665 made their first contribution in #1748
- @LuLuji04 made their first contribution in #1751
- @bob-bins made their first contribution in #1759
- @LujhCoconut made their first contribution in #1756
- @usernamehaha2022 made their first contribution in #1721
- @jiangyukunok made their first contribution in #1763
- @timzhang0727 made their first contribution in #1796
- @zchuango made their first contribution in #1805
- @phantomlei3 made their first contribution in #1799
- @shuoerw made their first contribution in #1837
- @0oshowero0 made their first contribution in #1873
- @ertcmm made their first contribution in #1853
- @knitcapcat-amd made their first contribution in #1742
- @herbertskyper made their first contribution in #1868
- @hnts03-moreh made their first contribution in #1848
- @Colors-111 made their first contribution in #1914
- @HarshavardhanK made their first contribution in #1931
- @mzygQAQ made their first contribution in #1925
- @ccs1112 made their first contribution in #1952
- @yan-lgtm made their first contribution in #1985
- @Lin-z-w made their first contribution in #1987
- @HomeDish made their first contribution in #1915
- @NUABO made their first contribution in #1996
- @Nishikant-K-P made their first contribution in #2014
- @Lzy17 made their first contribution in #2018
- @Venkat2811 made their first contribution in #1820
- @riZZZhik made their first contribution in #2008
- @tmchow made their first contribution in #2033
- @ivanium made their first contribution in #2034
- @zhangnju made their first contribution in #2021
- @yokinoshitayoki made their first contribution in #2051
- @jinke446 made their first contribution in #2073
- @xiejibing made their first contribution in #2068
- @JoeZhang-0x000 made their first contribution in #2019
- @vie-serendipity made their first contribution in #2067
- @fang-tech made their first contribution in #2029
- @zhewenl made their first contribution in #2083
- @yurekami made their first contribution in #2097
- @ZhenyuePan made their first contribution in #2114
- @kflansburg made their first contribution in #2088
- @Yeuvoir made their first contribution in #2001
- @Baichuan7 made their first contribution in #2139
- @zwtao40 made their first contribution in #2143
- @yzhan1 made their first contribution in #2071
Full Changelog: v0.3.10...v0.3.11