Commit b6b14699 by Romain Courteaud

[replicate] Handle document removed because of not query matching

If a document stop matching the replicate query, it will be considered as deleted.
But its attachments will still be reachable and previously prevented the remote document deletion.
1 parent 2e7d0590
......@@ -1262,7 +1262,8 @@
// ie, replication should prevent losing user data
// Synchronize attachments before, to ensure
// all of them will be deleted too
var result;
var result,
previous_report_length;
if (context._signature_hash_key !== undefined) {
if (options.conflict) {
report.log(id, options.from_local ? LOG_FORCE_DELETE_REMOTE :
......@@ -1276,12 +1277,21 @@
return context._signature_sub_storage.remove(id);
});
} else {
previous_report_length = report._list.length;
result = repairDocumentAttachment(context, id, report)
.push(function () {
return destination.allAttachments(id);
})
.push(function (attachment_dict) {
if (JSON.stringify(attachment_dict) === "{}") {
var next_report_length = report._list.length,
has_error = false,
i;
// Check if there was an error during attachment replication
for (i = previous_report_length; i < next_report_length; i += 1) {
if ((report._list[i][1] === id) &&
(report._list[i][0] < 100)) {
has_error = true;
}
}
if (!has_error) {
// Attachment repication has been correctly resolved
if (options.conflict) {
report.log(id, options.from_local ? LOG_FORCE_DELETE_REMOTE :
LOG_FORCE_DELETE_LOCAL);
......@@ -1295,8 +1305,7 @@
});
}
report.log(id, options.from_local ? LOG_UNEXPECTED_REMOTE_ATTACHMENT :
LOG_UNEXPECTED_LOCAL_ATTACHMENT,
JSON.stringify(attachment_dict));
LOG_UNEXPECTED_LOCAL_ATTACHMENT);
}, function (error) {
if ((error instanceof jIO.util.jIOError) &&
(error.status_code === 404)) {
......
......@@ -1992,7 +1992,7 @@
test("local document deletion with attachment", function () {
stop();
expect(7);
expect(12);
var id,
context = this,
......@@ -2013,9 +2013,9 @@
.then(function () {
return context.jio.repair();
})
.fail(function (report) {
.then(function (report) {
deepEqual(report._list, [
[report.LOG_UNEXPECTED_REMOTE_ATTACHMENT, id, '{"foo":{}}']
[report.LOG_DELETE_REMOTE, id]
]);
})
.then(function () {
......@@ -2029,26 +2029,27 @@
.then(function () {
return context.jio.__storage._remote_sub_storage.get(id);
})
.then(function (result) {
deepEqual(result, {
title: "foo"
});
.fail(function (error) {
ok(error instanceof jIO.util.jIOError);
equal(error.message, "Cannot find document: " + id);
equal(error.status_code, 404);
})
.then(function () {
return context.jio.__storage._remote_sub_storage
.getAttachment(id, 'foo', {format: 'text'});
})
.then(function (result) {
equal(result, big_string);
.fail(function (error) {
ok(error instanceof jIO.util.jIOError);
equal(error.message, "Cannot find attachment: " + id + " , foo");
equal(error.status_code, 404);
})
.then(function () {
return context.jio.__storage._signature_sub_storage.get(id);
})
.then(function (result) {
deepEqual(result, {
from_local: true,
hash: "5ea9013447539ad65de308cbd75b5826a2ae30e5"
});
.fail(function (error) {
ok(error instanceof jIO.util.jIOError);
// equal(error.message, "Cannot find document: " + id);
equal(error.status_code, 404);
})
.always(function () {
start();
......@@ -2177,7 +2178,7 @@
test("remote document deletion with attachment", function () {
stop();
expect(7);
expect(12);
var id,
context = this,
......@@ -2197,9 +2198,9 @@
.then(function () {
return context.jio.repair();
})
.fail(function (report) {
.then(function (report) {
deepEqual(report._list, [
[report.LOG_UNEXPECTED_LOCAL_ATTACHMENT, id, '{"foo":{}}']
[report.LOG_DELETE_LOCAL, id]
]);
})
.then(function () {
......@@ -2213,25 +2214,25 @@
.then(function () {
return context.jio.get(id);
})
.then(function (result) {
deepEqual(result, {
title: "foo"
});
.fail(function (error) {
ok(error instanceof jIO.util.jIOError);
equal(error.message, "Cannot find document: " + id);
equal(error.status_code, 404);
})
.then(function () {
return context.jio.getAttachment(id, 'foo', {format: 'text'});
})
.then(function (result) {
equal(result, big_string);
.fail(function (error) {
ok(error instanceof jIO.util.jIOError);
equal(error.message, "Cannot find attachment: " + id + " , foo");
equal(error.status_code, 404);
})
.then(function () {
return context.jio.__storage._signature_sub_storage.get(id);
})
.then(function (result) {
deepEqual(result, {
from_local: true,
hash: "5ea9013447539ad65de308cbd75b5826a2ae30e5"
});
.fail(function (error) {
ok(error instanceof jIO.util.jIOError);
equal(error.status_code, 404);
})
.always(function () {
start();
......
Styling with Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!