Some checks failed
go: build dev binaries / cleanup (push) Successful in 4s
Codespell / Check for spelling errors (push) Failing after 3s
docker: build dev containers / build-rust-binaries (amd64, x86_64-unknown-linux-musl) (push) Failing after 3s
docker: build dev containers / build-dev-containers (push) Has been skipped
docker: build dev containers / build-rust-binaries (arm64, true, aarch64-unknown-linux-musl) (push) Failing after 3s
End to End / FUSE Mount (push) Failing after 2s
EC Integration Tests / EC Integration Tests (push) Failing after 30s
FUSE DLM Integration Tests / FUSE DLM Integration Tests (push) Failing after 3s
FUSE Volume Server Failover Tests / FUSE Volume Server Failover (push) Failing after 3s
FUSE Integration Tests / FUSE Integration Testing (push) Failing after 2s
FUSE P2P Peer Chunk Sharing Integration Tests / FUSE P2P Peer Chunk Sharing (push) Failing after 3s
go: build binary / Go Vet (push) Failing after 2s
go: build binary / Go Vet 32-bit (push) Failing after 3s
go: build binary / Build (push) Failing after 4s
go: build binary / Build cross-platform (freebsd/amd64) (push) Failing after 3s
go: build binary / Build cross-platform (windows/amd64) (push) Failing after 3s
go: build binary / Build cross-platform (darwin/arm64) (push) Failing after 3s
go: build binary / Build cross-platform (windows/arm64) (push) Failing after 3s
go: build binary / Test (push) Failing after 2s
go: build binary / Test 32-bit (push) Failing after 3s
helm: lint and test charts / lint-test (push) Failing after 3s
Java Client Integration Tests / Java Integration Tests (11) (push) Failing after 3s
Java Client Integration Tests / Java Integration Tests (17) (push) Failing after 3s
go: build dev binaries / build_dev_linux_windows (amd64, linux) (push) Failing after 2s
go: build dev binaries / build_dev_linux_windows (amd64, windows) (push) Failing after 3s
go: build dev binaries / build_dev_darwin (amd64, darwin) (push) Has been skipped
go: build dev binaries / build_dev_darwin (arm64, darwin) (push) Has been skipped
Java Client Unit Tests / Java Unit Tests (11) (push) Failing after 3s
Java Client Unit Tests / Java Unit Tests (17) (push) Failing after 2s
Java Client Unit Tests / Java Unit Tests (21) (push) Failing after 3s
Java Client Unit Tests / Java Unit Tests (8) (push) Failing after 3s
Kafka Quick Test (Load Test with Schema Registry) / Kafka Client Load Test (Quick) (push) Failing after 3s
Kafka Gateway Tests / Kafka Unit Tests (unit-tests-1) (push) Failing after 11s
Kafka Gateway Tests / Kafka Integration Tests (Critical) (integration-1) (push) Failing after 3s
Kafka Gateway Tests / Kafka End-to-End Tests (with SMQ) (e2e-1) (push) Failing after 3s
Kafka Gateway Tests / Kafka Consumer Group Tests (Highly Isolated) (consumer-group-1) (push) Failing after 2s
Kafka Gateway Tests / Kafka Client Compatibility (with SMQ) (client-compat-1) (push) Failing after 3s
Kafka Gateway Tests / Kafka SMQ Integration Tests (Full Stack) (smq-integration-1) (push) Failing after 3s
Kafka Gateway Tests / Kafka Protocol Tests (Isolated) (protocol-1) (push) Failing after 3s
KMS Tests / KMS Provider Integration Tests (push) Failing after 2s
KMS Tests / S3 KMS End-to-End Tests (push) Failing after 3s
Master Cold Start Tests / Master Cold Start Tests (push) Failing after 4s
Metadata Subscribe Integration Tests / Metadata Subscribe Integration Tests (push) Failing after 3s
Multi-Master Tests / Multi-Master Failover Tests (push) Failing after 3s
Performance / CPU and Heap Profile (push) Failing after 2s
Performance / S3 Read/Write Benchmark (rust volume) (push) Failing after 3s
pjdfstest POSIX Compliance / pjdfstest (push) Failing after 2s
Plugin Worker Integration Tests / Plugin Worker: erasure_coding (push) Failing after 3s
Plugin Worker Integration Tests / Plugin Worker: vacuum (push) Failing after 3s
Rust Volume Server Tests / Rust Integration Tests (push) Failing after 3s
Rust Volume Server Tests / Go Tests with Rust Volume (grpc - Shard 1) (push) Failing after 2s
Rust Volume Server Tests / Go Tests with Rust Volume (http - Shard 1) (push) Failing after 3s
Rust Volume Server Tests / Go Tests with Rust Volume (grpc - Shard 2) (push) Failing after 3s
Rust Volume Server Tests / Go Tests with Rust Volume (http - Shard 2) (push) Failing after 3s
Rust Volume Server Tests / Go Tests with Rust Volume (grpc - Shard 3) (push) Failing after 3s
S3 IAM Integration Tests / S3 IAM Distributed Tests (push) Failing after 2s
S3 IAM Integration Tests / S3 IAM Performance Tests (push) Failing after 3s
Performance / Throughput Benchmark (go volume) (push) Failing after 3s
Performance / Throughput Benchmark (rust volume) (push) Failing after 2s
Performance / S3 Read/Write Benchmark (go volume) (push) Failing after 3s
Plugin Worker Integration Tests / Plugin Worker: volume_balance (push) Failing after 3s
PostgreSQL Gateway Tests / PostgreSQL Basic Tests (push) Failing after 3s
Rust Volume Server Tests / Rust Unit Tests (push) Failing after 2s
Rust Volume Server Tests / Go Tests with Rust Volume (http - Shard 3) (push) Failing after 3s
Rust Plugin Worker Tests / Rust Plugin Worker Build and Unit Tests (push) Failing after 3s
rust: build dev volume server binaries / cleanup (push) Successful in 3s
S3 ETag and ACL Tests / S3 ETag + ACL Integration Tests (push) Failing after 3s
S3 IAM Integration Tests / IAM Unit Tests (push) Failing after 3s
S3 IAM Integration Tests / S3 IAM Integration Tests (advanced) (push) Failing after 3s
S3 IAM Integration Tests / S3 IAM Integration Tests (basic) (push) Failing after 2s
S3 IAM Integration Tests / S3 IAM Integration Tests (group) (push) Failing after 3s
S3 IAM Integration Tests / S3 IAM Integration Tests (policy-enforcement) (push) Failing after 2s
S3 IAM Integration Tests / S3 IAM Integration Tests (sts) (push) Failing after 4s
S3 Keycloak Integration Tests / S3 Keycloak Integration Tests (push) Failing after 3s
S3 PyArrow Parquet Tests / PyArrow Parquet Tests (Python 3.11) (push) Failing after 3s
S3 PyArrow Parquet Tests / Go Unit Tests (Implicit Directory) (push) Has been cancelled
S3 PyArrow Parquet Tests / PyArrow Parquet Tests (Python 3.12) (push) Has been cancelled
rust: build dev volume server binaries / build-rust-volume-dev-darwin (darwin-amd64, x86_64-apple-darwin) (push) Has been cancelled
rust: build dev volume server binaries / build-rust-volume-dev-darwin (darwin-arm64, aarch64-apple-darwin) (push) Has been cancelled
rust: build dev volume server binaries / build-rust-volume-dev-linux (linux-amd64, x86_64-unknown-linux-gnu) (push) Has been cancelled
S3 PyArrow Parquet Tests / PyArrow Parquet Tests (Python 3.9) (push) Has been cancelled
S3 Proxy Signature Tests / S3 Proxy Signature Verification Tests (push) Has been cancelled
S3 SDK V2 Route Disambiguation Tests / S3 SDK V2 Routing Tests (push) Has been cancelled
S3 SSE Tests / S3 SSE Integration Tests (quick) (push) Has been cancelled
S3 SSE Tests / S3 SSE Compatibility Test (push) Has been cancelled
S3 SSE Tests / S3 SSE Metadata Persistence Test (push) Has been cancelled
S3 SSE Tests / S3 SSE Copy Operations Test (push) Has been cancelled
S3 SSE Tests / S3 SSE Multipart Upload Test (push) Has been cancelled
S3 SSE Tests / S3 SSE Performance Test (push) Has been cancelled
S3 SSE Tests / S3 Volume Encryption Test (push) Has been cancelled
S3 SSE Tests / S3 SSE Integration Tests (comprehensive) (push) Has been cancelled
Spark Integration Tests / Spark Integration Tests (push) Failing after 2s
Telemetry Integration Tests / telemetry-integration-test (push) Failing after 3s
Volume Server Integration Tests / Volume Server Integration Tests (grpc - Shard 1) (push) Failing after 3s
Volume Server Integration Tests / Volume Server Integration Tests (http - Shard 1) (push) Failing after 3s
Ceph S3 tests / Basic S3 tests (KV store) (push) Has been cancelled
Ceph S3 tests / S3 Versioning & Object Lock tests (push) Has been cancelled
S3 Policy Integration Tests / S3 Policy Unit Tests (push) Failing after 3s
Ceph S3 tests / S3 CORS tests (push) Has been cancelled
Ceph S3 tests / SeaweedFS Custom S3 Copy tests (push) Has been cancelled
Ceph S3 tests / Basic S3 tests (SQL store) (push) Has been cancelled
test s3 over https using aws-cli / awscli-tests (push) Has been cancelled
TLS Rotation Integration Tests / TLS Rotation Integration Tests (push) Has been cancelled
Vacuum Integration Tests / Vacuum Integration Tests (push) Has been cancelled
S3 Policy Integration Tests / S3 Policy Variables Integration Tests (push) Failing after 3s
S3 Policy Integration Tests / S3 Policy Enforcement Integration Tests (advanced-policy) (push) Failing after 3s
S3 Policy Integration Tests / S3 Policy Enforcement Integration Tests (basic-policy) (push) Failing after 2s
S3 Policy Integration Tests / S3 Policy Enforcement Integration Tests (contextual-policy) (push) Failing after 4s
S3 Policy Integration Tests / Trusted Proxy Detection Tests (push) Failing after 2s
S3 Policy Integration Tests / S3 Policy Shell Integration Tests (push) Failing after 3s
Samba on FUSE Integration / samba-integration (push) Failing after 2s
SFTP Integration Tests / SFTP Integration Testing (push) Failing after 3s
terraform: validate and test modules / fmt, validate, plan-level tests (push) Failing after 3s
terraform: validate and test modules / local cluster smoke test (real weed) (push) Failing after 2s
Volume Server Integration Tests / Volume Server Integration Tests (grpc - Shard 3) (push) Failing after 3s
Volume Server Integration Tests / Volume Server Integration Tests (grpc - Shard 2) (push) Failing after 3s
Volume Server Integration Tests / Volume Server Integration Tests (http - Shard 2) (push) Failing after 2s
Volume Server Integration Tests / Volume Server Integration Tests (http - Shard 3) (push) Failing after 5s
mount: windows conformance / WinFsp conformance (push) Has been cancelled
mount: windows / Mount on Windows (push) Has been cancelled
169 lines
6.6 KiB
Python
169 lines
6.6 KiB
Python
#!/usr/bin/env python3
|
|
"""Lance half of the table lifecycle, run one phase per invocation.
|
|
|
|
The Go test calls this for each step and maintains the table in between, so the
|
|
tally taken before maintenance and the tally taken after are directly
|
|
comparable. That comparison is the test: the Iceberg side of this suite exists
|
|
because compaction once rewrote a table's dictionary columns onto a single
|
|
value and every check we had still passed, and a Lance dataset is rewritten by
|
|
the same kind of job.
|
|
|
|
The maintain phase is a fallback. When the Rust worker can be built, the Go test
|
|
runs its handlers against this table instead and skips this phase - what runs
|
|
here are the same two lance calls the handlers make.
|
|
"""
|
|
|
|
import argparse
|
|
import hashlib
|
|
import json
|
|
import sys
|
|
import warnings
|
|
from datetime import timedelta
|
|
|
|
warnings.filterwarnings("ignore")
|
|
|
|
import lance
|
|
import lance_namespace as ln
|
|
import pyarrow as pa
|
|
|
|
# Low enough cardinality that these two columns are dictionary-encoded.
|
|
CATEGORIES = 7
|
|
VALUES = 13
|
|
ROWS_PER_BATCH = 4000
|
|
BATCHES = 3
|
|
DIM = 8
|
|
|
|
|
|
def rows(start, count):
|
|
ids = list(range(start, start + count))
|
|
return pa.table(
|
|
{
|
|
"id": pa.array(ids, type=pa.int64()),
|
|
"category": pa.array([f"cat-{i % CATEGORIES}" for i in ids]),
|
|
"value": pa.array([f"v-{i % VALUES}" for i in ids]),
|
|
"vector": pa.array(
|
|
[[float(i % 97) + d for d in range(DIM)] for i in ids],
|
|
type=pa.list_(pa.float32(), DIM),
|
|
),
|
|
}
|
|
)
|
|
|
|
|
|
def tally(dataset):
|
|
"""What the table holds, in a form two runs can be compared by.
|
|
|
|
The cardinalities catch a column collapsed onto one value; the digest
|
|
catches a rewrite that keeps the values and moves them to the wrong rows.
|
|
Every column goes into the digest, the vectors included - compaction
|
|
rewrites whole fragments, so leaving a column out leaves a place for it to
|
|
go wrong unnoticed. Fragments come along because a compaction that merged
|
|
nothing would otherwise let this test pass without having tested anything.
|
|
"""
|
|
scanned = dataset.to_table(columns=["id", "category", "value", "vector"])
|
|
ids = scanned.column("id").to_pylist()
|
|
categories = scanned.column("category").to_pylist()
|
|
values = scanned.column("value").to_pylist()
|
|
vectors = scanned.column("vector").to_pylist()
|
|
serialized = (
|
|
f"{i}|{c}|{v}|{w}"
|
|
for i, c, v, w in zip(ids, categories, values, vectors, strict=True)
|
|
)
|
|
digest = hashlib.md5(
|
|
"\n".join(sorted(serialized)).encode(), usedforsecurity=False
|
|
).hexdigest()
|
|
return {
|
|
"rows": scanned.num_rows,
|
|
"categories": len(set(categories)),
|
|
"values": len(set(values)),
|
|
"digest": digest,
|
|
"fragments": len(dataset.get_fragments()),
|
|
"version": dataset.version,
|
|
}
|
|
|
|
|
|
def resolve(args):
|
|
"""Ask the namespace where the table lives, the way the worker does."""
|
|
namespace = ln.connect("rest", {"uri": args.namespace_url})
|
|
table_id = [args.bucket, args.namespace, args.table]
|
|
described = namespace.describe_table(ln.DescribeTableRequest(id=table_id))
|
|
return namespace, table_id, described.location, storage_options(args, described)
|
|
|
|
|
|
def storage_options(args, described=None):
|
|
# The namespace vends an endpoint correct for its own host; this container
|
|
# reaches the same gateway by another name. Credentials are filled in
|
|
# because a deployment without STS vends none.
|
|
options = dict((described.storage_options or {}) if described else {})
|
|
options["aws_endpoint"] = args.s3_endpoint
|
|
options["allow_http"] = "true"
|
|
options.setdefault("aws_access_key_id", args.access_key)
|
|
options.setdefault("aws_secret_access_key", args.secret_key)
|
|
options.setdefault("aws_region", "us-east-1")
|
|
return options
|
|
|
|
|
|
def main():
|
|
parser = argparse.ArgumentParser(description=__doc__)
|
|
parser.add_argument("--phase", required=True, choices=["write", "maintain", "verify", "drop"])
|
|
parser.add_argument("--namespace-url", required=True)
|
|
parser.add_argument("--s3-endpoint", required=True)
|
|
parser.add_argument("--bucket", required=True)
|
|
parser.add_argument("--namespace", required=True)
|
|
parser.add_argument("--table", required=True)
|
|
parser.add_argument("--access-key", default="any")
|
|
parser.add_argument("--secret-key", default="any")
|
|
args = parser.parse_args()
|
|
|
|
if args.phase == "write":
|
|
namespace = ln.connect("rest", {"uri": args.namespace_url})
|
|
for parent in ([args.bucket], [args.bucket, args.namespace]):
|
|
namespace.create_namespace(ln.CreateNamespaceRequest(id=parent, mode="EXIST_OK"))
|
|
table_id = [args.bucket, args.namespace, args.table]
|
|
declared = namespace.declare_table(ln.DeclareTableRequest(id=table_id))
|
|
options = storage_options(args)
|
|
# A fragment per append, so the compaction that follows has something
|
|
# to merge.
|
|
for i in range(BATCHES):
|
|
lance.write_dataset(
|
|
rows(i * ROWS_PER_BATCH + 1, ROWS_PER_BATCH),
|
|
declared.location,
|
|
storage_options=options,
|
|
mode="overwrite" if i == 0 else "append",
|
|
)
|
|
print(json.dumps(tally(lance.dataset(declared.location, storage_options=options))))
|
|
return 0
|
|
|
|
if args.phase == "maintain":
|
|
_, _, location, options = resolve(args)
|
|
dataset = lance.dataset(location, storage_options=options)
|
|
dataset.optimize.compact_files()
|
|
dataset = lance.dataset(location, storage_options=options)
|
|
dataset.cleanup_old_versions(older_than=timedelta(seconds=0), delete_unverified=True)
|
|
print(json.dumps(tally(lance.dataset(location, storage_options=options))))
|
|
return 0
|
|
|
|
if args.phase == "verify":
|
|
_, _, location, options = resolve(args)
|
|
print(json.dumps(tally(lance.dataset(location, storage_options=options))))
|
|
return 0
|
|
|
|
namespace, table_id, location, options = resolve(args)
|
|
namespace.drop_table(ln.DropTableRequest(id=table_id))
|
|
try:
|
|
lance.dataset(location, storage_options=options)
|
|
except ValueError as err:
|
|
# pylance turns every load failure into a ValueError, so the message is
|
|
# the only thing separating a dataset that is gone from credentials
|
|
# that stopped working halfway through the test.
|
|
if "was not found" in str(err):
|
|
return 0
|
|
print(f"FAIL: reading the dropped dataset failed for another reason: {err}",
|
|
file=sys.stderr)
|
|
return 1
|
|
print("FAIL: the dataset is still readable after a drop", file=sys.stderr)
|
|
return 1
|
|
|
|
|
|
if __name__ == "__main__":
|
|
sys.exit(main())
|