21 Commits
Author SHA1 Message Date
jiaqizhoandGitHub 4e6bea5789 fix: avoid aws-chunked uploads for compatible object stores (#51349)
issue: #50567

use `minio.disableAWSChunkedEncoding` to disable the aws chunked
Encoding.

Signed-off-by: jiaqizho <jiaqi.zhou@zilliz.com>
2026-07-16 11:56:38 +08:00
jiaqizhoandGitHub b847349e39 enhance: bump milvus-storage to e658197 (#51406)
issue: #50915 

for errorcode and lance upgrade to 7.0.0

Signed-off-by: jiaqizho <jiaqi.zhou@zilliz.com>
2026-07-15 20:02:37 +08:00
jiaqizhoandGitHub 4018b29458 enhance: bump storage to bb3a975 (#50631)
issue: #50630 #50624 
bump storage to a27f61b

Signed-off-by: jiaqizho <jiaqi.zhou@zilliz.com>
2026-06-28 10:26:26 +08:00
jiaqizhoandGitHub 5e86706679 enhance: support storage format compaction and metrics (#50280)
#issue: #50182

Storage version compaction used to only care whether a segment had
reached the target storage version. That is not enough once StorageV3
segments can still have different column-group formats, because a
segment may already be V3 but still not match the format DataNode is
configured to write. This change lets DataCoord use the same compaction
path to refresh those segments by format as well.

The implementation adds a separate storage format compaction switch and
enables the policy when either version or format compaction is turned
on. For V3 segments, DataCoord now checks every field binlog format
against the configured target format, schedules only the segments that
actually need a rewrite, and keeps the existing health, L0, importing,
compacting, and snapshot-protection filters in place. External
collections are skipped so table-backed segments are not accidentally
pulled into this internal rewrite flow.

Segment metrics now include a segment format label in addition to state,
level, sorted status, and storage version. The metric update path also
tracks format transitions when binlogs are added or rewritten, including
legacy, unknown, and mixed-format cases, so DataCoord can report how
storage formats are distributed while segments move through refresh and
compaction.

---------

Signed-off-by: jiaqizho <jiaqi.zhou@zilliz.com>
2026-06-11 15:02:26 +08:00
385caab437 fix: use C++20 for Conan build profile (#50294)
issue: https://github.com/milvus-io/milvus/issues/47425
Milvus already asks Conan to build the C++ third-party stack with C++20
for the host profile, but Conan keeps the build profile separate. That
means packages used during the build can still fall back to the default
C++ standard, which caused protobuf and abseil to be compiled as gnu17
in some environments and fail during the dependency build.

This change passes C++20 to the Conan build profile as well, so both the
host context and the build context use the same language level. It
applies the setting to both Linux Conan install branches in the
third-party build script, including the gcc4 ABI path and the normal
libstdc++11 path.

Signed-off-by: jiaqizho <jiaqi.zhou@zilliz.com>
Co-authored-by: EC2 Default User <ec2-user@ip-10-15-6-84.us-west-2.compute.internal>
2026-06-09 11:24:19 +08:00
jiaqizhoandGitHub 67bf8501b7 fix: bump storage df61720 to fix fs cache (#50358)
issue: #50357
bump storage df61720

Signed-off-by: jiaqizho <jiaqi.zhou@zilliz.com>
2026-06-08 10:22:18 +08:00
jiaqizhoandGitHub 926ad468bd fix: stabilize sparse search test with different nq (#50296)
issue: #50293

The sparse different-nq test was flaky because the collection data and
query data were generated from different sparse dimension ranges. The
collection rows used the test default dimension, while the query helper
defaulted to a much larger dimension. With drop_ratio_search=0.2, some
queries could lose all useful overlapping terms and return zero hits,
even though the test only wanted to verify nq=1 and nq=100 batch search
behavior.

ex.

```text
  1. sparse data in collection is generated with dim=128

     The inserted sparse vectors only use dimensions in [0, 127].
     The generator also forces every vector to contain dimensions 0 and 1.

     sparse_vector: {0: 0.80, 1: 0.60, 20: 0.40, 77: 0.90, ...}

  2. query was generated with dim=1000

     The query sparse vector may use dimensions in [0, 999].
     It also contains dimensions 0 and 1, but most random dimensions may be outside [0, 127].

     sparse_vector: {0: 0.01, 1: 0.02, 250: 0.70, 600: 0.50, 900: 0.80, ...}

  3. after drop_ratio_search=0.2, low-weight query terms may be dropped

     sparse_vector after pruning: {250: 0.70, 600: 0.50, 900: 0.80, ...}

  4. the remaining query dimensions do not exist in the collection sparse data

     collection dimensions: [0, 127]
     remaining query dimensions: 250, 600, 900

     There is no sparse term overlap, so the sparse index has no candidates for this query.

  5. search can return 0 hits

     The test expects topK=10 for every query result group, so this random no-overlap query makes the case fail.
```

This fixes the test by generating query sparse vectors with
ct.default_dim, the same dimension range used by the inserted sparse
data. That keeps the test focused on the intended behavior: sparse
search should handle different nq values and return the expected result
shape, without depending on accidental cross-dimension overlap surviving
sparse term pruning.

Signed-off-by: jiaqizho <jiaqi.zhou@zilliz.com>
2026-06-05 14:12:18 +08:00
jiaqizhoandGitHub 39f4d73759 fix: align azure address uri with milvus-storage (#50048)
issue: #49931
Azure needs a slightly different endpoint shape than S3-compatible
storage when the packed storage path builds properties for Loon. The old
flow treated every provider the same and always converted the address
into a full HTTP(S) URI, which works for S3 and MinIO but does not match
the Azure address format expected by milvus-storage.

This change makes the provider-specific normalization explicit at the
FFI boundary. Non-Azure storage keeps the existing useSSL based scheme
handling, while Azure addresses are passed as a bare authority by
stripping any http:// or https:// prefix from user config. This keeps
Azure compatible with milvus-storage without changing the behavior for
other object storage providers.
2026-06-04 17:04:17 +08:00
jiaqizhoandGitHub 54acb3e4b4 enhance: preserve storage v3 writer formats from manifests when appending (#50227)
issue: #50182

Storage V3 can now keep writing a segment after
`dataNode.storage.format` changes. The main problem was that an
already-started growing segment may have a committed manifest written
with one format, while the current global config has moved to another
format. In that case, the next append must follow the format already
recorded in the manifest instead of blindly using the new global config.

This keeps writer.format as the current global setting, but makes the
actual split policy format local to the writer path. QueryNode growing
flush resolves writer.split.single.format from the acknowledged manifest
when one exists, and falls back to the global config only for a
brand-new segment. DataNode Storage V3 flush carries column group
formats through SegmentInfo and passes them as
writer.split.schema_based.formats, so schema-based writes can append
with the formats already known for each column group.

The metadata path now records the column group format in FieldBinlog and
preserves it through recovery, merge, duplicate filtering, fake external
segment binlogs, and V3 compaction output. This lets metacache rebuild
the current split with enough information to choose writer formats
without reading the manifest on every flush.

The storage writer wrappers now accept explicit writer format properties
for both regular packed writers and TEXT-aware segment writers. TEXT LOB
files still use their own LOB path and storage behavior; the format
selection here applies to the segment column groups that store normal
data and LOB references, not to changing the LOB payload file layout.

Signed-off-by: jiaqizho <jiaqi.zhou@zilliz.com>
2026-06-04 15:42:18 +08:00
jiaqizhoandGitHub 148bcc3e87 enhance: force CRC32C when OpenSSL FIPS is enabled (#50239)
issue: #48359

This change makes Milvus automatically use CRC32C for S3 PutObject
requests when OpenSSL FIPS mode is active. In FIPS mode, checksum
choices are more constrained, so relying on the configured MinIO
checksum behavior can lead to requests using an algorithm that is not
acceptable in that runtime.

The implementation moves OpenSSL FIPS enablement into the shared
`pkg/util/fips` package and makes it return whether FIPS was actually
enabled. That lets startup code keep enabling OpenSSL FIPS as before,
while paramtable can also reuse the same state during config
initialization.

When FIPS is successfully enabled and `minio.ssl.useCRC32C` is still
false, Milvus now logs a warning and temporarily overrides the runtime
value to true. This keeps the user-facing config unchanged, but makes
the effective runtime behavior compatible with FIPS requirements.

Signed-off-by: jiaqizho <jiaqi.zhou@zilliz.com>
2026-06-03 15:18:19 +08:00
jiaqizhoandGitHub 9da2858dd5 enhance: add configurable storage writer format (#50067)
issue: #50147

This change pulls the Vortex writer-format switch into its own focused
update. The goal is to make the insert data storage format configurable
from Milvus config, so we can turn Vortex on for CI validation without
mixing it with the unrelated AssertInfo cleanup from the previous PR.

The implementation adds dataNode.storage.format and wires it through
paramtable as DataNodeCfg.StorageFormat, with vortex as the current
default for this branch. When storagev2 builds milvus-storage
properties, it now passes the selected value through writer.format,
which matches the updated milvus-storage property contract.

This also updates the C++ writer path to use PROPERTY_WRITER_FORMAT
instead of the old PROPERTY_FORMAT key. That keeps the growing-segment
flush path aligned with the new storage property naming while still
forcing the TEXT flush writer to parquet where that path expects parquet
output.

---------

Signed-off-by: jiaqizho <jiaqi.zhou@zilliz.com>
2026-05-29 16:46:14 +08:00
jiaqizhoandGitHub 3ba2615bb4 enhance: Reuse storage FFI property keys in Milvus (#49788)
issue: #49789

Milvus and milvus-storage were both defining the same property keys,
which made it easy for the two sides to drift apart. This changes Milvus
to read those keys directly from the const char* values exported by
milvus-storage, so the Go side stays aligned with the storage FFI
contract.

These values need to be Go vars instead of consts because C.GoString
reads from cgo-exported C symbols at init time. Go consts must be
compile-time constants, and a C const char* symbol is not a Go
compile-time string.

Signed-off-by: jiaqizho <jiaqi.zhou@zilliz.com>
2026-05-15 14:46:27 +08:00
jiaqizhoandGitHub 50e315d459 enhance: bump storage to 0b35d53 (#49615)
issue: #49616 #49523

Signed-off-by: jiaqizho <jiaqi.zhou@zilliz.com>
2026-05-14 16:40:11 +08:00
jiaqizhoandGitHub 6151ef0316 fix: Set MinIO CA cert default to empty (#49436)
issue: #49437

Make minio.ssl.tlsCACert default to an empty value instead of the
placeholder /path/to/public.crt. This way Milvus will not set
SSL_CERT_FILE by default, and the process env only gets touched when the
user actually configures a custom CA file. The generated milvus.yaml and
the related paramtable test are updated to match the new default.

Signed-off-by: jiaqizho <jiaqi.zhou@zilliz.com>
2026-04-29 21:27:52 +08:00
jiaqizhoandGitHub 007867e647 enhance: bump milvus-storage version 9c4e211 (#49222)
issue:https://github.com/milvus-io/milvus/issues/49069 
storage issue: https://github.com/milvus-io/milvus-storage/issues/488

may fixed in [fix: restore GH-45304 empty-body S3 upload
workaround](https://github.com/milvus-io/milvus-storage/commit/f353c48b703e276cd5de3cd2312c1b0f6b8eb9f1).

Not sure about that.

Signed-off-by: jiaqizho <jiaqi.zhou@zilliz.com>
2026-04-23 05:19:47 +08:00
jiaqizhoandGitHub 4d1dad4407 enhance: bump milvus-storage to align 3.0 (#48604)
issue: #48623

bump b08080f([enhance: make CRC32C checksum configurable and extend to
all supported S3
requests](https://github.com/milvus-io/milvus-storage/commit/b08080f15212df076ebfa518df2ded28fa8383c3))
-> 4351a0c([fix: resolve type mismatch in ExtractExternalFsProperties
causing bad_variant_access
crash](https://github.com/milvus-io/milvus-storage/pull/465))

Signed-off-by: jiaqizho <jiaqi.zhou@zilliz.com>
2026-03-30 17:43:32 +08:00
jiaqizhoandGitHub 9340e7a5e7 enhance: add CRC32C checksum and TLS support for object storage (#48476)
issue: https://github.com/milvus-io/milvus/issues/48360
https://github.com/milvus-io/milvus/issues/48359

Add CRC32C checksum validation for MinIO/S3 PutObject requests and
enhance TLS configuration for object storage connections.

- Add minio.ssl.useCRC32C config option to enable CRC32C checksum on
PutObject requests for data integrity validation
- Pass TLS minimum version to GoogleHttpClientFactory and add
TlsHttpClientFactory for non-GCP storage when TLS is configured
- Add use_crc32c_checksum field to StorageConfig proto and propagate
through CGO layers
- Bump milvus-storage dependency

Signed-off-by: jiaqizho <jiaqi.zhou@zilliz.com>
2026-03-27 14:15:30 +08:00
jiaqizhoandGitHub 1c0302aa6e enhance: use bulk copy for nullable vector payload reading (#48086)
issue: https://github.com/milvus-io/milvus/issues/48088

The nullable vector reading code was duplicated across 5 functions
(BinaryVector, Float16Vector, BFloat16Vector, FloatVector, Int8Vector),
all doing the same per-element Value(i) loop to extract valid entries.

This pulls that logic into a shared readNullableVectorData helper and
switches to bulk-copying via ValueBytes(). This works because our
PayloadWriter uses BinaryBuilder.AppendNull() which produces zero-length
null entries in the Arrow Binary values buffer, so ValueBytes()
naturally gives us only the valid data packed together. A length
assertion is added just in case this invariant ever breaks.

Benchmarked with 100k rows at 50% null rate, seeing about 10-15% speedup
across the board (only benchmarked the affected read functions).

Signed-off-by: jiaqizho <jiaqi.zhou@zilliz.com>
2026-03-26 10:19:29 +08:00
jiaqizhoandGitHub e8f1f6f5fd enhance: propagate TLS minimum version config to C++ storage layer (#48028)
issue: https://github.com/milvus-io/milvus/issues/44999

The previous PR (#48000) added the configurable TLS minimum version on
the Go side but didn't wire it through to the C++ core. This commit
fills that gap by adding the tls_min_version field to CStorageConfig and
passing it down to all the places that build storage configs — index
builder, clustering analyzer, packed reader/writer, chunk manager, arrow
filesystem, and the loon FFI layer. Also bumps milvus-storage to a
version that supports the new property.

Signed-off-by: jiaqizho <jiaqi.zhou@zilliz.com>
2026-03-06 10:15:20 +08:00
jiaqizhoandGitHub ca89df5512 enhance: support configurable TLS minimum version for object storage connections (#48000)
Related to https://github.com/milvus-io/milvus/issues/44999

Currently Milvus doesn't allow users to control the TLS version used
when connecting to object storage (MinIO/S3/Azure/GCP). Some
environments require enforcing TLS 1.3 for compliance, but there's no
way to set that today.

This adds a new config option `minio.ssl.tlsMinVersion` that lets users
specify the minimum TLS version ("1.0", "1.1", "1.2", "1.3", or
"default"). It works across all supported storage backends including
MinIO/S3, Azure Blob, and GCP native. The setting is plumbed through
paramtable, proto StorageConfig, and all the places that create storage
clients (compaction, datacoord, datanode, storagev2, etc.).

For the GCP native backend, this also adds proper UseIAM/ADC support
that was previously missing, since the TLS transport injection needed to
handle both credential modes correctly.

Also fixed the GCP MinIO-compatible path to reuse any custom transport
(e.g. with TLS config) as the backend for the OAuth2 token wrapping,
instead of always creating a new default transport.

Unit tests cover the TLS version parsing, HTTP client construction, and
version enforcement (proving a TLS 1.3 client correctly rejects a TLS
1.2-only server). Integration tests are included but gated behind
environment variables.

Signed-off-by: jiaqizho <jiaqi.zhou@zilliz.com>
2026-03-04 19:45:21 +08:00
jiaqizhoandGitHub 1abcfd8127 enhance: Add sparse filter in search (#47444)
issue: https://github.com/milvus-io/milvus/issues/44373

Signed-off-by: jiaqizho <jiaqi.zhou@zilliz.com>
2026-02-02 10:09:49 +08:00