vastdb 0.1.9__tar.gz → 0.1.11__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {vastdb-0.1.9 → vastdb-0.1.11}/CHANGELOG.md +19 -0
- {vastdb-0.1.9/vastdb.egg-info → vastdb-0.1.11}/PKG-INFO +1 -1
- {vastdb-0.1.9 → vastdb-0.1.11}/README.md +5 -7
- {vastdb-0.1.9 → vastdb-0.1.11}/setup.py +1 -1
- {vastdb-0.1.9 → vastdb-0.1.11}/vastdb/__init__.py +6 -3
- {vastdb-0.1.9 → vastdb-0.1.11}/vastdb/_internal.py +9 -16
- {vastdb-0.1.9 → vastdb-0.1.11}/vastdb/bench/test_perf.py +2 -2
- vastdb-0.1.11/vastdb/bench/test_sample.py +217 -0
- vastdb-0.1.11/vastdb/config.py +65 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vastdb/conftest.py +28 -6
- {vastdb-0.1.9 → vastdb-0.1.11}/vastdb/errors.py +0 -6
- vastdb-0.1.11/vastdb/features.py +42 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vastdb/schema.py +1 -2
- {vastdb-0.1.9 → vastdb-0.1.11}/vastdb/session.py +12 -45
- {vastdb-0.1.9 → vastdb-0.1.11}/vastdb/table.py +8 -52
- vastdb-0.1.11/vastdb/tests/metrics.py +43 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vastdb/tests/test_sanity.py +1 -1
- {vastdb-0.1.9 → vastdb-0.1.11}/vastdb/tests/test_tables.py +29 -40
- {vastdb-0.1.9 → vastdb-0.1.11}/vastdb/util.py +1 -8
- vastdb-0.1.11/vastdb/vast_tests/test_scale.py +68 -0
- {vastdb-0.1.9 → vastdb-0.1.11/vastdb.egg-info}/PKG-INFO +1 -1
- {vastdb-0.1.9 → vastdb-0.1.11}/vastdb.egg-info/SOURCES.txt +6 -1
- {vastdb-0.1.9 → vastdb-0.1.11}/LICENSE +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/MANIFEST.in +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/requirements.txt +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/setup.cfg +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/__init__.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/__init__.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/__init__.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/arrow/__init__.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/arrow/computeir/__init__.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Aggregate.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/ArraySlice.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/ArraySubscript.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/BinaryLiteral.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/BooleanLiteral.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Bound.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Call.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/CaseFragment.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Cast.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/ConcreteBoundImpl.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/ConditionalCase.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/CurrentRow.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/DateLiteral.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/DecimalLiteral.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Deref.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/DurationLiteral.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Expression.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/ExpressionImpl.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/FieldIndex.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/FieldRef.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Filter.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/FixedSizeBinaryLiteral.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Float16Literal.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Float32Literal.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Float64Literal.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Following.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Frame.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Grouping.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Int16Literal.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Int32Literal.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Int64Literal.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Int8Literal.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/IntervalLiteral.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/IntervalLiteralDaysMilliseconds.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/IntervalLiteralImpl.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/IntervalLiteralMonths.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Join.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/JoinKind.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/KeyValue.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Limit.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/ListLiteral.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Literal.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/LiteralColumn.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/LiteralImpl.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/LiteralRelation.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/MapKey.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/MapLiteral.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/OrderBy.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Ordering.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Plan.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Preceding.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Project.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/RelId.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Relation.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/RelationImpl.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/SetOpKind.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/SetOperation.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/SimpleCase.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/SortKey.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Source.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/StringLiteral.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/StructField.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/StructLiteral.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/TimeLiteral.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/TimestampLiteral.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/UInt16Literal.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/UInt32Literal.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/UInt64Literal.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/UInt8Literal.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Unbounded.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/WindowCall.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/__init__.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/arrow/flatbuf/Binary.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/arrow/flatbuf/Block.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/arrow/flatbuf/BodyCompression.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/arrow/flatbuf/BodyCompressionMethod.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/arrow/flatbuf/Bool.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/arrow/flatbuf/Buffer.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/arrow/flatbuf/CompressionType.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/arrow/flatbuf/Date.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/arrow/flatbuf/DateUnit.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/arrow/flatbuf/Decimal.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/arrow/flatbuf/DictionaryBatch.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/arrow/flatbuf/DictionaryEncoding.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/arrow/flatbuf/DictionaryKind.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/arrow/flatbuf/Duration.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/arrow/flatbuf/Endianness.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/arrow/flatbuf/Feature.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/arrow/flatbuf/Field.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/arrow/flatbuf/FieldNode.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/arrow/flatbuf/FixedSizeBinary.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/arrow/flatbuf/FixedSizeList.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/arrow/flatbuf/FloatingPoint.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/arrow/flatbuf/Footer.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/arrow/flatbuf/Int.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/arrow/flatbuf/Interval.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/arrow/flatbuf/IntervalUnit.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/arrow/flatbuf/KeyValue.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/arrow/flatbuf/LargeBinary.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/arrow/flatbuf/LargeList.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/arrow/flatbuf/LargeUtf8.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/arrow/flatbuf/List.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/arrow/flatbuf/Map.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/arrow/flatbuf/Message.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/arrow/flatbuf/MessageHeader.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/arrow/flatbuf/MetadataVersion.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/arrow/flatbuf/Null.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/arrow/flatbuf/Precision.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/arrow/flatbuf/RecordBatch.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/arrow/flatbuf/Schema.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/arrow/flatbuf/SparseMatrixCompressedAxis.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/arrow/flatbuf/SparseMatrixIndexCSX.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/arrow/flatbuf/SparseTensor.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/arrow/flatbuf/SparseTensorIndex.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/arrow/flatbuf/SparseTensorIndexCOO.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/arrow/flatbuf/SparseTensorIndexCSF.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/arrow/flatbuf/Struct_.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/arrow/flatbuf/Tensor.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/arrow/flatbuf/TensorDim.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/arrow/flatbuf/Time.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/arrow/flatbuf/TimeUnit.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/arrow/flatbuf/Timestamp.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/arrow/flatbuf/Type.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/arrow/flatbuf/Union.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/arrow/flatbuf/UnionMode.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/arrow/flatbuf/Utf8.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/org/apache/arrow/flatbuf/__init__.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/tabular/AlterColumnRequest.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/tabular/AlterProjectionTableRequest.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/tabular/AlterSchemaRequest.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/tabular/AlterTableRequest.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/tabular/Column.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/tabular/ColumnType.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/tabular/CreateProjectionRequest.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/tabular/CreateSchemaRequest.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/tabular/GetProjectionTableStatsResponse.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/tabular/GetTableStatsResponse.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/tabular/ImportDataRequest.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/tabular/ListProjectionsResponse.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/tabular/ListSchemasResponse.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/tabular/ListTablesResponse.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/tabular/ObjectDetails.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/tabular/S3File.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/tabular/VipRange.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vast_flatbuf/tabular/__init__.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vastdb/bench/__init__.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vastdb/bucket.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vastdb/tests/__init__.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vastdb/tests/test_duckdb.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vastdb/tests/test_imports.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vastdb/tests/test_nested.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vastdb/tests/test_projections.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vastdb/tests/test_schemas.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vastdb/tests/test_util.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vastdb/tests/util.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vastdb/transaction.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vastdb/vast_tests/__init__.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vastdb/vast_tests/test_ha.py +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vastdb.egg-info/dependency_links.txt +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vastdb.egg-info/requires.txt +0 -0
- {vastdb-0.1.9 → vastdb-0.1.11}/vastdb.egg-info/top_level.txt +0 -0
|
@@ -4,6 +4,25 @@ All notable changes to this project will be documented in this file.
|
|
|
4
4
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
|
|
6
6
|
|
|
7
|
+
## [0.1.11] (2024-07-17)
|
|
8
|
+
[0.1.11]: https://github.com/vast-data/vastdb_sdk/compare/v0.1.10...v0.1.11
|
|
9
|
+
|
|
10
|
+
## Fixed
|
|
11
|
+
- Revert timezone check to keep previous SDK behaviour
|
|
12
|
+
|
|
13
|
+
## Added
|
|
14
|
+
- Use Sphinx for building documentation
|
|
15
|
+
|
|
16
|
+
## Changed
|
|
17
|
+
- Defer imports to optimize initial import latency
|
|
18
|
+
|
|
19
|
+
## [0.1.10] (2024-07-09)
|
|
20
|
+
[0.1.10]: https://github.com/vast-data/vastdb_sdk/compare/v0.1.9...v0.1.10
|
|
21
|
+
|
|
22
|
+
## Fixed
|
|
23
|
+
- Support responses with no record batches
|
|
24
|
+
- Document supported Arrow data types
|
|
25
|
+
|
|
7
26
|
## [0.1.9] (2024-07-01)
|
|
8
27
|
[0.1.9]: https://github.com/vast-data/vastdb_sdk/compare/v0.1.8...v0.1.9
|
|
9
28
|
|
|
@@ -19,6 +19,11 @@
|
|
|
19
19
|
- [S3 access & secret keys on VAST cluster](https://support.vastdata.com/s/article/UUID-4d2e7e23-b2fb-7900-d98f-96c31a499626)
|
|
20
20
|
- [Tabular identity policy with the proper permissions](https://support.vastdata.com/s/article/UUID-14322b60-d6a2-89ac-3df0-3dfbb6974182)
|
|
21
21
|
|
|
22
|
+
### Required VAST release
|
|
23
|
+
|
|
24
|
+
Currently, VAST DB Python SDK requires `5.0.0-sp10` or later VAST release.
|
|
25
|
+
|
|
26
|
+
If the cluster is running an older VAST release, please contact customer.support@vastdata.com for more details.
|
|
22
27
|
|
|
23
28
|
### Installation
|
|
24
29
|
|
|
@@ -203,10 +208,3 @@ See the following blog posts for more examples:
|
|
|
203
208
|
|
|
204
209
|
- https://vastdata.com/blog/the-vast-catalog-in-action-part-1
|
|
205
210
|
- https://vastdata.com/blog/the-vast-catalog-in-action-part-2
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
## Required VAST release
|
|
209
|
-
|
|
210
|
-
Currently, VAST DB Python SDK requires `5.0.0-sp10` or later VAST release.
|
|
211
|
-
|
|
212
|
-
If the cluster is running an older VAST release, please contact customer.support@vastdata.com for more details.
|
|
@@ -1,9 +1,6 @@
|
|
|
1
1
|
"""VAST Database Python SDK."""
|
|
2
2
|
|
|
3
3
|
import functools
|
|
4
|
-
import importlib.metadata
|
|
5
|
-
|
|
6
|
-
__version__ = importlib.metadata.distribution(__package__).version
|
|
7
4
|
|
|
8
5
|
from . import session
|
|
9
6
|
|
|
@@ -12,3 +9,9 @@ from . import session
|
|
|
12
9
|
@functools.wraps(session.Session)
|
|
13
10
|
def connect(*args, **kwargs): # noqa: D103
|
|
14
11
|
return session.Session(*args, **kwargs)
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def version():
|
|
15
|
+
"""Return VAST DB SDK version."""
|
|
16
|
+
import importlib
|
|
17
|
+
return importlib.metadata.distribution(__package__).version
|
|
@@ -5,9 +5,8 @@ import re
|
|
|
5
5
|
import struct
|
|
6
6
|
import urllib.parse
|
|
7
7
|
from collections import defaultdict, namedtuple
|
|
8
|
-
from dataclasses import dataclass, field
|
|
9
8
|
from enum import Enum
|
|
10
|
-
from typing import Any,
|
|
9
|
+
from typing import Any, Dict, Iterator, List, Optional, Tuple, Union
|
|
11
10
|
|
|
12
11
|
import backoff
|
|
13
12
|
import flatbuffers
|
|
@@ -104,6 +103,7 @@ from vast_flatbuf.tabular.ListSchemasResponse import ListSchemasResponse as list
|
|
|
104
103
|
from vast_flatbuf.tabular.ListTablesResponse import ListTablesResponse as list_tables
|
|
105
104
|
|
|
106
105
|
from . import errors
|
|
106
|
+
from .config import BackoffConfig
|
|
107
107
|
|
|
108
108
|
UINT64_MAX = 18446744073709551615
|
|
109
109
|
|
|
@@ -742,15 +742,6 @@ def _backoff_giveup(exc: Exception) -> bool:
|
|
|
742
742
|
return True # give up in case of other exceptions
|
|
743
743
|
|
|
744
744
|
|
|
745
|
-
@dataclass
|
|
746
|
-
class BackoffConfig:
|
|
747
|
-
wait_gen: Callable = field(default=backoff.expo)
|
|
748
|
-
max_value: Optional[float] = None # max duration for a single wait period
|
|
749
|
-
max_tries: int = 10
|
|
750
|
-
max_time: float = 60.0 # in seconds
|
|
751
|
-
backoff_log_level: int = logging.DEBUG
|
|
752
|
-
|
|
753
|
-
|
|
754
745
|
class VastdbApi:
|
|
755
746
|
# we expect the vast version to be <major>.<minor>.<patch>.<protocol>
|
|
756
747
|
VAST_VERSION_REGEX = re.compile(r'^vast (\d+\.\d+\.\d+\.\d+)$')
|
|
@@ -759,15 +750,17 @@ class VastdbApi:
|
|
|
759
750
|
*,
|
|
760
751
|
auth_type=AuthType.SIGV4,
|
|
761
752
|
ssl_verify=True,
|
|
753
|
+
timeout=None,
|
|
762
754
|
backoff_config: Optional[BackoffConfig] = None):
|
|
763
755
|
|
|
764
|
-
from . import
|
|
765
|
-
self.client_sdk_version = f"VAST Database Python SDK {
|
|
756
|
+
from . import version # import lazily here (to avoid circular dependencies)
|
|
757
|
+
self.client_sdk_version = f"VAST Database Python SDK {version()} - 2024 (c)"
|
|
766
758
|
|
|
767
759
|
url = urllib3.util.parse_url(endpoint)
|
|
768
760
|
self.access_key = access_key
|
|
769
761
|
self.secret_key = secret_key
|
|
770
762
|
|
|
763
|
+
self.timeout = timeout
|
|
771
764
|
self.default_max_list_columns_page_size = 1000
|
|
772
765
|
self._session = requests.Session()
|
|
773
766
|
self._session.verify = ssl_verify
|
|
@@ -820,9 +813,9 @@ class VastdbApi:
|
|
|
820
813
|
raise NotImplementedError(msg)
|
|
821
814
|
|
|
822
815
|
def _single_request(self, *, method, url, skip_status_check=False, **kwargs):
|
|
823
|
-
_logger.debug("Sending request: %s %s %s", method, url, kwargs)
|
|
816
|
+
_logger.debug("Sending request: %s %s %s timeout=%s", method, url, kwargs, self.timeout)
|
|
824
817
|
try:
|
|
825
|
-
res = self._session.request(method=method, url=url, **kwargs)
|
|
818
|
+
res = self._session.request(method=method, url=url, timeout=self.timeout, **kwargs)
|
|
826
819
|
except requests.exceptions.ConnectionError as err:
|
|
827
820
|
# low-level connection issue, it is safe to retry only read-only requests
|
|
828
821
|
may_retry = (method == "GET")
|
|
@@ -1807,7 +1800,7 @@ def _iter_query_data_response_columns(fileobj, stream_ids=None):
|
|
|
1807
1800
|
batches.append(batch)
|
|
1808
1801
|
except StopIteration: # we got an end-of-stream IPC message for a given stream ID
|
|
1809
1802
|
reader, batches = readers.pop(stream_id) # end of column
|
|
1810
|
-
table = pa.Table.from_batches(batches) # concatenate all column chunks (as a single)
|
|
1803
|
+
table = pa.Table.from_batches(batches=batches, schema=reader.schema) # concatenate all column chunks (as a single)
|
|
1811
1804
|
_logger.debug("stream_id=%d rows=%d column=%s", stream_id, len(table), table)
|
|
1812
1805
|
yield (stream_id, next_row_id, table)
|
|
1813
1806
|
|
|
@@ -10,11 +10,11 @@ log = logging.getLogger(__name__)
|
|
|
10
10
|
|
|
11
11
|
|
|
12
12
|
@pytest.mark.benchmark
|
|
13
|
-
def test_bench(session,
|
|
13
|
+
def test_bench(session, bucket_name, parquets_path, crater_path):
|
|
14
14
|
files = [str(parquets_path / f) for f in (parquets_path.glob('**/*.pq'))]
|
|
15
15
|
|
|
16
16
|
with session.transaction() as tx:
|
|
17
|
-
b = tx.bucket(
|
|
17
|
+
b = tx.bucket(bucket_name)
|
|
18
18
|
s = b.create_schema('s1')
|
|
19
19
|
t = util.create_table_from_files(s, 't1', files, config=ImportConfig(import_concurrency=8))
|
|
20
20
|
config = QueryConfig(num_splits=8, num_sub_splits=4)
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
|
|
3
|
+
import functools
|
|
4
|
+
import itertools
|
|
5
|
+
import logging
|
|
6
|
+
import os
|
|
7
|
+
import random
|
|
8
|
+
import threading
|
|
9
|
+
import time
|
|
10
|
+
from concurrent.futures import ProcessPoolExecutor, as_completed
|
|
11
|
+
|
|
12
|
+
import numpy as np
|
|
13
|
+
import pyarrow as pa
|
|
14
|
+
|
|
15
|
+
import vastdb.errors
|
|
16
|
+
from vastdb.table import INTERNAL_ROW_ID
|
|
17
|
+
from vastdb.tests import metrics
|
|
18
|
+
|
|
19
|
+
logging.basicConfig(
|
|
20
|
+
level="INFO",
|
|
21
|
+
format="%(asctime)s %(levelname)-10s %(process)d/%(thread)d %(filename)s:%(lineno)d %(message)s")
|
|
22
|
+
|
|
23
|
+
log = logging.getLogger()
|
|
24
|
+
|
|
25
|
+
sdk_version = vastdb.version()
|
|
26
|
+
log.info("Python SDK version: %s", sdk_version)
|
|
27
|
+
|
|
28
|
+
NUM_COLUMNS = 10_000
|
|
29
|
+
COLUMNS_BATCH = 10
|
|
30
|
+
|
|
31
|
+
NUM_ROW_GROUPS = 100
|
|
32
|
+
ROW_GROUP_SIZE = 100_000
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
INTERNAL_ROWID_FIELD = pa.field(INTERNAL_ROW_ID, pa.uint64()) # used for UPDATE
|
|
36
|
+
EXTERNAL_ROWID_FIELD = pa.field("vastdb_rowid", pa.int64()) # used for INSERT & SELECT
|
|
37
|
+
|
|
38
|
+
SCHEMA = "perf"
|
|
39
|
+
TABLE = "sample"
|
|
40
|
+
|
|
41
|
+
SCHEMA_ARROW = pa.schema(
|
|
42
|
+
[pa.field(f'c{i}', pa.float32()) for i in range(NUM_COLUMNS)]
|
|
43
|
+
)
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def load_batch(bucket, session_kwargs, offset, limit):
|
|
47
|
+
log.info('loading into [%d..%d)', offset, limit)
|
|
48
|
+
|
|
49
|
+
# Iterate over all row-groups in this file
|
|
50
|
+
rowids_range = range(offset, limit)
|
|
51
|
+
rowids = pa.array(rowids_range, INTERNAL_ROWID_FIELD.type)
|
|
52
|
+
|
|
53
|
+
session = vastdb.connect(**session_kwargs)
|
|
54
|
+
metrics_rows = []
|
|
55
|
+
|
|
56
|
+
with session.transaction() as tx:
|
|
57
|
+
table = tx.bucket(bucket).schema(SCHEMA).table(TABLE)
|
|
58
|
+
|
|
59
|
+
col = table[EXTERNAL_ROWID_FIELD.name]
|
|
60
|
+
pred = (col >= rowids_range[0]) & (col <= rowids_range[-1])
|
|
61
|
+
count = sum(len(rb) for rb in table.select(columns=[], predicate=pred))
|
|
62
|
+
log.info("%d rows exist at %s", count, rowids_range)
|
|
63
|
+
if count == len(rowids_range):
|
|
64
|
+
# skip already loaded rows
|
|
65
|
+
log.info('skipping [%d..%d)', offset, limit)
|
|
66
|
+
|
|
67
|
+
pid = os.getpid()
|
|
68
|
+
tid = threading.get_native_id()
|
|
69
|
+
total_nbytes = 0
|
|
70
|
+
calls = 0
|
|
71
|
+
t0 = time.time()
|
|
72
|
+
# Insert/update every chunk of columns in this rowgroup
|
|
73
|
+
for j in range(0, len(SCHEMA_ARROW), COLUMNS_BATCH):
|
|
74
|
+
cols_batch = list(SCHEMA_ARROW)[j:j + COLUMNS_BATCH]
|
|
75
|
+
arrays = [
|
|
76
|
+
pa.array(np.float32(np.random.uniform(size=[ROW_GROUP_SIZE])))
|
|
77
|
+
for _ in cols_batch
|
|
78
|
+
]
|
|
79
|
+
chunk = pa.table(data=arrays, schema=pa.schema(cols_batch))
|
|
80
|
+
nbytes = chunk.get_total_buffer_size()
|
|
81
|
+
start = time.perf_counter()
|
|
82
|
+
if j == 0:
|
|
83
|
+
chunk = chunk.add_column(0, EXTERNAL_ROWID_FIELD, rowids.cast(EXTERNAL_ROWID_FIELD.type))
|
|
84
|
+
op = 'insert'
|
|
85
|
+
table.insert(chunk)
|
|
86
|
+
else:
|
|
87
|
+
chunk = chunk.add_column(0, INTERNAL_ROWID_FIELD, rowids)
|
|
88
|
+
op = 'update'
|
|
89
|
+
table.update(chunk)
|
|
90
|
+
finish = time.perf_counter()
|
|
91
|
+
|
|
92
|
+
metrics_rows.append(metrics.Row(
|
|
93
|
+
start=start, finish=finish, table_path=table.path, op=op,
|
|
94
|
+
nbytes=nbytes, rows=len(chunk), cols=len(cols_batch),
|
|
95
|
+
pid=pid, tid=tid, sdk_version=sdk_version))
|
|
96
|
+
|
|
97
|
+
total_nbytes += nbytes
|
|
98
|
+
calls += 1
|
|
99
|
+
log.debug("%s into %s: %d rows x %d cols, %.3f MB",
|
|
100
|
+
op, rowids_range, len(chunk), len(chunk.schema),
|
|
101
|
+
chunk.get_total_buffer_size() / 1e6)
|
|
102
|
+
|
|
103
|
+
dt = time.time() - t0
|
|
104
|
+
|
|
105
|
+
log.info('loaded into [%d..%d): %d rows x %d cols, %.3f MB, %d RPCs, %.3f seconds',
|
|
106
|
+
offset, limit, limit - offset, NUM_COLUMNS, total_nbytes / 1e6, calls, dt)
|
|
107
|
+
return metrics_rows
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
def test_ingest(test_bucket_name, session_kwargs, tabular_endpoint_urls, num_workers, perf_metrics_db):
|
|
111
|
+
session = vastdb.connect(**session_kwargs)
|
|
112
|
+
metrics_table = metrics.Table(perf_metrics_db, "ingest")
|
|
113
|
+
|
|
114
|
+
with session.transaction() as tx:
|
|
115
|
+
b = tx.bucket(test_bucket_name)
|
|
116
|
+
try:
|
|
117
|
+
s = b.schema(SCHEMA)
|
|
118
|
+
except vastdb.errors.MissingSchema:
|
|
119
|
+
s = b.create_schema(SCHEMA)
|
|
120
|
+
|
|
121
|
+
try:
|
|
122
|
+
s.table(TABLE)
|
|
123
|
+
except vastdb.errors.MissingTable:
|
|
124
|
+
s.create_table(TABLE, pa.schema([EXTERNAL_ROWID_FIELD] + list(SCHEMA_ARROW)))
|
|
125
|
+
|
|
126
|
+
ranges = [
|
|
127
|
+
(i * ROW_GROUP_SIZE, (i + 1) * ROW_GROUP_SIZE)
|
|
128
|
+
for i in range(NUM_ROW_GROUPS)
|
|
129
|
+
]
|
|
130
|
+
|
|
131
|
+
with ProcessPoolExecutor(max_workers=num_workers) as executor:
|
|
132
|
+
futures = [
|
|
133
|
+
executor.submit(load_batch, test_bucket_name, session_kwargs | {'endpoint': url}, offset, limit)
|
|
134
|
+
for (offset, limit), url in zip(ranges, itertools.cycle(tabular_endpoint_urls))
|
|
135
|
+
]
|
|
136
|
+
log.info("spawned %d futures", len(futures))
|
|
137
|
+
for future in as_completed(futures):
|
|
138
|
+
metrics_table.insert(future.result())
|
|
139
|
+
|
|
140
|
+
with session.transaction() as tx:
|
|
141
|
+
t = tx.bucket(test_bucket_name).schema(SCHEMA).table(TABLE)
|
|
142
|
+
count = sum(len(rb) for rb in t.select([]))
|
|
143
|
+
log.info("%s has %d rows: %s", t, count, t.stats)
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
def run_query(session_kwargs, i, bucket_name, endpoint_url):
|
|
147
|
+
num_columns = 2000
|
|
148
|
+
row_groups_per_query = 10
|
|
149
|
+
|
|
150
|
+
config = vastdb.table.QueryConfig(
|
|
151
|
+
num_sub_splits=1,
|
|
152
|
+
num_splits=1,
|
|
153
|
+
limit_rows_per_sub_split=ROW_GROUP_SIZE,
|
|
154
|
+
num_row_groups_per_sub_split=1)
|
|
155
|
+
|
|
156
|
+
row_group_indices = list(range(NUM_ROW_GROUPS))
|
|
157
|
+
r = random.Random(i)
|
|
158
|
+
r.shuffle(row_group_indices)
|
|
159
|
+
|
|
160
|
+
pid = os.getpid()
|
|
161
|
+
tid = threading.get_native_id()
|
|
162
|
+
metrics_rows = []
|
|
163
|
+
|
|
164
|
+
session = vastdb.connect(**(session_kwargs | {"endpoint": endpoint_url}))
|
|
165
|
+
with session.transaction() as tx:
|
|
166
|
+
t = tx.bucket(bucket_name).schema(SCHEMA).table(TABLE)
|
|
167
|
+
|
|
168
|
+
fields = list(t.arrow_schema)[1:]
|
|
169
|
+
r.shuffle(fields)
|
|
170
|
+
cols = [f.name for f in fields[:num_columns]]
|
|
171
|
+
|
|
172
|
+
vastdb_rowid = t['vastdb_rowid']
|
|
173
|
+
preds = []
|
|
174
|
+
for offset in range(0, len(row_group_indices), row_groups_per_query):
|
|
175
|
+
rowid_ranges = (
|
|
176
|
+
vastdb_rowid.between(j * ROW_GROUP_SIZE, (j + 1) * ROW_GROUP_SIZE - 1)
|
|
177
|
+
for j in row_group_indices[offset:offset + row_groups_per_query]
|
|
178
|
+
)
|
|
179
|
+
pred = functools.reduce((lambda x, y: x | y), rowid_ranges)
|
|
180
|
+
preds.append(pred)
|
|
181
|
+
|
|
182
|
+
for j, pred in enumerate(preds):
|
|
183
|
+
log.info("%d) starting query #%d on %s", i, j, endpoint_url)
|
|
184
|
+
|
|
185
|
+
start = time.perf_counter()
|
|
186
|
+
res = t.select(columns=cols, predicate=pred, config=config)
|
|
187
|
+
rows = 0
|
|
188
|
+
data = 0
|
|
189
|
+
for rb in res:
|
|
190
|
+
rows += len(rb)
|
|
191
|
+
data += rb.nbytes
|
|
192
|
+
dt = time.perf_counter() - start
|
|
193
|
+
log.info("%d) got query #%d batch %.3f[s], %.3f[GB] %.3f[MB/s], %.3f[Mrows]", i, j, dt, data / 1e9, data / 1e6 / dt, rows / 1e6)
|
|
194
|
+
|
|
195
|
+
finish = time.perf_counter()
|
|
196
|
+
dt = finish - start
|
|
197
|
+
log.info("%d) finished query #%d %.3f[s], %.3f[GB], %.3f[MB/s], %.3f[Mrows]", i, j, dt, data / 1e9, data / 1e6 / dt, rows / 1e6)
|
|
198
|
+
|
|
199
|
+
metrics_rows.append(metrics.Row(
|
|
200
|
+
start=start, finish=finish, table_path=t.path, op="select",
|
|
201
|
+
nbytes=data, rows=rows, cols=len(cols),
|
|
202
|
+
pid=pid, tid=tid, sdk_version=sdk_version))
|
|
203
|
+
|
|
204
|
+
|
|
205
|
+
def test_scan(test_bucket_name, session, num_workers, session_kwargs, tabular_endpoint_urls, perf_metrics_db):
|
|
206
|
+
metrics_table = metrics.Table(perf_metrics_db, "query")
|
|
207
|
+
|
|
208
|
+
log.info("starting %d workers, endpoints=%s", num_workers, tabular_endpoint_urls)
|
|
209
|
+
with ProcessPoolExecutor(max_workers=num_workers) as executor:
|
|
210
|
+
futures = [
|
|
211
|
+
executor.submit(run_query, session_kwargs, i, test_bucket_name, url)
|
|
212
|
+
for i, url in zip(range(num_workers), itertools.cycle(tabular_endpoint_urls))
|
|
213
|
+
]
|
|
214
|
+
for future in as_completed(futures):
|
|
215
|
+
metrics_table.insert(future.result())
|
|
216
|
+
|
|
217
|
+
log.info("finished %d workers", num_workers)
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
"""Configuration-related dataclasses."""
|
|
2
|
+
|
|
3
|
+
import logging
|
|
4
|
+
from dataclasses import dataclass, field
|
|
5
|
+
from typing import Callable, List, Optional
|
|
6
|
+
|
|
7
|
+
import backoff
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
@dataclass
|
|
11
|
+
class BackoffConfig:
|
|
12
|
+
"""Retry configuration."""
|
|
13
|
+
|
|
14
|
+
wait_gen: Callable = field(default=backoff.expo)
|
|
15
|
+
max_value: Optional[float] = None # max duration for a single wait period
|
|
16
|
+
max_tries: int = 10
|
|
17
|
+
max_time: float = 60.0 # in seconds
|
|
18
|
+
backoff_log_level: int = logging.DEBUG
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
@dataclass
|
|
22
|
+
class QueryConfig:
|
|
23
|
+
"""Query execution configiration."""
|
|
24
|
+
|
|
25
|
+
# allows server-side parallel processing by issuing multiple reads concurrently for a single RPC
|
|
26
|
+
num_sub_splits: int = 4
|
|
27
|
+
|
|
28
|
+
# used to split the table into disjoint subsets of rows, to be processed concurrently using multiple RPCs
|
|
29
|
+
# will be estimated from the table's row count, if not explicitly set
|
|
30
|
+
num_splits: Optional[int] = None
|
|
31
|
+
|
|
32
|
+
# each endpoint will be handled by a separate worker thread
|
|
33
|
+
# a single endpoint can be specified more than once to benefit from multithreaded execution
|
|
34
|
+
data_endpoints: Optional[List[str]] = None
|
|
35
|
+
|
|
36
|
+
# a subsplit fiber will finish after sending this number of rows back to the client
|
|
37
|
+
limit_rows_per_sub_split: int = 128 * 1024
|
|
38
|
+
|
|
39
|
+
# each fiber will read the following number of rowgroups coninuously before skipping
|
|
40
|
+
# in order to use semi-sorted projections this value must be 8 (this is the hard coded size of a row groups per row block).
|
|
41
|
+
num_row_groups_per_sub_split: int = 8
|
|
42
|
+
|
|
43
|
+
# can be disabled for benchmarking purposes
|
|
44
|
+
use_semi_sorted_projections: bool = True
|
|
45
|
+
|
|
46
|
+
# enforce using a specific semi-sorted projection (if enabled above)
|
|
47
|
+
semi_sorted_projection_name: Optional[str] = None
|
|
48
|
+
|
|
49
|
+
# used to estimate the number of splits, given the table rows' count
|
|
50
|
+
rows_per_split: int = 4000000
|
|
51
|
+
|
|
52
|
+
# used for worker threads' naming
|
|
53
|
+
query_id: str = ""
|
|
54
|
+
|
|
55
|
+
# non-negative integer, used for server-side prioritization of queued requests:
|
|
56
|
+
# - requests with lower values will be served before requests with higher values.
|
|
57
|
+
# - if unset, the request will be added to the queue's end.
|
|
58
|
+
queue_priority: Optional[int] = None
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
@dataclass
|
|
62
|
+
class ImportConfig:
|
|
63
|
+
"""Import execution configiration."""
|
|
64
|
+
|
|
65
|
+
import_concurrency: int = 2
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import os
|
|
2
|
+
import sqlite3
|
|
2
3
|
from pathlib import Path
|
|
3
4
|
|
|
4
5
|
import boto3
|
|
@@ -13,27 +14,43 @@ def pytest_addoption(parser):
|
|
|
13
14
|
default=os.environ.get("AWS_ACCESS_KEY_ID", None))
|
|
14
15
|
parser.addoption("--tabular-secret-key", help="Secret key with Tabular permissions (AWS_SECRET_ACCESS_KEY)",
|
|
15
16
|
default=os.environ.get("AWS_SECRET_ACCESS_KEY", None))
|
|
16
|
-
parser.addoption("--tabular-endpoint-url", help="Tabular server endpoint", default="
|
|
17
|
+
parser.addoption("--tabular-endpoint-url", help="Tabular server endpoint", default=[], action="append")
|
|
17
18
|
parser.addoption("--data-path", help="Data files location", default=None)
|
|
18
19
|
parser.addoption("--crater-path", help="Save benchmark results in a dedicated location", default=None)
|
|
19
20
|
parser.addoption("--schema-name", help="Name of schema for the test to operate on", default=None)
|
|
20
21
|
parser.addoption("--table-name", help="Name of table for the test to operate on", default=None)
|
|
22
|
+
parser.addoption("--num-workers", help="Number of concurrent workers", default=1)
|
|
21
23
|
|
|
22
24
|
|
|
23
25
|
@pytest.fixture(scope="session")
|
|
24
|
-
def
|
|
25
|
-
return
|
|
26
|
+
def session_kwargs(request, tabular_endpoint_urls):
|
|
27
|
+
return dict(
|
|
26
28
|
access=request.config.getoption("--tabular-access-key"),
|
|
27
29
|
secret=request.config.getoption("--tabular-secret-key"),
|
|
28
|
-
endpoint=
|
|
30
|
+
endpoint=tabular_endpoint_urls[0],
|
|
29
31
|
)
|
|
30
32
|
|
|
31
33
|
|
|
34
|
+
@pytest.fixture(scope="session")
|
|
35
|
+
def session(session_kwargs):
|
|
36
|
+
return vastdb.connect(**session_kwargs)
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
@pytest.fixture(scope="session")
|
|
40
|
+
def num_workers(request):
|
|
41
|
+
return int(request.config.getoption("--num-workers"))
|
|
42
|
+
|
|
43
|
+
|
|
32
44
|
@pytest.fixture(scope="session")
|
|
33
45
|
def test_bucket_name(request):
|
|
34
46
|
return request.config.getoption("--tabular-bucket-name")
|
|
35
47
|
|
|
36
48
|
|
|
49
|
+
@pytest.fixture(scope="session")
|
|
50
|
+
def tabular_endpoint_urls(request):
|
|
51
|
+
return request.config.getoption("--tabular-endpoint-url") or ["http://localhost:9090"]
|
|
52
|
+
|
|
53
|
+
|
|
37
54
|
def iter_schemas(s):
|
|
38
55
|
"""Recusively scan all schemas."""
|
|
39
56
|
children = s.schemas()
|
|
@@ -55,12 +72,12 @@ def clean_bucket_name(request, test_bucket_name, session):
|
|
|
55
72
|
|
|
56
73
|
|
|
57
74
|
@pytest.fixture(scope="session")
|
|
58
|
-
def s3(request):
|
|
75
|
+
def s3(request, tabular_endpoint_urls):
|
|
59
76
|
return boto3.client(
|
|
60
77
|
's3',
|
|
61
78
|
aws_access_key_id=request.config.getoption("--tabular-access-key"),
|
|
62
79
|
aws_secret_access_key=request.config.getoption("--tabular-secret-key"),
|
|
63
|
-
endpoint_url=
|
|
80
|
+
endpoint_url=tabular_endpoint_urls[0])
|
|
64
81
|
|
|
65
82
|
|
|
66
83
|
@pytest.fixture(scope="function")
|
|
@@ -81,3 +98,8 @@ def schema_name(request):
|
|
|
81
98
|
@pytest.fixture(scope="function")
|
|
82
99
|
def table_name(request):
|
|
83
100
|
return request.config.getoption("--table-name")
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
@pytest.fixture(scope="function")
|
|
104
|
+
def perf_metrics_db(crater_path):
|
|
105
|
+
return sqlite3.connect(f"{crater_path}/metrics.sqlite")
|
|
@@ -3,7 +3,6 @@ import xml.etree.ElementTree
|
|
|
3
3
|
from dataclasses import dataclass
|
|
4
4
|
from enum import Enum
|
|
5
5
|
|
|
6
|
-
import pyarrow as pa
|
|
7
6
|
import requests
|
|
8
7
|
|
|
9
8
|
|
|
@@ -170,11 +169,6 @@ class NotSupportedCommand(NotSupported):
|
|
|
170
169
|
table: str
|
|
171
170
|
|
|
172
171
|
|
|
173
|
-
@dataclass
|
|
174
|
-
class NotSupportedType(NotSupported):
|
|
175
|
-
field: pa.Field
|
|
176
|
-
|
|
177
|
-
|
|
178
172
|
@dataclass
|
|
179
173
|
class NotSupportedVersion(NotSupported):
|
|
180
174
|
err_msg: str
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"""Version-dependent features."""
|
|
2
|
+
|
|
3
|
+
import logging
|
|
4
|
+
|
|
5
|
+
from .errors import NotSupportedVersion
|
|
6
|
+
|
|
7
|
+
log = logging.getLogger()
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class Features:
|
|
11
|
+
"""VAST database features - check if server is already support a feature."""
|
|
12
|
+
|
|
13
|
+
def __init__(self, vast_version):
|
|
14
|
+
"""Save the server version."""
|
|
15
|
+
self.vast_version = vast_version
|
|
16
|
+
|
|
17
|
+
self.check_imports_table = self._check(
|
|
18
|
+
"Imported objects' table feature requires 5.2+ VAST release",
|
|
19
|
+
vast_version >= (5, 2))
|
|
20
|
+
|
|
21
|
+
self.check_return_row_ids = self._check(
|
|
22
|
+
"Returning row IDs requires 5.1+ VAST release",
|
|
23
|
+
vast_version >= (5, 1))
|
|
24
|
+
|
|
25
|
+
self.check_enforce_semisorted_projection = self._check(
|
|
26
|
+
"Semi-sorted projection enforcement requires 5.1+ VAST release",
|
|
27
|
+
vast_version >= (5, 1))
|
|
28
|
+
|
|
29
|
+
self.check_external_row_ids_allocation = self._check(
|
|
30
|
+
"External row IDs allocation requires 5.1+ VAST release",
|
|
31
|
+
vast_version >= (5, 1))
|
|
32
|
+
|
|
33
|
+
def _check(self, msg, supported):
|
|
34
|
+
log.debug("%s (current version is %s): supported=%s", msg, self.vast_version, supported)
|
|
35
|
+
if not supported:
|
|
36
|
+
def fail():
|
|
37
|
+
raise NotSupportedVersion(msg, self.vast_version)
|
|
38
|
+
return fail
|
|
39
|
+
|
|
40
|
+
def noop():
|
|
41
|
+
pass
|
|
42
|
+
return noop
|
|
@@ -10,7 +10,7 @@ from typing import TYPE_CHECKING, Iterable, List, Optional
|
|
|
10
10
|
|
|
11
11
|
import pyarrow as pa
|
|
12
12
|
|
|
13
|
-
from . import bucket, errors, schema, table
|
|
13
|
+
from . import bucket, errors, schema, table
|
|
14
14
|
|
|
15
15
|
if TYPE_CHECKING:
|
|
16
16
|
from .table import Table
|
|
@@ -86,7 +86,6 @@ class Schema:
|
|
|
86
86
|
if use_external_row_ids_allocation:
|
|
87
87
|
self.tx._rpc.features.check_external_row_ids_allocation()
|
|
88
88
|
|
|
89
|
-
util.check_supported_types(columns)
|
|
90
89
|
self.tx._rpc.api.create_table(self.bucket.name, self.name, table_name, columns, txid=self.tx.txid,
|
|
91
90
|
use_external_row_ids_allocation=use_external_row_ids_allocation)
|
|
92
91
|
log.info("Created table: %s", table_name)
|