Index: sync/syncable/mutable_entry.cc |
diff --git a/sync/syncable/mutable_entry.cc b/sync/syncable/mutable_entry.cc |
index 143881d52bd8bbdbcc0f342905bf249163b16274..75e51f1027ab626029061326174a1234d940adb5 100644 |
--- a/sync/syncable/mutable_entry.cc |
+++ b/sync/syncable/mutable_entry.cc |
@@ -273,9 +273,20 @@ bool MutableEntry::Put(ProtoField field, |
bool MutableEntry::Put(BitField field, bool value) { |
DCHECK(kernel_); |
write_transaction_->SaveOriginal(kernel_); |
- if (kernel_->ref(field) != value) { |
+ bool old_value = kernel_->ref(field); |
+ if (old_value != value) { |
kernel_->put(field, value); |
kernel_->mark_dirty(GetDirtyIndexHelper()); |
+ |
+ // Update delete journal for existence status change on server side here |
+ // instead of in PutIsDel() because IS_DEL may not be updated due to |
+ // early returns when processing updates. And because |
+ // UpdateDeleteJournalForServerDelete() checks for SERVER_IS_DEL, it has |
+ // to be called on sync thread. |
+ if (field == SERVER_IS_DEL) { |
+ dir()->delete_journal()->UpdateDeleteJournalForServerDelete( |
+ write_transaction(), old_value, *kernel_); |
+ } |
} |
return true; |
} |