[Gs-commits] Triton Repository branch, master, updated. 384887221f0e269cb6c92faedf01a60a50917c78
This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "Triton Repository". The branch, master has been updated via 384887221f0e269cb6c92faedf01a60a50917c78 (commit) via 1ce35e2c579896bce3c829cb33c767b5e611013b (commit) via f4dcceed12dedc81f5671e97527b699c5c46410f (commit) via 1214cb26e67796d62d1e47730c0f744d2c7b0b2e (commit) from 8395647628b5dc54b4b8f62fe3ad8024a5471965 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 384887221f0e269cb6c92faedf01a60a50917c78 Author: Phil Carns <[email protected]> Date: Wed Feb 24 17:47:50 2010 -0500 bug fixes in remove path commit 1ce35e2c579896bce3c829cb33c767b5e611013b Author: Phil Carns <[email protected]> Date: Wed Feb 24 17:35:44 2010 -0500 non-working object removal test commit f4dcceed12dedc81f5671e97527b699c5c46410f Author: Phil Carns <[email protected]> Date: Wed Feb 24 17:08:27 2010 -0500 hooks to remove log files commit 1214cb26e67796d62d1e47730c0f744d2c7b0b2e Author: Phil Carns <[email protected]> Date: Wed Feb 24 16:55:02 2010 -0500 rough draft of object remove function ----------------------------------------------------------------------- Summary of changes: .../gsl/resources/cosd-prototype/cosd-fd-cache.c | 36 +++ .../gsl/resources/cosd-prototype/cosd-fd-cache.h | 7 + .../gsl/resources/cosd-prototype/cosd-prototype.c | 283 ++++++++++++++++++-- .../resources/cosd-prototype/cosd-prototype.gsh | 9 + .../cosd-prototype/test/cosd-multi-object.gs | 21 ++ 5 files changed, 338 insertions(+), 18 deletions(-) Diff of changes: diff --git a/oldcode/src/gsl/resources/cosd-prototype/cosd-fd-cache.c b/oldcode/src/gsl/resources/cosd-prototype/cosd-fd-cache.c index 4675391..6cbb0c2 100644 --- a/oldcode/src/gsl/resources/cosd-prototype/cosd-fd-cache.c +++ b/oldcode/src/gsl/resources/cosd-prototype/cosd-fd-cache.c @@ -104,6 +104,42 @@ void fd_cache_finalize(void) return; } +void fd_cache_remove(uint64_t oid) +{ + struct gs_hash_link* tmp_link; + struct fd_cache_entry* tmp_entry; + char log_name [PATH_MAX]; + int ret; + + gs_mutex_lock(&fd_mutex); + + /* do we have it open? */ + tmp_link = gs_hash_search(oid_table, &oid); + if(tmp_link) + { + tmp_entry = gs_list_get_entry(tmp_link, struct fd_cache_entry, + hash_link); + /* we are in trouble if someone is using this */ + assert(tmp_entry->ref_count == 0); + + /* get rid of the fd cache entry */ + gs_list_del(&tmp_entry->unused_link); + gs_list_del(&tmp_entry->hash_link); + close(tmp_entry->fd); + gs_mutex_destroy(&tmp_entry->log_offset_mutex); + free(tmp_entry); + hash_count--; + } + + /* actually unlink the log file */ + sprintf(log_name, "%s/%llu.dat", fd_cache_cosd_log_path, + llu(oid)); + unlink(log_name); + + gs_mutex_unlock(&fd_mutex); + return; +} + struct fd_cache_entry* fd_cache_get(uint64_t oid) { struct gs_hash_link* tmp_link; diff --git a/oldcode/src/gsl/resources/cosd-prototype/cosd-fd-cache.h b/oldcode/src/gsl/resources/cosd-prototype/cosd-fd-cache.h index 30b93b7..3386d4b 100644 --- a/oldcode/src/gsl/resources/cosd-prototype/cosd-fd-cache.h +++ b/oldcode/src/gsl/resources/cosd-prototype/cosd-fd-cache.h @@ -55,6 +55,13 @@ void fd_cache_put( struct fd_cache_entry* entry /**< entry to put */ ); +/** + * Removes an object + */ +void fd_cache_remove( + uint64_t oid /**< object ID */ +); + #endif diff --git a/oldcode/src/gsl/resources/cosd-prototype/cosd-prototype.c b/oldcode/src/gsl/resources/cosd-prototype/cosd-prototype.c index a6c9d85..1369a2d 100644 --- a/oldcode/src/gsl/resources/cosd-prototype/cosd-prototype.c +++ b/oldcode/src/gsl/resources/cosd-prototype/cosd-prototype.c @@ -158,6 +158,9 @@ struct cosd_work uint64_t requested_oid; uint64_t* out_oid; } create; + struct remove_op{ + uint64_t oid; + } remove; struct write_op{ uint64_t oid; uint64_t fork; @@ -763,7 +766,6 @@ static int read_op_worker(struct gs_op* op) int ret; DB_TXN *txn; DBT key, value; - char log_name[PATH_MAX]; int done = 0; int mem_index = 0; int obj_index = 0; @@ -1080,9 +1082,6 @@ static int write_op_worker(struct gs_op* op) { struct cosd_op *c_op; int ret; - DB_TXN *txn; - DBT key, value; - char log_name[PATH_MAX]; int done = 0; int mem_index = 0; int obj_index = 0; @@ -1240,27 +1239,23 @@ static int dump_op_worker(struct gs_op* op) int ret; DB_TXN *txn; DBC *log_map_dbcp, *missing_ver_dbcp, *ver_dbcp; - DBT log_map_key, missing_ver_key, ver_key, log_offset_key; - DBT log_map_value, missing_ver_value, ver_value, log_offset_value; + DBT log_map_key, missing_ver_key, ver_key; + DBT log_map_value, missing_ver_value, ver_value; int c_get_flag = DB_SET_RANGE; /* keys for each db */ struct logical_map_key lmk; struct missing_version mvk; - uint64_t lok; - uint64_t vk; + uint64_t vk = 0; COSD_INIT_DBT(log_map_key, lmk); COSD_INIT_DBT(missing_ver_key, mvk); - COSD_INIT_DBT(log_offset_key, lok); COSD_INIT_DBT(ver_key, vk); /* values for each db */ struct logical_map_entry lmv; uint64_t vv; - int64_t lov; COSD_INIT_DBT(log_map_value, lmv); COSD_INIT_DBT_EMPTY(missing_ver_value); - COSD_INIT_DBT(log_offset_value, lov); COSD_INIT_DBT(ver_value, vv); c_op = gs_op_entry(op, struct cosd_op, op); @@ -1274,7 +1269,7 @@ static int dump_op_worker(struct gs_op* op) return(1); } - /* create cursors on all 4 dbs */ + /* create cursors on all 3 dbs */ ret = log_map_dbp->cursor(log_map_dbp, txn, &log_map_dbcp, 0); assert(ret == 0); /* TODO: err handling */ ret = ver_dbp->cursor(ver_dbp, txn, &ver_dbcp, 0); @@ -1282,6 +1277,7 @@ static int dump_op_worker(struct gs_op* op) ret = missing_ver_dbp->cursor(missing_ver_dbp, txn, &missing_ver_dbcp, 0); assert(ret == 0); /* TODO: err handling */ + printf("Dumping VOSD contents...\n"); /* loop through version db, one entry per object */ while ((ret = ver_dbcp->c_get(ver_dbcp, &ver_key, &ver_value, DB_NEXT)) == 0) { @@ -1344,6 +1340,218 @@ static int dump_op_worker(struct gs_op* op) } +/* remove_op_worker() + * + * removes an object + */ +/* TODO: audit for deadlocks */ +/* TODO: figure out how to prevent races with read, write, etc. */ +static int remove_op_worker(struct gs_op* op) +{ + struct cosd_op *c_op; + int ret; + DB_TXN *txn; + DBC *log_map_dbcp, *missing_ver_dbcp; + DBT log_map_key, missing_ver_key, ver_key; + DBT log_map_value, missing_ver_value, ver_value; + int c_get_flag = DB_SET_RANGE; + struct logical_map_key lmk; + struct missing_version mvk; + uint64_t vk; + struct logical_map_entry lmv; + uint64_t vv; + + /* keys for each db */ + COSD_INIT_DBT(log_map_key, lmk); + COSD_INIT_DBT(missing_ver_key, mvk); + COSD_INIT_DBT(ver_key, vk); + + /* values for each db */ + COSD_INIT_DBT(log_map_value, lmv); + COSD_INIT_DBT_EMPTY(missing_ver_value); + COSD_INIT_DBT(ver_value, vv); + + c_op = gs_op_entry(op, struct cosd_op, op); + assert(c_op); + + vk = c_op->work.u.remove.oid; + +remove_op_retry: + + ret = envp->txn_begin(envp, NULL, &txn, 0); + if(ret != 0) + { + /* TODO: error handling */ + c_op->error_code = -1; + return(1); + } + + /* delete version key */ + ret = ver_dbp->del(ver_dbp, txn, &ver_key, 0); + if(ret == DB_LOCK_DEADLOCK) + { + txn->abort(txn); + deadlock_counter++; + goto remove_op_retry; + } + else if(ret == DB_NOTFOUND) + { + /* this object didn't exist */ + ret = txn->commit(txn, 0); + if(ret != 0) + { + txn->abort(txn); + if(ret == DB_LOCK_DEADLOCK) + { + deadlock_counter++; + goto remove_op_retry; + } + /* TODO: error handling */ + assert(0); + } + else + { + c_op->error_code = -ENOENT; + return(1); + } + } + else if(ret != 0) + { + txn->abort(txn); + /* TODO: error handling */ + assert(0); + } + + /* create cursors for any remaining metadata */ + ret = log_map_dbp->cursor(log_map_dbp, txn, &log_map_dbcp, 0); + if(ret != 0) + { + txn->abort(txn); + if(ret == DB_LOCK_DEADLOCK) + { + deadlock_counter++; + goto remove_op_retry; + } + /* TODO: error handling */ + assert(0); + } + + ret = missing_ver_dbp->cursor(missing_ver_dbp, txn, &missing_ver_dbcp, 0); + if(ret != 0) + { + log_map_dbcp->c_close(log_map_dbcp); + txn->abort(txn); + if(ret == DB_LOCK_DEADLOCK) + { + deadlock_counter++; + goto remove_op_retry; + } + /* TODO: error handling */ + assert(0); + } + + /* search for any missing versions */ + mvk.oid = vk; + mvk.version = 0; + c_get_flag = DB_SET_RANGE; + while((ret = missing_ver_dbcp->c_get(missing_ver_dbcp, + &missing_ver_key, &missing_ver_value, c_get_flag)) == 0) + { + if(mvk.oid != vk) + break; + c_get_flag = DB_NEXT; + + /* delete it */ + ret = missing_ver_dbcp->c_del(missing_ver_dbcp, 0); + if(ret != 0) + { + log_map_dbcp->c_close(log_map_dbcp); + missing_ver_dbcp->c_close(missing_ver_dbcp); + txn->abort(txn); + if(ret == DB_LOCK_DEADLOCK) + { + deadlock_counter++; + goto remove_op_retry; + } + /* TODO: error handling */ + assert(0); + } + } + if(ret != 0 && ret != DB_NOTFOUND) + { + log_map_dbcp->c_close(log_map_dbcp); + missing_ver_dbcp->c_close(missing_ver_dbcp); + txn->abort(txn); + if(ret == DB_LOCK_DEADLOCK) + { + deadlock_counter++; + goto remove_op_retry; + } + /* TODO: error handling */ + assert(0); + } + + /* search for logical map entries */ + lmk.oid = vk; + lmk.fork = 0; + lmk.logical_offset_end = 0; + c_get_flag = DB_SET_RANGE; + while((ret = log_map_dbcp->c_get(log_map_dbcp, + &log_map_key, &log_map_value, c_get_flag)) == 0) + { + /* stop iterating if we go past the oid */ + if(lmk.oid != vk) + break; + c_get_flag = DB_NEXT; + + /* delete it */ + ret = log_map_dbcp->c_del(log_map_dbcp, 0); + if(ret != 0) + { + log_map_dbcp->c_close(log_map_dbcp); + missing_ver_dbcp->c_close(missing_ver_dbcp); + txn->abort(txn); + if(ret == DB_LOCK_DEADLOCK) + { + deadlock_counter++; + goto remove_op_retry; + } + /* TODO: error handling */ + assert(0); + } + } + if(ret != 0 && ret != DB_NOTFOUND) + { + log_map_dbcp->c_close(log_map_dbcp); + missing_ver_dbcp->c_close(missing_ver_dbcp); + txn->abort(txn); + if(ret == DB_LOCK_DEADLOCK) + { + deadlock_counter++; + goto remove_op_retry; + } + /* TODO: error handling */ + assert(0); + } + + log_map_dbcp->c_close(log_map_dbcp); + missing_ver_dbcp->c_close(missing_ver_dbcp); + + ret = txn->commit(txn, 0); + if(ret != 0) + { + /* TODO: error handling */ + assert(0); + } + + /* get rid of the underlying file */ + fd_cache_remove(vk); + + c_op->error_code = 0; + return(1); +} + + /* create_op_worker() * * creates an object @@ -1356,7 +1564,6 @@ static int create_op_worker(struct gs_op* op) DB_TXN *txn; int64_t val; DBT key, value; - char log_name[PATH_MAX]; struct fd_cache_entry* fd_entry; c_op = gs_op_entry(op, struct cosd_op, op); @@ -1364,11 +1571,7 @@ static int create_op_worker(struct gs_op* op) *c_op->work.u.create.out_oid = c_op->work.u.create.requested_oid; - /* implicitly create the data file */ - fd_entry = fd_cache_get(c_op->work.u.create.requested_oid); - /* TODO: error handling */ - assert(fd_entry); - fd_cache_put(fd_entry); + /* TODO: crap; need to check for existence using version db */ /* do db stuff */ ret = envp->txn_begin(envp, NULL, &txn, 0); @@ -1398,6 +1601,12 @@ static int create_op_worker(struct gs_op* op) assert(0); } + /* implicitly create the data file */ + fd_entry = fd_cache_get(c_op->work.u.create.requested_oid); + /* TODO: error handling */ + assert(fd_entry); + fd_cache_put(fd_entry); + c_op->error_code = 0; return(1); @@ -1681,6 +1890,8 @@ gs_ret_t gs_cosd_create_post( c_op->op_id = gs_id_gen(gs_cosd_resource_id, (uint64_t)(op->cache_id)); c_op->work.u.create.requested_oid = requested_oid; c_op->work.u.create.out_oid = out_oid; + /* we don't support automatically chosing ids */ + assert(requested_oid != 0); *op_id = c_op->op_id; @@ -1700,6 +1911,42 @@ gs_ret_t (* gs_cosd_create)( gs_context_t ctx, gs_op_id_t *op_id) = gs_cosd_create_post; +gs_ret_t gs_cosd_remove_post( + uint64_t oid, + void (*callback)(void *ptr, int ret), + void *user_ptr, + gs_hints_t hints, + gs_context_t ctx, + gs_op_id_t *op_id) +{ + struct gs_op *op; + struct cosd_op *c_op; + + op = gs_opcache_get(cosd_opcache); + gs_op_fill(op, callback, user_ptr, hints, ctx); + + c_op = gs_op_entry(op, struct cosd_op, op); + c_op->op_id = gs_id_gen(gs_cosd_resource_id, (uint64_t)(op->cache_id)); + c_op->work.u.remove.oid = oid; + + *op_id = c_op->op_id; + + c_op->work.op_worker = remove_op_worker; + c_op->work.cleanup_fn = NULL; + + gs_cosd_launch_op(op, gs_cosd_progress_mode); + + return 0; +} +gs_ret_t (* gs_cosd_remove)( + uint64_t oid, + void (*callback)(void *ptr, int ret), + void *user_ptr, + gs_hints_t hints, + gs_context_t ctx, + gs_op_id_t *op_id) = gs_cosd_remove_post; + + int gs_cosd_txn_open(uint64_t oid, uint64_t fork, uint64_t txn_number) { struct txn_accumulator *txn_acc; diff --git a/oldcode/src/gsl/resources/cosd-prototype/cosd-prototype.gsh b/oldcode/src/gsl/resources/cosd-prototype/cosd-prototype.gsh index a16ba06..bb03588 100644 --- a/oldcode/src/gsl/resources/cosd-prototype/cosd-prototype.gsh +++ b/oldcode/src/gsl/resources/cosd-prototype/cosd-prototype.gsh @@ -57,6 +57,15 @@ __blocking int gs_cosd_create( ); /** + * Removes an existing object + * \return 0 on success, -errno on failure + */ +__blocking int gs_cosd_remove( + uint64_t oid /**< oid to remove */ +); + + +/** * Retrieves current version number of object * \return 0 on success, -errno on failure */ diff --git a/oldcode/src/gsl/resources/cosd-prototype/test/cosd-multi-object.gs b/oldcode/src/gsl/resources/cosd-prototype/test/cosd-multi-object.gs index 9002ea3..5b112c5 100644 --- a/oldcode/src/gsl/resources/cosd-prototype/test/cosd-multi-object.gs +++ b/oldcode/src/gsl/resources/cosd-prototype/test/cosd-multi-object.gs @@ -85,6 +85,27 @@ static __blocking int do_cosd_test(void) ret = gs_cosd_dump(); assert(ret == 0); + /* delete them all */ + for(i=0; i<500; i++) + { + oid = i+1; + + ret = gs_cosd_remove(oid); + if(ret != 0) + { + printf("Error deleting oid=%llu\n", oid); + free(buffer); + return(1); + } + } + + ret = gs_cosd_dump(); + assert(ret == 0); + + /* try to delete something that doesn't exist */ + ret = gs_cosd_remove(0); + assert(ret == -ENOENT); + free(buffer); return 0; } hooks/post-receive -- Triton Repository
participants (1)
-
noreply@mcs.anl.gov