interm
Project: http://git-wip-us.apache.org/repos/asf/trafficserver/repo Commit: http://git-wip-us.apache.org/repos/asf/trafficserver/commit/1f66ef61 Tree: http://git-wip-us.apache.org/repos/asf/trafficserver/tree/1f66ef61 Diff: http://git-wip-us.apache.org/repos/asf/trafficserver/diff/1f66ef61 Branch: refs/heads/master Commit: 1f66ef617d1b950bf645275389f8e9df561716c7 Parents: 0f57f14 Author: John Plevyak <[email protected]> Authored: Sun Mar 18 18:56:17 2012 -0700 Committer: John Plevyak <[email protected]> Committed: Sun Mar 18 18:56:17 2012 -0700 ---------------------------------------------------------------------- iocore/cache/CacheWrite.cc | 105 +++++++++++++++++---------------- iocore/net/UnixNetVConnection.cc | 4 +- 2 files changed, 56 insertions(+), 53 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/trafficserver/blob/1f66ef61/iocore/cache/CacheWrite.cc ---------------------------------------------------------------------- diff --git a/iocore/cache/CacheWrite.cc b/iocore/cache/CacheWrite.cc index 06a71d1..2ffee33 100644 --- a/iocore/cache/CacheWrite.cc +++ b/iocore/cache/CacheWrite.cc @@ -1491,67 +1491,68 @@ CacheVC::openWriteStartDone(int event, Event *e) return EVENT_CONT; set_io_not_in_progress(); } - if (_action.cancelled && (!od || !od->has_multiple_writers())) - goto Lcancel; + { + CACHE_TRY_LOCK(lock, vol->mutex, mutex->thread_holding); + if (!lock) + VC_LOCK_RETRY_EVENT(); - if (event == AIO_EVENT_DONE) { // vector read done - Doc *doc = (Doc *) buf->data(); - if (!io.ok()) { - err = ECACHE_READ_FAIL; - goto Lfailure; - } + if (_action.cancelled && (!od || !od->has_multiple_writers())) + goto Lcancel; - /* INKqa07123. - A directory entry which is nolonger valid may have been overwritten. - We need to start afresh from the beginning by setting last_collision - to NULL. - */ - if (!dir_valid(vol, &dir)) { - DDebug("cache_write", - "OpenReadStartDone: Dir not valid: Write Head: %lld, Dir: %"PRId64, - (long long)offset_to_vol_offset(vol, vol->header->write_pos), dir_offset(&dir)); - last_collision = NULL; - goto Lcollision; - } - if (!(doc->first_key == first_key)) - goto Lcollision; - if (doc->magic != DOC_MAGIC) { - err = ECACHE_BAD_META_DATA; - goto Lfailure; - } - if (!doc->hlen) { - err = ECACHE_BAD_META_DATA; - goto Lfailure; - } - ink_assert((((uintptr_t) &doc->hdr()[0]) & HDR_PTR_ALIGNMENT_MASK) == 0); + if (event == AIO_EVENT_DONE) { // vector read done + Doc *doc = (Doc *) buf->data(); + if (!io.ok()) { + err = ECACHE_READ_FAIL; + goto Lfailure; + } - if (write_vector->get_handles(doc->hdr(), doc->hlen, buf) != doc->hlen) { - err = ECACHE_BAD_META_DATA; - goto Lfailure; - } - ink_debug_assert(write_vector->count() > 0); - od->first_dir = dir; - first_dir = dir; - if (doc->single_fragment()) { - // fragment is tied to the vector - od->move_resident_alt = 1; - od->single_doc_key = doc->key; - dir_assign(&od->single_doc_dir, &dir); - dir_set_tag(&od->single_doc_dir, od->single_doc_key.word(2)); + /* INKqa07123. + A directory entry which is nolonger valid may have been overwritten. + We need to start afresh from the beginning by setting last_collision + to NULL. + */ + if (!dir_valid(vol, &dir)) { + DDebug("cache_write", + "OpenReadStartDone: Dir not valid: Write Head: %lld, Dir: %"PRId64, + (long long)offset_to_vol_offset(vol, vol->header->write_pos), dir_offset(&dir)); + last_collision = NULL; + goto Lcollision; + } + if (!(doc->first_key == first_key)) + goto Lcollision; + if (doc->magic != DOC_MAGIC) { + err = ECACHE_BAD_META_DATA; + goto Lfailure; + } + if (!doc->hlen) { + err = ECACHE_BAD_META_DATA; + goto Lfailure; + } + ink_assert((((uintptr_t) &doc->hdr()[0]) & HDR_PTR_ALIGNMENT_MASK) == 0); + + if (write_vector->get_handles(doc->hdr(), doc->hlen, buf) != doc->hlen) { + err = ECACHE_BAD_META_DATA; + goto Lfailure; + } + ink_debug_assert(write_vector->count() > 0); + od->first_dir = dir; + first_dir = dir; + if (doc->single_fragment()) { + // fragment is tied to the vector + od->move_resident_alt = 1; + od->single_doc_key = doc->key; + dir_assign(&od->single_doc_dir, &dir); + dir_set_tag(&od->single_doc_dir, od->single_doc_key.word(2)); + } + first_buf = buf; + goto Lsuccess; } - first_buf = buf; - goto Lsuccess; - } Lcollision: - { int if_writers = ((uintptr_t) info == CACHE_ALLOW_MULTIPLE_WRITES); - CACHE_TRY_LOCK(lock, vol->mutex, mutex->thread_holding); - if (!lock) - VC_LOCK_RETRY_EVENT(); if (!od) { if ((err = vol->open_write( - this, if_writers, cache_config_http_max_alts > 1 ? cache_config_http_max_alts : 0)) > 0) + this, if_writers, cache_config_http_max_alts > 1 ? cache_config_http_max_alts : 0)) > 0) goto Lfailure; if (od->has_multiple_writers()) { MUTEX_RELEASE(lock); http://git-wip-us.apache.org/repos/asf/trafficserver/blob/1f66ef61/iocore/net/UnixNetVConnection.cc ---------------------------------------------------------------------- diff --git a/iocore/net/UnixNetVConnection.cc b/iocore/net/UnixNetVConnection.cc index b59294b..30ed932 100644 --- a/iocore/net/UnixNetVConnection.cc +++ b/iocore/net/UnixNetVConnection.cc @@ -986,7 +986,9 @@ UnixNetVConnection::mainEvent(int event, Event *e) MUTEX_TRY_LOCK(rlock, read.vio.mutex ? (ProxyMutex *) read.vio.mutex : (ProxyMutex *) e->ethread->mutex, e->ethread); MUTEX_TRY_LOCK(wlock, write.vio.mutex ? (ProxyMutex *) write.vio.mutex : (ProxyMutex *) e->ethread->mutex, e->ethread); - if (!hlock || !rlock || !wlock) { + if (!hlock || !rlock || !wlock || + (read.vio.mutex.m_ptr && rlock.m.m_ptr != read.vio.mutex.m_ptr) || + (write.vio.mutex.m_ptr && wlock.m.m_ptr != write.vio.mutex.m_ptr)) { #ifndef INACTIVITY_TIMEOUT if (e == active_timeout) #endif
