Compare commits
No commits in common. "8174391c186f34195c2a1f7cdeb797f6fea9b6e9" and "787f66458ffc1fcf888ef99c615c98bc2e3852ec" have entirely different histories.
8174391c18
...
787f66458f
|
@ -92,28 +92,6 @@ class DelimiterMaster extends Delimiter {
|
||||||
return FILTER_ACCEPT;
|
return FILTER_ACCEPT;
|
||||||
}
|
}
|
||||||
if (Version.isDeleteMarker(value)) {
|
if (Version.isDeleteMarker(value)) {
|
||||||
/*
|
|
||||||
Why this change?
|
|
||||||
|
|
||||||
Looking at Metadata (https://github.com/scality/MetaData/blob/22bd001394a7c706556fcdf89821859e96ac7a2a/lib/server/VersioningRequestProcessor.js#L334) and MongoClientInterface (https://github.com/scality/Arsenal/blob/development/8.1/lib/storage/metadata/mongoclient/MongoClientInterface.js#L772)..
|
|
||||||
|
|
||||||
An isPHD version is created to temporarily replace current
|
|
||||||
master version with a PHD.
|
|
||||||
|
|
||||||
Also, (correct me if I'm wrong) I only see an isPHD created for
|
|
||||||
objects only (not buckets).
|
|
||||||
|
|
||||||
So, this would mean running into a PHD version during the
|
|
||||||
skip-scan delimiterMaster, we should treat the next version
|
|
||||||
after a PHD as the expected master version.
|
|
||||||
|
|
||||||
In the case I'm trying to address now, when listing master
|
|
||||||
versions, we want to exclude delete markers from the listing.
|
|
||||||
Setting `this.prvKey` here will mean any following versions or
|
|
||||||
delete markers that have the same `key` name will be filtered
|
|
||||||
above, returning FILTER_SKIP. (Line #76 - `key === this.prvKey`)
|
|
||||||
*/
|
|
||||||
this.prvKey = key;
|
|
||||||
/* This entry is a deleteMarker which has not been filtered by the
|
/* This entry is a deleteMarker which has not been filtered by the
|
||||||
* version test. Either :
|
* version test. Either :
|
||||||
* - it is a deleteMarker on the master version, we want to SKIP
|
* - it is a deleteMarker on the master version, we want to SKIP
|
||||||
|
@ -123,11 +101,10 @@ class DelimiterMaster extends Delimiter {
|
||||||
* next entry). In that case we expect the master version to
|
* next entry). In that case we expect the master version to
|
||||||
* follow. */
|
* follow. */
|
||||||
if (key === this.prvPHDKey) {
|
if (key === this.prvPHDKey) {
|
||||||
// console.log(`${key} | ${this.prvPHDKey}`)
|
this.prvKey = undefined;
|
||||||
// this.prvKey = undefined;
|
|
||||||
return FILTER_ACCEPT;
|
return FILTER_ACCEPT;
|
||||||
}
|
}
|
||||||
// this.prvKey = key;
|
this.prvKey = key;
|
||||||
return FILTER_SKIP;
|
return FILTER_SKIP;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -286,7 +286,7 @@ describe('Delimiter All masters listing algorithm', () => {
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
it.skip('should return good listing result for version', () => {
|
it('should return good listing result for version', () => {
|
||||||
const delimiter = new DelimiterMaster({}, fakeLogger);
|
const delimiter = new DelimiterMaster({}, fakeLogger);
|
||||||
const masterKey = 'key';
|
const masterKey = 'key';
|
||||||
const versionKey1 = `${masterKey}${VID_SEP}version1`;
|
const versionKey1 = `${masterKey}${VID_SEP}version1`;
|
||||||
|
@ -320,170 +320,6 @@ describe('Delimiter All masters listing algorithm', () => {
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should not return key in listing if delete marker is master', () => {
|
|
||||||
const delimiter = new DelimiterMaster({}, fakeLogger);
|
|
||||||
const masterKey = 'key';
|
|
||||||
const versionKey1 = `${masterKey}${VID_SEP}version1`;
|
|
||||||
const versionKey2 = `${masterKey}${VID_SEP}version2`;
|
|
||||||
const value1 = 'value1';
|
|
||||||
|
|
||||||
/* Filter the PHD version */
|
|
||||||
assert.strictEqual(delimiter.filter({
|
|
||||||
key: masterKey,
|
|
||||||
value: '{ "isPHD": true, "value": "version" }',
|
|
||||||
}), FILTER_ACCEPT);
|
|
||||||
|
|
||||||
/* Filter a delete marker version. */
|
|
||||||
assert.strictEqual(delimiter.filter({
|
|
||||||
key: versionKey1,
|
|
||||||
value: '{ "isDeleteMarker": true }',
|
|
||||||
}), FILTER_ACCEPT);
|
|
||||||
|
|
||||||
/* Filter a last version with a specific value. */
|
|
||||||
assert.strictEqual(delimiter.filter({
|
|
||||||
key: versionKey2,
|
|
||||||
value: value1,
|
|
||||||
}), FILTER_SKIP);
|
|
||||||
|
|
||||||
assert.deepStrictEqual(delimiter.result(), {
|
|
||||||
CommonPrefixes: [],
|
|
||||||
Contents: [],
|
|
||||||
IsTruncated: false,
|
|
||||||
NextMarker: undefined,
|
|
||||||
Delimiter: undefined,
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should return key in listing if version is master', () => {
|
|
||||||
const delimiter = new DelimiterMaster({}, fakeLogger);
|
|
||||||
const masterKey = 'key';
|
|
||||||
const versionKey1 = `${masterKey}${VID_SEP}version1`;
|
|
||||||
const versionKey2 = `${masterKey}${VID_SEP}version2`;
|
|
||||||
const value1 = 'value1';
|
|
||||||
|
|
||||||
/* Filter the PHD version. */
|
|
||||||
assert.strictEqual(delimiter.filter({
|
|
||||||
key: masterKey,
|
|
||||||
value: '{ "isPHD": true, "value": "version" }',
|
|
||||||
}), FILTER_ACCEPT);
|
|
||||||
|
|
||||||
/* Filter a last version with a specific value. */
|
|
||||||
assert.strictEqual(delimiter.filter({
|
|
||||||
key: versionKey1,
|
|
||||||
value: value1,
|
|
||||||
}), FILTER_ACCEPT);
|
|
||||||
|
|
||||||
/* Filter a delete marker version. */
|
|
||||||
assert.strictEqual(delimiter.filter({
|
|
||||||
key: versionKey2,
|
|
||||||
value: '{ "isDeleteMarker": true }',
|
|
||||||
}), FILTER_SKIP);
|
|
||||||
|
|
||||||
assert.deepStrictEqual(delimiter.result(), {
|
|
||||||
CommonPrefixes: [],
|
|
||||||
Contents: [{ key: masterKey, value: value1 }],
|
|
||||||
IsTruncated: false,
|
|
||||||
NextMarker: undefined,
|
|
||||||
Delimiter: undefined,
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should test more', () => {
|
|
||||||
const delimiter = new DelimiterMaster({}, fakeLogger);
|
|
||||||
const masterKey = 'key1';
|
|
||||||
const masterKey2 = 'key2';
|
|
||||||
const masterKey3 = 'key3';
|
|
||||||
const versionKey1 = `${masterKey}${VID_SEP}version1`;
|
|
||||||
const versionKey2 = `${masterKey}${VID_SEP}version2`;
|
|
||||||
const value1 = 'value1';
|
|
||||||
const value2 = 'value2';
|
|
||||||
|
|
||||||
assert.strictEqual(delimiter.filter({
|
|
||||||
key: masterKey,
|
|
||||||
value: '{ "isPHD": true, "value": "version" }',
|
|
||||||
}), FILTER_ACCEPT);
|
|
||||||
|
|
||||||
assert.strictEqual(delimiter.filter({
|
|
||||||
key: versionKey1,
|
|
||||||
value: value2,
|
|
||||||
}), FILTER_ACCEPT);
|
|
||||||
|
|
||||||
assert.strictEqual(delimiter.filter({
|
|
||||||
key: versionKey2,
|
|
||||||
value: '{ "isDeleteMarker": true }',
|
|
||||||
}), FILTER_SKIP);
|
|
||||||
|
|
||||||
assert.strictEqual(delimiter.filter({
|
|
||||||
key: `${masterKey}${VID_SEP}version3`,
|
|
||||||
value: value2,
|
|
||||||
}), FILTER_SKIP);
|
|
||||||
|
|
||||||
assert.strictEqual(delimiter.result().Contents.length, 1);
|
|
||||||
|
|
||||||
// another master..
|
|
||||||
|
|
||||||
assert.strictEqual(delimiter.filter({
|
|
||||||
key: masterKey2,
|
|
||||||
value: '{ "isPHD": true, "value": "version" }',
|
|
||||||
}), FILTER_ACCEPT);
|
|
||||||
|
|
||||||
assert.strictEqual(delimiter.filter({
|
|
||||||
key: `${masterKey2}${VID_SEP}version1`,
|
|
||||||
value: '{ "isDeleteMarker": true }',
|
|
||||||
}), FILTER_ACCEPT);
|
|
||||||
|
|
||||||
assert.strictEqual(delimiter.filter({
|
|
||||||
key: `${masterKey2}${VID_SEP}version2`,
|
|
||||||
value: '{ "isDeleteMarker": true }',
|
|
||||||
}), FILTER_SKIP);
|
|
||||||
|
|
||||||
assert.strictEqual(delimiter.result().Contents.length, 1);
|
|
||||||
|
|
||||||
// since master isn't PHD, it is it's own master
|
|
||||||
assert.strictEqual(delimiter.filter({
|
|
||||||
key: masterKey3,
|
|
||||||
value: value1,
|
|
||||||
}), FILTER_ACCEPT);
|
|
||||||
|
|
||||||
assert.strictEqual(delimiter.filter({
|
|
||||||
key: `${masterKey3}${VID_SEP}version1`,
|
|
||||||
value: '{ "isDeleteMarker": true }',
|
|
||||||
}), FILTER_SKIP);
|
|
||||||
|
|
||||||
assert.strictEqual(delimiter.result().Contents.length, 2);
|
|
||||||
// assert.strictEqual(delimiter.result().Contents.length, 2);
|
|
||||||
|
|
||||||
assert.strictEqual(delimiter.filter({
|
|
||||||
key: 'key4',
|
|
||||||
value: '{ "isPHD": true, "value": "version" }',
|
|
||||||
}), FILTER_ACCEPT);
|
|
||||||
|
|
||||||
assert.strictEqual(delimiter.filter({
|
|
||||||
key: `key4${VID_SEP}version1`,
|
|
||||||
value: '{ "isDeleteMarker": true }',
|
|
||||||
}), FILTER_ACCEPT);
|
|
||||||
|
|
||||||
assert.strictEqual(delimiter.result().Contents.length, 2);
|
|
||||||
|
|
||||||
assert.strictEqual(delimiter.filter({
|
|
||||||
key: `key4${VID_SEP}version2`,
|
|
||||||
value: value1,
|
|
||||||
}), FILTER_SKIP);
|
|
||||||
|
|
||||||
assert.strictEqual(delimiter.result().Contents.length, 2);
|
|
||||||
|
|
||||||
assert.deepStrictEqual(delimiter.result(), {
|
|
||||||
CommonPrefixes: [],
|
|
||||||
Contents: [
|
|
||||||
{ key: masterKey, value: value2 },
|
|
||||||
{ key: masterKey3, value: value1 },
|
|
||||||
],
|
|
||||||
IsTruncated: false,
|
|
||||||
NextMarker: undefined,
|
|
||||||
Delimiter: undefined,
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should return good values for entries with different common prefixes',
|
it('should return good values for entries with different common prefixes',
|
||||||
() => {
|
() => {
|
||||||
const delimiterChar = '/';
|
const delimiterChar = '/';
|
||||||
|
|
Loading…
Reference in New Issue