oncommit->tid = tid;
bh->ob->last_write_tid = tid;
bh->last_write_tid = tid;
- if (commit_set_callback)
- last_write_by_ino[bh->ob->get_ino()] = tid;
+ if (commit_set_callback) {
+ uncommitted_by_ino[bh->ob->get_ino()].push_back(&bh->ob->uncommitted_item);
+ }
mark_tx(bh);
}
} else {
Object *ob = objects[oid];
- // is the entire object set now clean and fully committed?
- if (commit_set_callback &&
- last_write_by_ino[ob->get_ino()] <= tid) {
- commit_set_callback(flush_set_callback_arg, ob->get_ino());
- last_write_by_ino.erase(ob->get_ino());
- }
-
// update last_commit.
ob->last_commit_tid = tid;
-
+
+ // is the entire object set now clean and fully committed?
+ if (commit_set_callback &&
+ ob->last_commit_tid == ob->last_write_tid) {
+ ob->uncommitted_item.remove_myself();
+ if (uncommitted_by_ino[ob->get_ino()].empty()) {
+ uncommitted_by_ino.erase(ob->get_ino());
+ commit_set_callback(flush_set_callback_arg, ob->get_ino());
+ }
+ }
+
// waiters?
if (ob->waitfor_commit.count(tid)) {
list<Context*> ls;
#include "include/types.h"
#include "include/lru.h"
#include "include/Context.h"
+#include "include/xlist.h"
#include "common/Cond.h"
#include "common/Thread.h"
list<Context*> waitfor_rd;
list<Context*> waitfor_wr;
+ xlist<Object*>::item uncommitted_item;
+
// lock
static const int LOCK_NONE = 0;
static const int LOCK_WRLOCKING = 1;
oc(_oc),
oid(o), ino(i), layout(l),
last_write_tid(0), last_ack_tid(0), last_commit_tid(0),
+ uncommitted_item(this),
lock_state(LOCK_NONE), wrlock_ref(0), rdlock_ref(0)
{}
~Object() {
hash_map<object_t, Object*> objects;
hash_map<inodeno_t, set<Object*> > objects_by_ino;
hash_map<inodeno_t, int> dirty_tx_by_ino;
- hash_map<inodeno_t, tid_t> last_write_by_ino;
+ hash_map<inodeno_t, xlist<Object*> > uncommitted_by_ino;
set<BufferHead*> dirty_bh;
LRU lru_dirty, lru_rest;