===================================================================
@@ -655,6 +655,15 @@ static void persistent_commit_exception(
write_exception(ps, ps->current_committed++, &de);
/*
+ * We are safe to add the exception to our cache before we
+ * issue the callbacks. If we fail to allocate the memory
+ * to put it in the cache though, the callbacks will have to
+ * report the failure.
+ */
+ if (add_exception(store, de.old_chunk, de.new_chunk))
+ ps->valid = 0;
+
+ /*
* Add the callback to the back of the array. This code
* is the only place where the callback array is
* manipulated, and we know that it will never be called
===================================================================
@@ -77,7 +77,20 @@ static void transient_commit_exception(s
void (*callback) (void *, int success),
void *callback_context)
{
- /* Just succeed */
+ struct transient_c *tc = store->context;
+ struct dm_exception *new;
+
+ new = dm_alloc_exception(tc->table);
+ if (!new) {
+ callback(callback_context, 0);
+ return;
+ }
+
+ new->old_chunk = e->old_chunk;
+ new->new_chunk = e->new_chunk;
+
+ dm_insert_exception(tc->table, new);
+
callback(callback_context, 1);
}