Skip to content

CLDSRV-872: store checksum in object metadata#6113

Closed
leif-scality wants to merge 8 commits intodevelopment/9.4from
development/CLDSRV-872-store-checksum-in-object-metadata
Closed

CLDSRV-872: store checksum in object metadata#6113
leif-scality wants to merge 8 commits intodevelopment/9.4from
development/CLDSRV-872-store-checksum-in-object-metadata

Conversation

@leif-scality
Copy link
Contributor

No description provided.

if (checksumedStream.stream.writableFinished) {
return doValidate();
}
checksumedStream.stream.once('finish', doValidate);
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In storeObject.js, when data.put completes and the callback fires, you listen for 'finish' on the ChecksumTransform if writableFinished is not yet true. However, if the ChecksumTransform's _flush fails (e.g. crc64nvme digest throws), the stream will emit 'error', not 'finish'. In that case, doValidate is never called, but the upgraded onStreamError handler will fire and clean up — so this is safe. Just noting there is no explicit timeout or fallback if neither 'finish' nor 'error' fires (e.g. stream stalls), but that would be a broader Node.js stream issue, not specific to this PR.

— Claude Code

* error, dataRetrievalInfo, and completedHash (if any)
*/
function checkHashMatchMD5(stream, hashedStream, dataRetrievalInfo, log, cb) {
function checkHashMatchMD5(stream, hashedStream, dataRetrievalInfo, checksumStream, log, cb) {
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The checkHashMatchMD5 JSDoc is missing the new checksumStream parameter. Minor, but the existing params are documented and this one is not.

— Claude Code

);
checksumedStream.on('error', onStreamError);
stream.pipe(checksumedStream);
return { error: null, stream: checksumedStream };
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The STREAMING-AWS4-HMAC-SHA256-PAYLOAD case creates a ChecksumTransform and pipes V4Transform into it, but if the request includes x-amz-trailer header (i.e. checksumAlgo.isTrailer === true), no one will ever call setExpectedChecksum() on the ChecksumTransform — unlike the TRAILER case which wires up the 'trailer' event. This means trailer-based checksums through the V4 signed chunked path would always fail with TrailerMissing.

Is STREAMING-AWS4-HMAC-SHA256-PAYLOAD-TRAILER intentionally unsupported (it is in unsupportedSignatureChecksums)? If so, consider adding a guard here rejecting isTrailer === true for this case, to fail fast with a clear error rather than silently producing a TrailerMissing error after data is already stored and then cleaned up.

— Claude Code

};
}

const trailer = headers['x-amz-trailer'];
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In getChecksumDataFromHeaders, when no checksum headers and no trailer are present, this defaults to crc64nvme. This means every PutObject request (even those not requesting checksum validation) will now compute a CRC64NVME hash of the entire body. This is an intentional design choice (always store a checksum in metadata), but it is a performance change — every put now pays the cost of CRC64NVME computation. Worth documenting this behavioral change.

— Claude Code

if (!this.streamClosed && this.readingTrailer && this.trailerBuffer.length === 0) {
// Nothing came after "0\r\n", don't fail.
// If the x-amz-trailer header was present then the trailer is required and ChecksumTransform will fail.
return callback();
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The _flush method has three conditions that could be simplified. The second branch (readingTrailer && trailerBuffer.length !== 0) means data arrived after the 0\r\n marker but the trailer line never terminated with \r\n. This is correct behavior.

However, there is a subtle issue: when the stream ends with 0\r\n and nothing else (no trailer, no final \r\n), the first branch returns callback() (success). But readingTrailer is true and streamClosed is false. The comment says ChecksumTransform will fail if x-amz-trailer header was present — but if x-amz-trailer was NOT present, this silently succeeds with an incomplete chunked body. This seems intentional based on test testS3PutTrailerNoTrailerInBodyAndHeader, but is worth a comment clarifying this is by design.

— Claude Code

@claude
Copy link

claude bot commented Mar 17, 2026

Summary of issues found:

  • prepareStream.js:67 - STREAMING-AWS4-HMAC-SHA256-PAYLOAD with isTrailer=true never wires up setExpectedChecksum. Consider a fast-fail guard.
  • storeObject.js:20 - checkHashMatchMD5 JSDoc missing new checksumStream param.
  • validateChecksums.js:211 - Every PutObject now computes CRC64NVME. Worth documenting this perf change.
  • trailingChecksumTransform.js:41 - Silent success on zero-size chunk with no trailer. Intentional but warrants a comment.
  • storeObject.js:125 - finish/error handling is safe. No action needed.

Overall solid implementation with good error handling and test coverage.

Review by Claude Code

@codecov
Copy link

codecov bot commented Mar 17, 2026

❌ 128 Tests Failed:

Tests completed Failed Passed Skipped
240 128 112 0
View the top 3 failed test(s) by shortest run time
PUT data should respond with 403 Forbidden if backbeat user has wrong secret key::backbeat routes backbeat authorization checks PUT data should respond with 403 Forbidden if backbeat user has wrong secret key
Stack Traces | 0s run time
Expected values to be strictly equal:

undefined !== 403
PUT data should respond with 403 Forbidden if the account does not match the backbeat user::backbeat routes backbeat authorization checks PUT data should respond with 403 Forbidden if the account does not match the backbeat user
Stack Traces | 0s run time
Expected values to be strictly equal:

undefined !== 403
PUT metadata should respond with 403 Forbidden if no credentials are provided::backbeat routes backbeat authorization checks PUT metadata should respond with 403 Forbidden if no credentials are provided
Stack Traces | 0s run time
Expected values to be strictly equal:

undefined !== 403
should remove old object data locations if version is overwritten with same contents::backbeat routes backbeat PUT routes should remove old object data locations if version is overwritten with same contents
Stack Traces | 0s run time
ifError got unwanted exception: connect ECONNREFUSED 127.0.0.1:8000
should skip batch delete of a non-existent location::backbeat routes Batch Delete Route should skip batch delete of a non-existent location
Stack Traces | 0s run time
connect ECONNREFUSED 127.0.0.1:8000
should skip batch delete of empty location array::backbeat routes Batch Delete Route should skip batch delete of empty location array
Stack Traces | 0s run time
connect ECONNREFUSED 127.0.0.1:8000
with encryption configuration and legacy API v1::backbeat routes backbeat PUT routes PUT data + metadata should create a new complete object with encryption configuration and legacy API v1
Stack Traces | 0s run time
ifError got unwanted exception: connect ECONNREFUSED 127.0.0.1:8000
with encryption configuration::backbeat routes backbeat PUT routes PUT data + metadata should create a new complete object with encryption configuration
Stack Traces | 0s run time
ifError got unwanted exception: connect ECONNREFUSED 127.0.0.1:8000
with key notes/spring/march/1.txt::backbeat routes backbeat PUT routes PUT data + metadata should create a new complete object with key notes/spring/march/1.txt
Stack Traces | 0s run time
ifError got unwanted exception: connect ECONNREFUSED 127.0.0.1:8000
with key notes/summer/1.txt::backbeat routes backbeat PUT routes PUT data + metadata should create a new complete object with key notes/summer/1.txt
Stack Traces | 0s run time
ifError got unwanted exception: connect ECONNREFUSED 127.0.0.1:8000
with key notes/summer/2.txt::backbeat routes backbeat PUT routes PUT data + metadata should create a new complete object with key notes/summer/2.txt
Stack Traces | 0s run time
ifError got unwanted exception: connect ECONNREFUSED 127.0.0.1:8000
with key notes/zaphod/Beeblebrox.txt::backbeat routes backbeat PUT routes PUT data + metadata should create a new complete object with key notes/zaphod/Beeblebrox.txt
Stack Traces | 0s run time
ifError got unwanted exception: connect ECONNREFUSED 127.0.0.1:8000
with legacy API v1::backbeat routes backbeat PUT routes PUT data + metadata should create a new complete object with legacy API v1
Stack Traces | 0s run time
ifError got unwanted exception: connect ECONNREFUSED 127.0.0.1:8000
"after each" hook for "DELETE .system-d26a9498-cb7c-4a87-a44a-8ae204f5ba6c/system.xml should delete the XML file"::Veeam routes: veeam DELETE routes: "after each" hook for "DELETE .system-d26a9498-cb7c-4a87-a44a-8ae204f5ba6c/system.xml should delete the XML file"
Stack Traces | 0.001s run time
connect ECONNREFUSED 127.0.0.1:8000
"after each" hook for "GET .system-d26a9498-cb7c-4a87-a44a-8ae204f5ba6c/system.xml should return the expected XML file"::Veeam routes: veeam GET routes: "after each" hook for "GET .system-d26a9498-cb7c-4a87-a44a-8ae204f5ba6c/system.xml should return the expected XML file"
Stack Traces | 0.001s run time
connect ECONNREFUSED 127.0.0.1:8000
"after each" hook for "HEAD .system-d26a9498-cb7c-4a87-a44a-8ae204f5ba6c/system.xml should return the existing XML file metadata"::Veeam routes: veeam HEAD routes: "after each" hook for "HEAD .system-d26a9498-cb7c-4a87-a44a-8ae204f5ba6c/system.xml should return the existing XML file metadata"
Stack Traces | 0.001s run time
connect ECONNREFUSED 127.0.0.1:8000
"after each" hook for "should successfully replicate a version"::backbeat routes for replication (cross account) "after each" hook for "should successfully replicate a version"
Stack Traces | 0.001s run time
connect ECONNREFUSED 127.0.0.1:8000
"before each" hook for "should return metadata blob for a versionId"::backbeat routes GET Metadata route "before each" hook for "should return metadata blob for a versionId"
Stack Traces | 0.001s run time
connect ECONNREFUSED 127.0.0.1:8000
"before each" hook for "should successfully replicate a version"::backbeat routes for replication (cross account) "before each" hook for "should successfully replicate a version"
Stack Traces | 0.001s run time
connect ECONNREFUSED 127.0.0.1:8000
GET /_/backbeat/api/... should respond with 403 if the request is unauthenticated::backbeat routes backbeat authorization checks when api proxy is configured GET /_/backbeat/api/... should respond with 403 if the request is unauthenticated
Stack Traces | 0.001s run time
Expected values to be strictly equal:

undefined !== 403
GET /_/backbeat/api/... should respond with 503 on authenticated requests (API server down)::backbeat routes backbeat authorization checks when api proxy is configured GET /_/backbeat/api/... should respond with 503 on authenticated requests (API server down)
Stack Traces | 0.001s run time
Expected values to be strictly equal:

undefined !== 503
PUT data should respond with 403 Forbidden if no credentials are provided::backbeat routes backbeat authorization checks PUT data should respond with 403 Forbidden if no credentials are provided
Stack Traces | 0.001s run time
Expected values to be strictly equal:

undefined !== 403
PUT data should respond with 403 Forbidden if wrong credentials are provided::backbeat routes backbeat authorization checks PUT data should respond with 403 Forbidden if wrong credentials are provided
Stack Traces | 0.001s run time
Expected values to be strictly equal:

undefined !== 403
PUT metadata should respond with 403 Forbidden if backbeat user has wrong secret key::backbeat routes backbeat authorization checks PUT metadata should respond with 403 Forbidden if backbeat user has wrong secret key
Stack Traces | 0.001s run time
Expected values to be strictly equal:

undefined !== 403
PUT metadata should respond with 403 Forbidden if the account does not match the backbeat user::backbeat routes backbeat authorization checks PUT metadata should respond with 403 Forbidden if the account does not match the backbeat user
Stack Traces | 0.001s run time
Expected values to be strictly equal:

undefined !== 403
PUT metadata should respond with 403 Forbidden if wrong credentials are provided::backbeat routes backbeat authorization checks PUT metadata should respond with 403 Forbidden if wrong credentials are provided
Stack Traces | 0.001s run time
Expected values to be strictly equal:

undefined !== 403
PUT metadata with "x-scal-replication-content: METADATA"header should replicate metadata only::backbeat routes backbeat PUT routes PUT metadata with "x-scal-replication-content: METADATA"header should replicate metadata only
Stack Traces | 0.001s run time
ifError got unwanted exception: connect ECONNREFUSED 127.0.0.1:8000
should PUT tags for a non-versioned bucket (awslocation)::backbeat routes backbeat PUT routes should PUT tags for a non-versioned bucket (awslocation)
Stack Traces | 0.001s run time
ifError got unwanted exception: connect ECONNREFUSED 127.0.0.1:8000
should allow creating mpu with SSE header in encrypted bucket::KMIP backed server-side encryption should allow creating mpu with SSE header in encrypted bucket
Stack Traces | 0.001s run time
connect ECONNREFUSED 127.0.0.1:8000
should allow object copy with SSE header in encrypted bucket::KMIP backed server-side encryption should allow object copy with SSE header in encrypted bucket
Stack Traces | 0.001s run time
connect ECONNREFUSED 127.0.0.1:8000
should batch delete a local location::backbeat routes Batch Delete Route should batch delete a local location
Stack Traces | 0.001s run time
connect ECONNREFUSED 127.0.0.1:8000
should copy part to AWS based on mpu location::ObjectCopyPutPart API with multiple backends should copy part to AWS based on mpu location
Stack Traces | 0.001s run time
ObjectMDChecksum is not a constructor
should copy part to file based on mpu location::ObjectCopyPutPart API with multiple backends should copy part to file based on mpu location
Stack Traces | 0.001s run time
ObjectMDChecksum is not a constructor
should copy part to file based on request endpoint::ObjectCopyPutPart API with multiple backends should copy part to file based on request endpoint
Stack Traces | 0.001s run time
ObjectMDChecksum is not a constructor
should copy part to mem based on bucket location::ObjectCopyPutPart API with multiple backends should copy part to mem based on bucket location
Stack Traces | 0.001s run time
ObjectMDChecksum is not a constructor
should create a new version when no versionId is passed in query string::backbeat routes backbeat PUT routes should create a new version when no versionId is passed in query string
Stack Traces | 0.001s run time
ifError got unwanted exception: connect ECONNREFUSED 127.0.0.1:8000
should not remove data locations on replayed metadata PUT::backbeat routes backbeat PUT routes should not remove data locations on replayed metadata PUT
Stack Traces | 0.001s run time
ifError got unwanted exception: connect ECONNREFUSED 127.0.0.1:8000
should put an object to mem based on bucket location::objectPutAPI with multiple backends should put an object to mem based on bucket location
Stack Traces | 0.001s run time
ObjectMDChecksum is not a constructor
should put tags if the source is AWS and tags are provided when initiating the multipart upload::backbeat routes backbeat multipart upload operations (external location) should put tags if the source is AWS and tags are provided when initiating the multipart upload
Stack Traces | 0.001s run time
connect ECONNREFUSED 127.0.0.1:8000
should put tags if the source is Azure and tags are provided when completing the multipart upload::backbeat routes backbeat multipart upload operations (external location) should put tags if the source is Azure and tags are provided when completing the multipart upload
Stack Traces | 0.001s run time
connect ECONNREFUSED 127.0.0.1:8000
should refuse PUT data if bucket is not versioned and x-scal-versioning-required is true::backbeat routes backbeat PUT routes should refuse PUT data if bucket is not versioned and x-scal-versioning-required is true
Stack Traces | 0.001s run time
Expected values to be strictly equal:
+ actual - expected

+ 'ECONNREFUSED'
- 'InvalidBucketState'
should refuse PUT data if no x-scal-canonical-id header is provided::backbeat routes backbeat PUT routes should refuse PUT data if no x-scal-canonical-id header is provided
Stack Traces | 0.001s run time
Expected values to be strictly equal:
+ actual - expected

+ 'ECONNREFUSED'
- 'BadRequest'
should refuse PUT in metadata-only mode if object does not exist::backbeat routes backbeat PUT routes should refuse PUT in metadata-only mode if object does not exist
Stack Traces | 0.001s run time
Expected values to be strictly equal:

undefined !== 404
should refuse PUT metadata if bucket is not versioned and x-scal-versioning-required is true::backbeat routes backbeat PUT routes should refuse PUT metadata if bucket is not versioned and x-scal-versioning-required is true
Stack Traces | 0.001s run time
Expected values to be strictly equal:
+ actual - expected

+ 'ECONNREFUSED'
- 'InvalidBucketState'
should refuse PUT metadata if bucket is version suspended and x-scal-versioning-required is true::backbeat routes backbeat PUT routes should refuse PUT metadata if bucket is version suspended and x-scal-versioning-required is true
Stack Traces | 0.001s run time
Expected values to be strictly equal:
+ actual - expected

+ 'ECONNREFUSED'
- 'InvalidBucketState'
should remove old object data locations if version is overwritten with empty contents::backbeat routes backbeat PUT routes should remove old object data locations if version is overwritten with empty contents
Stack Traces | 0.001s run time
ifError got unwanted exception: connect ECONNREFUSED 127.0.0.1:8000
with UTF8 key::backbeat routes backbeat PUT routes PUT data + metadata should create a new complete object with UTF8 key
Stack Traces | 0.001s run time
ifError got unwanted exception: connect ECONNREFUSED 127.0.0.1:8000
with ascii test key::backbeat routes backbeat PUT routes PUT data + metadata should create a new complete object with ascii test key
Stack Traces | 0.001s run time
ifError got unwanted exception: connect ECONNREFUSED 127.0.0.1:8000
with key Pâtisserie=中文-español-English::backbeat routes backbeat PUT routes PUT data + metadata should create a new complete object with key Pâtisserie=中文-español-English
Stack Traces | 0.001s run time
ifError got unwanted exception: connect ECONNREFUSED 127.0.0.1:8000
with key notes/spring/1.txt::backbeat routes backbeat PUT routes PUT data + metadata should create a new complete object with key notes/spring/1.txt
Stack Traces | 0.001s run time
ifError got unwanted exception: connect ECONNREFUSED 127.0.0.1:8000
with key notes/spring/2.txt::backbeat routes backbeat PUT routes PUT data + metadata should create a new complete object with key notes/spring/2.txt
Stack Traces | 0.001s run time
ifError got unwanted exception: connect ECONNREFUSED 127.0.0.1:8000
with key notes/summer/august/1.txt::backbeat routes backbeat PUT routes PUT data + metadata should create a new complete object with key notes/summer/august/1.txt
Stack Traces | 0.001s run time
ifError got unwanted exception: connect ECONNREFUSED 127.0.0.1:8000
with key notes/year.txt::backbeat routes backbeat PUT routes PUT data + metadata should create a new complete object with key notes/year.txt
Stack Traces | 0.001s run time
ifError got unwanted exception: connect ECONNREFUSED 127.0.0.1:8000
with key notes/yore.rs::backbeat routes backbeat PUT routes PUT data + metadata should create a new complete object with key notes/yore.rs
Stack Traces | 0.001s run time
ifError got unwanted exception: connect ECONNREFUSED 127.0.0.1:8000
with key 䆩鈁櫨㟔罳/䆩鈁櫨㟔罳/%42/mykey::backbeat routes backbeat PUT routes PUT data + metadata should create a new complete object with key 䆩鈁櫨㟔罳/䆩鈁櫨㟔罳/%42/mykey
Stack Traces | 0.001s run time
ifError got unwanted exception: connect ECONNREFUSED 127.0.0.1:8000
with percents and spaces encoded as '+' in key::backbeat routes backbeat PUT routes PUT data + metadata should create a new complete object with percents and spaces encoded as '+' in key
Stack Traces | 0.001s run time
ifError got unwanted exception: connect ECONNREFUSED 127.0.0.1:8000
"after all" hook for "PUT .system-d26a9498-cb7c-4a87-a44a-8ae204f5ba6c/capacity.xml should fail if invalid credentials are sent"::Veeam routes: veeam PUT routes: "after all" hook for "PUT .system-d26a9498-cb7c-4a87-a44a-8ae204f5ba6c/capacity.xml should fail if invalid credentials are sent"
Stack Traces | 0.002s run time
connect ECONNREFUSED 127.0.0.1:8000
"after all" hook in "backbeat routes"::backbeat routes "after all" hook in "backbeat routes"
Stack Traces | 0.002s run time
connect ECONNREFUSED 127.0.0.1:8000
"after each" hook for "should successfully replicate a version"::backbeat routes for replication (same account) "after each" hook for "should successfully replicate a version"
Stack Traces | 0.002s run time
connect ECONNREFUSED 127.0.0.1:8000
"after each" hook for "should update metadata of a current null version"::backbeat routes null version "after each" hook for "should update metadata of a current null version"
Stack Traces | 0.002s run time
connect ECONNREFUSED 127.0.0.1:8000
"before each" hook for "DELETE .system-d26a9498-cb7c-4a87-a44a-8ae204f5ba6c/system.xml should delete the XML file"::Veeam routes: veeam DELETE routes: "before each" hook for "DELETE .system-d26a9498-cb7c-4a87-a44a-8ae204f5ba6c/system.xml should delete the XML file"
Stack Traces | 0.002s run time
connect ECONNREFUSED 127.0.0.1:8000
"before each" hook for "should successfully replicate a version"::backbeat routes for replication (same account) "before each" hook for "should successfully replicate a version"
Stack Traces | 0.002s run time
connect ECONNREFUSED 127.0.0.1:8000
should allow object PUT with SSE header in encrypted bucket::KMIP backed server-side encryption should allow object PUT with SSE header in encrypted bucket
Stack Traces | 0.002s run time
connect ECONNREFUSED 127.0.0.1:8000
should put an object to mem::objectPutAPI with multiple backends should put an object to mem
Stack Traces | 0.002s run time
ObjectMDChecksum is not a constructor
should refuse PUT data if bucket is version suspended and x-scal-versioning-required is true::backbeat routes backbeat PUT routes should refuse PUT data if bucket is version suspended and x-scal-versioning-required is true
Stack Traces | 0.002s run time
Expected values to be strictly equal:
+ actual - expected

+ 'ECONNREFUSED'
- 'InvalidBucketState'
"before all" hook for "PUT .system-d26a9498-cb7c-4a87-a44a-8ae204f5ba6c/system.xml"::Veeam routes: veeam PUT routes: "before all" hook for "PUT .system-d26a9498-cb7c-4a87-a44a-8ae204f5ba6c/system.xml"
Stack Traces | 0.003s run time
connect ECONNREFUSED 127.0.0.1:8000
"before each" hook for "GET .system-d26a9498-cb7c-4a87-a44a-8ae204f5ba6c/system.xml should return the expected XML file"::Veeam routes: veeam GET routes: "before each" hook for "GET .system-d26a9498-cb7c-4a87-a44a-8ae204f5ba6c/system.xml should return the expected XML file"
Stack Traces | 0.003s run time
connect ECONNREFUSED 127.0.0.1:8000
"before each" hook for "HEAD .system-d26a9498-cb7c-4a87-a44a-8ae204f5ba6c/system.xml should return the existing XML file metadata"::Veeam routes: veeam HEAD routes: "before each" hook for "HEAD .system-d26a9498-cb7c-4a87-a44a-8ae204f5ba6c/system.xml should return the existing XML file metadata"
Stack Traces | 0.003s run time
connect ECONNREFUSED 127.0.0.1:8000
should copy part to file based on bucket location::ObjectCopyPutPart API with multiple backends should copy part to file based on bucket location
Stack Traces | 0.003s run time
ObjectMDChecksum is not a constructor
should put an object to file based on bucket location::objectPutAPI with multiple backends should put an object to file based on bucket location
Stack Traces | 0.003s run time
ObjectMDChecksum is not a constructor
should put an object to file::objectPutAPI with multiple backends should put an object to file
Stack Traces | 0.003s run time
ObjectMDChecksum is not a constructor
should put an object to us-east-1 which is file based on bucket location if no locationConstraint provided::objectPutAPI with multiple backends should put an object to us-east-1 which is file based on bucket location if no locationConstraint provided
Stack Traces | 0.003s run time
ObjectMDChecksum is not a constructor
should copy part to mem based on mpu location::ObjectCopyPutPart API with multiple backends should copy part to mem based on mpu location
Stack Traces | 0.004s run time
ObjectMDChecksum is not a constructor
should put an object to sproxyd::objectPutAPI with multiple backends should put an object to sproxyd
Stack Traces | 0.004s run time
ObjectMDChecksum is not a constructor
object metadata for newly stored object should have dataStoreName if copying to mem based on bucket location::ObjectCopy API with multiple backends object metadata for newly stored object should have dataStoreName if copying to mem based on bucket location
Stack Traces | 0.006s run time
ObjectMDChecksum is not a constructor
should PUT metadata for a non-versioned bucket::backbeat routes backbeat PUT routes should PUT metadata for a non-versioned bucket
Stack Traces | 0.01s run time
ifError got unwanted exception: connect ECONNREFUSED 127.0.0.1:8000
should return MethodNotAllowed for invalid request::Veeam routes: veeam invalid requests: should return MethodNotAllowed for invalid request
Stack Traces | 0.01s run time
Cannot read properties of undefined (reading 'statusCode')
should complete MPU on AWS with same key as object put to file::Multipart Upload API with AWS Backend should complete MPU on AWS with same key as object put to file
Stack Traces | 0.014s run time
ObjectMDChecksum is not a constructor
should set metrics in versioned bucket::utapi v2 metrics incoming and outgoing bytes should set metrics in versioned bucket
Stack Traces | 0.014s run time
connect ECONNREFUSED 127.0.0.1:8000
should not increase the inflights when the object is being rewritten with a smaller object::quota evaluation with scuba metrics should not increase the inflights when the object is being rewritten with a smaller object
Stack Traces | 0.021s run time
connect ECONNREFUSED 127.0.0.1:8000
should copy an object as a part to a multipart upload::Multipart Upload API with AWS Backend with mpu initiated on legacy version should copy an object as a part to a multipart upload
Stack Traces | 0.034s run time
ObjectMDChecksum is not a constructor
should put an object to Azure based on bucket location::objectPutAPI with multiple backends should put an object to Azure based on bucket location
Stack Traces | 0.038s run time
ObjectMDChecksum is not a constructor
should reduce inflights when aborting MPU::quota evaluation with scuba metrics should reduce inflights when aborting MPU
Stack Traces | 0.055s run time
connect ECONNREFUSED 127.0.0.1:8000
should not put tags if the source is not Azure and if-unmodified-since condition is not met::backbeat routes Batch Delete Route should not put tags if the source is not Azure and if-unmodified-since condition is not met
Stack Traces | 0.058s run time
connect ECONNREFUSED 127.0.0.1:8000
should not put delete tags if the source is not Azure and if-unmodified-since header is not provided::backbeat routes Batch Delete Route should not put delete tags if the source is not Azure and if-unmodified-since header is not provided
Stack Traces | 0.06s run time
connect ECONNREFUSED 127.0.0.1:8000
should allow writes after deleting data with quotas below the current number of inflights::quota evaluation with scuba metrics should allow writes after deleting data with quotas below the current number of inflights
Stack Traces | 0.066s run time
connect ECONNREFUSED 127.0.0.1:8000
should delete the object if the source is Azure and if-unmodified-since condition is met::backbeat routes Batch Delete Route should delete the object if the source is Azure and if-unmodified-since condition is met
Stack Traces | 0.072s run time
connect ECONNREFUSED 127.0.0.1:8000
should not push a metric for a filtered bucket::utapi v2 metrics incoming and outgoing bytes should not push a metric for a filtered bucket
Stack Traces | 0.075s run time
connect ECONNREFUSED 127.0.0.1:8000
should set metrics for copyObject::utapi v2 metrics incoming and outgoing bytes should set metrics for copyObject
Stack Traces | 0.078s run time
connect ECONNREFUSED 127.0.0.1:8000
should return QuotaExceeded when trying to copy a part in a bucket with quota::quota evaluation with scuba metrics should return QuotaExceeded when trying to copy a part in a bucket with quota
Stack Traces | 0.084s run time
connect ECONNREFUSED 127.0.0.1:8000
should not update the inflights if the API errored after evaluating quotas (deletion)::quota evaluation with scuba metrics should not update the inflights if the API errored after evaluating quotas (deletion)
Stack Traces | 0.088s run time
connect ECONNREFUSED 127.0.0.1:8000
should set metrics for multiPartUpload::utapi v2 metrics incoming and outgoing bytes should set metrics for multiPartUpload
Stack Traces | 0.089s run time
connect ECONNREFUSED 127.0.0.1:8000
should update metadata of a current null version::backbeat routes null version should update metadata of a current null version
Stack Traces | 0.102s run time
socket hang up
should allow writes after deleting data with quotas::quota evaluation with scuba metrics should allow writes after deleting data with quotas
Stack Traces | 0.103s run time
connect ECONNREFUSED 127.0.0.1:8000
should decrease the inflights when performing multi object delete::quota evaluation with scuba metrics should decrease the inflights when performing multi object delete
Stack Traces | 0.107s run time
connect ECONNREFUSED 127.0.0.1:8000
should set metrics for multipartUpload overwrite in a versioned bucket::utapi v2 metrics incoming and outgoing bytes should set metrics for multipartUpload overwrite in a versioned bucket
Stack Traces | 0.116s run time
connect ECONNREFUSED 127.0.0.1:8000
should reduce inflights when completing MPU with fewer parts than uploaded::quota evaluation with scuba metrics should reduce inflights when completing MPU with fewer parts than uploaded
Stack Traces | 0.123s run time
connect ECONNREFUSED 127.0.0.1:8000
should put tags if the source is not Azure and if-unmodified-since condition is met::backbeat routes Batch Delete Route should put tags if the source is not Azure and if-unmodified-since condition is met
Stack Traces | 0.124s run time
connect ECONNREFUSED 127.0.0.1:8000
should put an object to AWS based on bucket location::objectPutAPI with multiple backends should put an object to AWS based on bucket location
Stack Traces | 0.134s run time
ObjectMDChecksum is not a constructor
should copy part an object on AWS location that has bucketMatch equals false to a mpu with a different AWS location::ObjectCopyPutPart API with multiple backends should copy part an object on AWS location that has bucketMatch equals false to a mpu with a different AWS location
Stack Traces | 0.137s run time
ObjectMDChecksum is not a constructor
should set metrics for multiObjectDelete in a versioned bucket::utapi v2 metrics incoming and outgoing bytes should set metrics for multiObjectDelete in a versioned bucket
Stack Traces | 0.143s run time
connect ECONNREFUSED 127.0.0.1:8000
should put an object to AWS::objectPutAPI with multiple backends should put an object to AWS
Stack Traces | 0.149s run time
ObjectMDChecksum is not a constructor
should not delete the object if the source is Azure and if-unmodified-since condition is not met::backbeat routes Batch Delete Route should not delete the object if the source is Azure and if-unmodified-since condition is not met
Stack Traces | 0.15s run time
connect ECONNREFUSED 127.0.0.1:8000
should put an object to azure::objectPutAPI with multiple backends should put an object to azure
Stack Traces | 0.15s run time
ObjectMDChecksum is not a constructor
should copy part to mem from AWS based on mpu location::ObjectCopyPutPart API with multiple backends should copy part to mem from AWS based on mpu location
Stack Traces | 0.155s run time
ObjectMDChecksum is not a constructor
should copy part an object on AWS to a mpu with a different AWS location that has bucketMatch equals false::ObjectCopyPutPart API with multiple backends should copy part an object on AWS to a mpu with a different AWS location that has bucketMatch equals false
Stack Traces | 0.157s run time
ObjectMDChecksum is not a constructor
should only evaluate quota and not update inflights for PutObject with the x-scal-s3-version-id header::quota evaluation with scuba metrics should only evaluate quota and not update inflights for PutObject with the x-scal-s3-version-id header
Stack Traces | 0.158s run time
connect ECONNREFUSED 127.0.0.1:8000
should be successful initiating MPU on AWS with Scality S3 versioning enabled::Multipart Upload API with AWS Backend should be successful initiating MPU on AWS with Scality S3 versioning enabled
Stack Traces | 0.16s run time
ObjectMDChecksum is not a constructor
should allow a restore if the quota is full but the objet fits with its reserved storage space::quota evaluation with scuba metrics should allow a restore if the quota is full but the objet fits with its reserved storage space
Stack Traces | 0.173s run time
connect ECONNREFUSED 127.0.0.1:8000
should batch delete a versioned AWS location::backbeat routes Batch Delete Route should batch delete a versioned AWS location
Stack Traces | 0.174s run time
connect ECONNREFUSED 127.0.0.1:8000
should copy part to AWS based on bucket location::ObjectCopyPutPart API with multiple backends should copy part to AWS based on bucket location
Stack Traces | 0.176s run time
ObjectMDChecksum is not a constructor
should complete MPU on file with same key as object put to AWS::Multipart Upload API with AWS Backend should complete MPU on file with same key as object put to AWS
Stack Traces | 0.179s run time
ObjectMDChecksum is not a constructor
should return QuotaExceeded when trying to CopyObject in a bucket with quota::quota evaluation with scuba metrics should return QuotaExceeded when trying to CopyObject in a bucket with quota
Stack Traces | 0.189s run time
connect ECONNREFUSED 127.0.0.1:8000
should return QuotaExceeded when trying to restore an object in a bucket with quota::quota evaluation with scuba metrics should return QuotaExceeded when trying to restore an object in a bucket with quota
Stack Traces | 0.208s run time
connect ECONNREFUSED 127.0.0.1:8000
should not update the inflights if the quota check is passing but the object is already restored::quota evaluation with scuba metrics should not update the inflights if the quota check is passing but the object is already restored
Stack Traces | 0.209s run time
connect ECONNREFUSED 127.0.0.1:8000
should set metrics for multiPartUpload overwrite::utapi v2 metrics incoming and outgoing bytes should set metrics for multiPartUpload overwrite
Stack Traces | 0.215s run time
connect ECONNREFUSED 127.0.0.1:8000
should allow writes after multi-deleting data with quotas below the current number of inflights::quota evaluation with scuba metrics should allow writes after multi-deleting data with quotas below the current number of inflights
Stack Traces | 0.219s run time
connect ECONNREFUSED 127.0.0.1:8000
should set metrics for multiObjectDelete::utapi v2 metrics incoming and outgoing bytes should set metrics for multiObjectDelete
Stack Traces | 0.226s run time
connect ECONNREFUSED 127.0.0.1:8000
should set metrics for getObject::utapi v2 metrics incoming and outgoing bytes should set metrics for getObject
Stack Traces | 0.233s run time
connect ECONNREFUSED 127.0.0.1:8000
should return QuotaExceeded when trying to complete MPU in a bucket with quota::quota evaluation with scuba metrics should return QuotaExceeded when trying to complete MPU in a bucket with quota
Stack Traces | 0.239s run time
connect ECONNREFUSED 127.0.0.1:8000
should set metrics for multipartUpload in a versioned bucket::utapi v2 metrics incoming and outgoing bytes should set metrics for multipartUpload in a versioned bucket
Stack Traces | 0.239s run time
connect ECONNREFUSED 127.0.0.1:8000
should not return QuotaExceeded if the quota is not exceeded::quota evaluation with scuba metrics should not return QuotaExceeded if the quota is not exceeded
Stack Traces | 0.274s run time
connect ECONNREFUSED 127.0.0.1:8000
should set metrics for putObject and deleteObject::utapi v2 metrics incoming and outgoing bytes should set metrics for putObject and deleteObject
Stack Traces | 0.35s run time
connect ECONNREFUSED 127.0.0.1:8000
should PUT metadata and data if bucket is not versioned and x-scal-versioning-required is not set::backbeat routes backbeat PUT routes should PUT metadata and data if bucket is not versioned and x-scal-versioning-required is not set
Stack Traces | 20s run time
Timeout of 20000ms exceeded. For async tests and hooks, ensure "done()" is called; if returning a Promise, ensure it resolves. (.../multipleBackend/routes/routeBackbeat.js)
should PUT metadata and data if bucket is version suspended and x-scal-versioning-required is not set::backbeat routes backbeat PUT routes should PUT metadata and data if bucket is version suspended and x-scal-versioning-required is not set
Stack Traces | 20s run time
Timeout of 20000ms exceeded. For async tests and hooks, ensure "done()" is called; if returning a Promise, ensure it resolves. (.../multipleBackend/routes/routeBackbeat.js)
should not evaluate quotas if the backend is not available::quota evaluation with scuba metrics should not evaluate quotas if the backend is not available
Stack Traces | 30s run time
Timeout of 30000ms exceeded. For async tests and hooks, ensure "done()" is called; if returning a Promise, ensure it resolves. (.../tests/sur/quota.js)
should return QuotaExceeded when trying to copyObject in a versioned bucket with quota::quota evaluation with scuba metrics should return QuotaExceeded when trying to copyObject in a versioned bucket with quota
Stack Traces | 30s run time
Timeout of 30000ms exceeded. For async tests and hooks, ensure "done()" is called; if returning a Promise, ensure it resolves. (.../tests/sur/quota.js)
should create an encrypted bucket and upload an object::KMIP backed server-side encryption should create an encrypted bucket and upload an object
Stack Traces | 40s run time
Timeout of 40000ms exceeded. For async tests and hooks, ensure "done()" is called; if returning a Promise, ensure it resolves. (.../functional/kmip/serverside_encryption.js)

To view more test analytics, go to the Test Analytics Dashboard
📋 Got 3 mins? Take this short survey to help us improve Test Analytics.

@nicolas2bert nicolas2bert deleted the development/CLDSRV-872-store-checksum-in-object-metadata branch March 18, 2026 09:03
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant