TS-2964: Make URL hash run time selectable.
Project: http://git-wip-us.apache.org/repos/asf/trafficserver/repo Commit: http://git-wip-us.apache.org/repos/asf/trafficserver/commit/2ac12c4a Tree: http://git-wip-us.apache.org/repos/asf/trafficserver/tree/2ac12c4a Diff: http://git-wip-us.apache.org/repos/asf/trafficserver/diff/2ac12c4a Branch: refs/heads/master Commit: 2ac12c4a2770600743d12964f4b998ba38b05116 Parents: 4268793 Author: Alan M. Carroll <[email protected]> Authored: Mon Jul 28 10:39:21 2014 -0500 Committer: Alan M. Carroll <[email protected]> Committed: Fri Aug 1 09:24:33 2014 -0500 ---------------------------------------------------------------------- iocore/cache/Cache.cc | 72 ++--- iocore/cache/CacheDir.cc | 112 +++---- iocore/cache/CacheHosting.cc | 4 +- iocore/cache/CacheHttp.cc | 2 +- iocore/cache/CachePages.cc | 8 +- iocore/cache/CacheRead.cc | 60 ++-- iocore/cache/CacheTest.cc | 4 +- iocore/cache/CacheVol.cc | 2 +- iocore/cache/CacheWrite.cc | 58 ++-- iocore/cache/P_CacheDir.h | 4 +- iocore/cache/P_CacheHosting.h | 4 +- iocore/cache/P_CacheInternal.h | 12 +- iocore/cache/P_CacheVol.h | 50 +-- iocore/cache/RamCacheCLFUS.cc | 46 +-- iocore/cache/RamCacheLRU.cc | 22 +- iocore/hostdb/HostDB.cc | 3 +- lib/ts/CryptoHash.h | 124 ++++++++ lib/ts/INK_MD5.h | 139 +-------- lib/ts/MMH.cc | 588 ++++++++++++++++++++++++++++++++++++ lib/ts/MMH.h | 119 ++++++++ lib/ts/Makefile.am | 3 + lib/ts/ink_code.cc | 37 ++- lib/ts/ink_code.h | 3 +- lib/ts/libts.h | 1 + proxy/InkAPI.cc | 11 +- proxy/Prefetch.cc | 8 +- proxy/Update.cc | 3 +- proxy/hdrs/URL.cc | 82 ++--- proxy/hdrs/URL.h | 41 ++- proxy/http/HttpServerSession.h | 2 +- proxy/logging/LogFormat.cc | 12 +- proxy/logging/LogObject.cc | 7 +- 32 files changed, 1208 insertions(+), 435 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/trafficserver/blob/2ac12c4a/iocore/cache/Cache.cc ---------------------------------------------------------------------- diff --git a/iocore/cache/Cache.cc b/iocore/cache/Cache.cc index 03a3650..7d4a8f1 100644 --- a/iocore/cache/Cache.cc +++ b/iocore/cache/Cache.cc @@ -116,7 +116,7 @@ ClassAllocator<EvacuationBlock> evacuationBlockAllocator("evacuationBlock"); ClassAllocator<CacheRemoveCont> cacheRemoveContAllocator("cacheRemoveCont"); ClassAllocator<EvacuationKey> evacuationKeyAllocator("evacuationKey"); int CacheVC::size_to_init = -1; -CacheKey zero_key(0, 0); +CacheKey zero_key; #if TS_USE_INTERIM_CACHE == 1 ClassAllocator<MigrateToInterimCache> migrateToInterimCacheAllocator("migrateToInterimCache"); #endif @@ -1114,7 +1114,7 @@ int Vol::db_check(bool /* fix ATS_UNUSED */ ) { char tt[256]; - printf(" Data for [%s]\n", hash_id); + printf(" Data for [%s]\n", hash_text); printf(" Length: %" PRIu64 "\n", (uint64_t)len); printf(" Write Position: %" PRIu64 "\n", (uint64_t) (header->write_pos - skip)); printf(" Phase: %d\n", (int)!!header->phase); @@ -1212,7 +1212,7 @@ vol_dir_clear(Vol *d) vol_clear_init(d); if (pwrite(d->fd, d->raw_dir, dir_len, d->skip) < 0) { - Warning("unable to clear cache directory '%s'", d->hash_id); + Warning("unable to clear cache directory '%s'", d->hash_text); return -1; } return 0; @@ -1242,13 +1242,13 @@ Vol::init(char *s, off_t blocks, off_t dir_skip, bool clear) { dir_skip = ROUND_TO_STORE_BLOCK((dir_skip < START_POS ? START_POS : dir_skip)); path = ats_strdup(s); - const size_t hash_id_size = strlen(s) + 32; - hash_id = (char *)ats_malloc(hash_id_size); - ink_strlcpy(hash_id, s, hash_id_size); + const size_t hash_text_size = strlen(s) + 32; + hash_text = (char *)ats_malloc(hash_text_size); + ink_strlcpy(hash_text, s, hash_text_size); const size_t s_size = strlen(s); - snprintf(hash_id + s_size, (hash_id_size - s_size), " %" PRIu64 ":%" PRIu64 "", + snprintf(hash_text + s_size, (hash_text_size - s_size), " %" PRIu64 ":%" PRIu64 "", (uint64_t)dir_skip, (uint64_t)blocks); - hash_id_md5.encodeBuffer(hash_id, strlen(hash_id)); + MD5Context().hash_immediate(hash_id, hash_text, strlen(hash_text)); len = blocks * STORE_BLOCK_SIZE; ink_assert(len <= MAX_VOL_SIZE); skip = dir_skip; @@ -1286,7 +1286,7 @@ Vol::init(char *s, off_t blocks, off_t dir_skip, bool clear) #endif if (clear) { - Note("clearing cache directory '%s'", hash_id); + Note("clearing cache directory '%s'", hash_text); return clear_dir(); } @@ -1296,7 +1296,7 @@ Vol::init(char *s, off_t blocks, off_t dir_skip, bool clear) // try A off_t as = skip; if (is_debug_tag_set("cache_init")) - Note("reading directory '%s'", hash_id); + Note("reading directory '%s'", hash_text); SET_HANDLER(&Vol::handle_header_read); init_info->vol_aio[0].aiocb.aio_offset = as; init_info->vol_aio[1].aiocb.aio_offset = as + footer_offset; @@ -1330,7 +1330,7 @@ Vol::handle_dir_clear(int event, void *data) if (event == AIO_EVENT_DONE) { op = (AIOCallback *) data; if ((size_t) op->aio_result != (size_t) op->aiocb.aio_nbytes) { - Warning("unable to clear cache directory '%s'", hash_id); + Warning("unable to clear cache directory '%s'", hash_text); fd = -1; } @@ -1364,8 +1364,8 @@ Vol::handle_dir_read(int event, void *data) } if (header->magic != VOL_MAGIC || header->version.ink_major != CACHE_DB_MAJOR_VERSION || footer->magic != VOL_MAGIC) { - Warning("bad footer in cache directory for '%s', clearing", hash_id); - Note("clearing cache directory '%s'", hash_id); + Warning("bad footer in cache directory for '%s', clearing", hash_text); + Note("clearing cache directory '%s'", hash_text); clear_dir(); return EVENT_DONE; } @@ -1461,7 +1461,7 @@ Vol::handle_recover_from_data(int event, void * /* data ATS_UNUSED */ ) io.aiocb.aio_nbytes = (skip + len) - recover_pos; } else if (event == AIO_EVENT_DONE) { if ((size_t) io.aiocb.aio_nbytes != (size_t) io.aio_result) { - Warning("disk read error on recover '%s', clearing", hash_id); + Warning("disk read error on recover '%s', clearing", hash_text); goto Lclear; } if (io.aiocb.aio_offset == header->last_write_pos) { @@ -1478,7 +1478,7 @@ Vol::handle_recover_from_data(int event, void * /* data ATS_UNUSED */ ) while (done < to_check) { Doc *doc = (Doc *) (s + done); if (doc->magic != DOC_MAGIC || doc->write_serial > header->write_serial) { - Warning("no valid directory found while recovering '%s', clearing", hash_id); + Warning("no valid directory found while recovering '%s', clearing", hash_text); goto Lclear; } done += round_to_approx_size(doc->len); @@ -1621,7 +1621,7 @@ Ldone:{ recover_pos += EVACUATION_SIZE; // safely cover the max write size if (recover_pos < header->write_pos && (recover_pos + EVACUATION_SIZE >= header->write_pos)) { Debug("cache_init", "Head Pos: %" PRIu64 ", Rec Pos: %" PRIu64 ", Wrapped:%d", header->write_pos, recover_pos, recover_wrapped); - Warning("no valid directory found while recovering '%s', clearing", hash_id); + Warning("no valid directory found while recovering '%s', clearing", hash_text); goto Lclear; } @@ -1728,7 +1728,7 @@ Vol::handle_header_read(int event, void *data) (hf[0]->sync_serial >= hf[2]->sync_serial || hf[2]->sync_serial != hf[3]->sync_serial)) { SET_HANDLER(&Vol::handle_dir_read); if (is_debug_tag_set("cache_init")) - Note("using directory A for '%s'", hash_id); + Note("using directory A for '%s'", hash_text); io.aiocb.aio_offset = skip; ink_assert(ink_aio_read(&io)); } @@ -1737,11 +1737,11 @@ Vol::handle_header_read(int event, void *data) SET_HANDLER(&Vol::handle_dir_read); if (is_debug_tag_set("cache_init")) - Note("using directory B for '%s'", hash_id); + Note("using directory B for '%s'", hash_text); io.aiocb.aio_offset = skip + vol_dirlen(this); ink_assert(ink_aio_read(&io)); } else { - Note("no good directory, clearing '%s'", hash_id); + Note("no good directory, clearing '%s'", hash_text); clear_dir(); delete init_info; init_info = 0; @@ -1796,7 +1796,7 @@ InterimCacheVol::handle_recover_from_data(int event, void *data) if (event == EVENT_IMMEDIATE) { if (header->magic != VOL_MAGIC || header->version.ink_major != CACHE_DB_MAJOR_VERSION) { - Warning("bad header in cache directory for '%s', clearing", hash_id); + Warning("bad header in cache directory for '%s', clearing", hash_text); goto Lclear; } else if (header->sync_serial == 0) { io.aiocb.aio_buf = NULL; @@ -1820,7 +1820,7 @@ InterimCacheVol::handle_recover_from_data(int event, void *data) } else if (event == AIO_EVENT_DONE) { if ((size_t) io.aiocb.aio_nbytes != (size_t) io.aio_result) { - Warning("disk read error on recover '%s', clearing", hash_id); + Warning("disk read error on recover '%s', clearing", hash_text); goto Lclear; } @@ -1832,7 +1832,7 @@ InterimCacheVol::handle_recover_from_data(int event, void *data) while (done < to_check) { Doc *doc = (Doc *) (s + done); if (doc->magic != DOC_MAGIC || doc->write_serial > header->write_serial) { - Warning("no valid directory found while recovering '%s', clearing", hash_id); + Warning("no valid directory found while recovering '%s', clearing", hash_text); goto Lclear; } done += round_to_approx_size(doc->len); @@ -1939,7 +1939,7 @@ Ldone: { recover_pos += EVACUATION_SIZE; if (recover_pos < header->write_pos && (recover_pos + EVACUATION_SIZE >= header->write_pos)) { Debug("cache_init", "Head Pos: %" PRIu64 ", Rec Pos: %" PRIu64 ", Wrapped:%d", header->write_pos, recover_pos, recover_wrapped); - Warning("no valid directory found while recovering '%s', clearing", hash_id); + Warning("no valid directory found while recovering '%s', clearing", hash_text); goto Lclear; } @@ -2063,7 +2063,7 @@ build_vol_hash_table(CacheHostRecord *cp) forvol[i % num_vols]++; // seed random number generator for (int i = 0; i < num_vols; i++) { - uint64_t x = p[i]->hash_id_md5.fold(); + uint64_t x = p[i]->hash_id.fold(); rnd[i] = (unsigned int) x; } // initialize table to "empty" @@ -2365,7 +2365,7 @@ CacheVC::handleReadDone(int event, Event *e) if (!io.ok()) { Debug("cache_disk_error", "Read error on disk %s\n \ read range : [%" PRIu64 " - %" PRIu64 " bytes] [%" PRIu64 " - %" PRIu64 " blocks] \n", - vol->hash_id, (uint64_t)io.aiocb.aio_offset, (uint64_t)io.aiocb.aio_offset + io.aiocb.aio_nbytes, + vol->hash_text, (uint64_t)io.aiocb.aio_offset, (uint64_t)io.aiocb.aio_offset + io.aiocb.aio_nbytes, (uint64_t)io.aiocb.aio_offset / 512, (uint64_t)(io.aiocb.aio_offset + io.aiocb.aio_nbytes) / 512); } goto Ldone; @@ -2638,7 +2638,7 @@ LmemHit: } Action * -Cache::lookup(Continuation *cont, CacheKey *key, CacheFragType type, char *hostname, int host_len) +Cache::lookup(Continuation *cont, CacheKey *key, CacheFragType type, char const* hostname, int host_len) { if (!CacheProcessor::IsCacheReady(type)) { cont->handleEvent(CACHE_EVENT_LOOKUP_FAILED, 0); @@ -2667,12 +2667,12 @@ Cache::lookup(Continuation *cont, CacheKey *key, CacheFragType type, char *hostn Action * Cache::lookup(Continuation *cont, CacheURL *url, CacheFragType type) { - INK_MD5 md5; + CryptoHash id; - url->MD5_get(&md5); + url->hash_get(&id); int len = 0; - const char *hostname = url->host_get(&len); - return lookup(cont, &md5, type, (char *) hostname, len); + char const* hostname = url->host_get(&len); + return lookup(cont, &id, type, hostname, len); } int @@ -3241,9 +3241,9 @@ rebuild_host_table(Cache *cache) // if generic_host_rec.vols == NULL, what do we do??? Vol * -Cache::key_to_vol(CacheKey *key, char *hostname, int host_len) +Cache::key_to_vol(CacheKey *key, char const* hostname, int host_len) { - uint32_t h = (key->word(2) >> DIR_TAG_WIDTH) % VOL_HASH_TABLE_SIZE; + uint32_t h = (key->slice32(2) >> DIR_TAG_WIDTH) % VOL_HASH_TABLE_SIZE; unsigned short *hash_table = hosttable->gen_host_rec.vol_hash_table; CacheHostRecord *host_rec = &hosttable->gen_host_rec; @@ -3487,23 +3487,23 @@ CacheProcessor::open_write(Continuation *cont, int expected_size, URL *url, bool Action * CacheProcessor::remove(Continuation *cont, URL *url, bool cluster_cache_local, CacheFragType frag_type) { - INK_MD5 md5; + CryptoHash id; int len = 0; const char *hostname; - url->MD5_get(&md5); + url->hash_get(&id); hostname = url->host_get(&len); Debug("cache_remove", "[CacheProcessor::remove] Issuing cache delete for %s", url->string_get_ref()); #ifdef CLUSTER_CACHE if (cache_clustering_enabled > 0 && !cluster_cache_local) { // Remove from cluster - return remove(cont, &md5, cluster_cache_local, frag_type, true, false, const_cast<char *>(hostname), len); + return remove(cont, &id, cluster_cache_local, frag_type, true, false, const_cast<char *>(hostname), len); } #endif // Remove from local cache only. - return caches[frag_type]->remove(cont, &md5, frag_type, true, false, const_cast<char*>(hostname), len); + return caches[frag_type]->remove(cont, &id, frag_type, true, false, const_cast<char*>(hostname), len); } CacheDisk* http://git-wip-us.apache.org/repos/asf/trafficserver/blob/2ac12c4a/iocore/cache/CacheDir.cc ---------------------------------------------------------------------- diff --git a/iocore/cache/CacheDir.cc b/iocore/cache/CacheDir.cc index ba0fddc..18b3be6 100644 --- a/iocore/cache/CacheDir.cc +++ b/iocore/cache/CacheDir.cc @@ -69,7 +69,7 @@ int OpenDir::open_write(CacheVC *cont, int allow_if_writers, int max_writers) { ink_assert(cont->vol->mutex->thread_holding == this_ethread()); - unsigned int h = cont->first_key.word(0); + unsigned int h = cont->first_key.slice32(0); int b = h % OPEN_DIR_BUCKETS; for (OpenDirEntry *d = bucket[b].head; d; d = d->link.next) { if (!(d->writers.head->first_key == cont->first_key)) @@ -133,7 +133,7 @@ OpenDir::close_write(CacheVC *cont) cont->od->writers.remove(cont); cont->od->num_writers--; if (!cont->od->writers.head) { - unsigned int h = cont->first_key.word(0); + unsigned int h = cont->first_key.slice32(0); int b = h % OPEN_DIR_BUCKETS; bucket[b].remove(cont->od); delayed_readers.append(cont->od->readers); @@ -148,7 +148,7 @@ OpenDir::close_write(CacheVC *cont) OpenDirEntry * OpenDir::open_read(INK_MD5 *key) { - unsigned int h = key->word(0); + unsigned int h = key->slice32(0); int b = h % OPEN_DIR_BUCKETS; for (OpenDirEntry *d = bucket[b].head; d; d = d->link.next) if (d->writers.head->first_key == *key) @@ -591,8 +591,8 @@ int dir_probe(CacheKey *key, Vol *d, Dir *result, Dir ** last_collision) { ink_assert(d->mutex->thread_holding == this_ethread()); - int s = key->word(0) % d->segments; - int b = key->word(1) % d->buckets; + int s = key->slice32(0) % d->segments; + int b = key->slice32(1) % d->buckets; Dir *seg = dir_segment(s, d); Dir *e = NULL, *p = NULL, *collision = *last_collision; Vol *vol = d; @@ -624,7 +624,7 @@ Lagain: goto Lcont; } if (dir_valid(d, e)) { - DDebug("dir_probe_hit", "found %X %X vol %d bucket %d boffset %" PRId64 "", key->word(0), key->word(1), d->fd, b, dir_offset(e)); + DDebug("dir_probe_hit", "found %X %X vol %d bucket %d boffset %" PRId64 "", key->slice32(0), key->slice32(1), d->fd, b, dir_offset(e)); dir_assign(result, e); *last_collision = e; #if !TS_USE_INTERIM_CACHE @@ -637,7 +637,7 @@ Lagain: continue; } } else - DDebug("dir_probe_tag", "tag mismatch %p %X vs expected %X", e, dir_tag(e), key->word(3)); + DDebug("dir_probe_tag", "tag mismatch %p %X vs expected %X", e, dir_tag(e), key->slice32(3)); Lcont: p = e; e = next_dir(e, seg); @@ -648,7 +648,7 @@ Lagain: collision = NULL; goto Lagain; } - DDebug("dir_probe_miss", "missed %X %X on vol %d bucket %d at %p", key->word(0), key->word(1), d->fd, b, seg); + DDebug("dir_probe_miss", "missed %X %X on vol %d bucket %d at %p", key->slice32(0), key->slice32(1), d->fd, b, seg); CHECK_DIR(d); return 0; } @@ -657,15 +657,15 @@ int dir_insert(CacheKey *key, Vol *d, Dir *to_part) { ink_assert(d->mutex->thread_holding == this_ethread()); - int s = key->word(0) % d->segments, l; - int bi = key->word(1) % d->buckets; + int s = key->slice32(0) % d->segments, l; + int bi = key->slice32(1) % d->buckets; ink_assert(dir_approx_size(to_part) <= MAX_FRAG_SIZE + sizeofDoc); Dir *seg = dir_segment(s, d); Dir *e = NULL; Dir *b = dir_bucket(bi, seg); Vol *vol = d; #if defined(DEBUG) && defined(DO_CHECK_DIR_FAST) - unsigned int t = DIR_MASK_TAG(key->word(2)); + unsigned int t = DIR_MASK_TAG(key->slice32(2)); Dir *col = b; while (col) { ink_assert((dir_tag(col) != t) || (dir_offset(col) != dir_offset(to_part))); @@ -700,15 +700,15 @@ Llink: Lfill: #if TS_USE_INTERIM_CACHE == 1 dir_assign_data(b, to_part); - dir_set_tag(b, key->word(2)); + dir_set_tag(b, key->slice32(2)); #else dir_assign_data(e, to_part); - dir_set_tag(e, key->word(2)); + dir_set_tag(e, key->slice32(2)); ink_assert(vol_offset(d, e) < (d->skip + d->len)); #endif DDebug("dir_insert", "insert %p %X into vol %d bucket %d at %p tag %X %X boffset %" PRId64 "", - e, key->word(0), d->fd, bi, e, key->word(1), dir_tag(e), dir_offset(e)); + e, key->slice32(0), d->fd, bi, e, key->slice32(1), dir_tag(e), dir_offset(e)); CHECK_DIR(d); d->header->dirty = 1; CACHE_INC_DIR_USED(d->mutex); @@ -719,12 +719,12 @@ int dir_overwrite(CacheKey *key, Vol *d, Dir *dir, Dir *overwrite, bool must_overwrite) { ink_assert(d->mutex->thread_holding == this_ethread()); - int s = key->word(0) % d->segments, l; - int bi = key->word(1) % d->buckets; + int s = key->slice32(0) % d->segments, l; + int bi = key->slice32(1) % d->buckets; Dir *seg = dir_segment(s, d); Dir *e = NULL; Dir *b = dir_bucket(bi, seg); - unsigned int t = DIR_MASK_TAG(key->word(2)); + unsigned int t = DIR_MASK_TAG(key->slice32(2)); int res = 1; #ifdef LOOP_CHECK_MODE int loop_count = 0; @@ -786,7 +786,7 @@ Lfill: ink_assert(vol_offset(d, e) < d->skip + d->len); DDebug("dir_overwrite", "overwrite %p %X into vol %d bucket %d at %p tag %X %X boffset %" PRId64 "", - e, key->word(0), d->fd, bi, e, t, dir_tag(e), dir_offset(e)); + e, key->slice32(0), d->fd, bi, e, t, dir_tag(e), dir_offset(e)); CHECK_DIR(d); d->header->dirty = 1; return res; @@ -796,8 +796,8 @@ int dir_delete(CacheKey *key, Vol *d, Dir *del) { ink_assert(d->mutex->thread_holding == this_ethread()); - int s = key->word(0) % d->segments; - int b = key->word(1) % d->buckets; + int s = key->slice32(0) % d->segments; + int b = key->slice32(1) % d->buckets; Dir *seg = dir_segment(s, d); Dir *e = NULL, *p = NULL; #ifdef LOOP_CHECK_MODE @@ -839,13 +839,13 @@ int dir_lookaside_probe(CacheKey *key, Vol *d, Dir *result, EvacuationBlock ** eblock) { ink_assert(d->mutex->thread_holding == this_ethread()); - int i = key->word(3) % LOOKASIDE_SIZE; + int i = key->slice32(3) % LOOKASIDE_SIZE; EvacuationBlock *b = d->lookaside[i].head; while (b) { if (b->evac_frags.key == *key) { if (dir_valid(d, &b->new_dir)) { *result = b->new_dir; - DDebug("dir_lookaside", "probe %X success", key->word(0)); + DDebug("dir_lookaside", "probe %X success", key->slice32(0)); if (eblock) *eblock = b; return 1; @@ -853,7 +853,7 @@ dir_lookaside_probe(CacheKey *key, Vol *d, Dir *result, EvacuationBlock ** ebloc } b = b->link.next; } - DDebug("dir_lookaside", "probe %X failed", key->word(0)); + DDebug("dir_lookaside", "probe %X failed", key->slice32(0)); return 0; } @@ -861,9 +861,9 @@ int dir_lookaside_insert(EvacuationBlock *eblock, Vol *d, Dir *to) { CacheKey *key = &eblock->evac_frags.earliest_key; - DDebug("dir_lookaside", "insert %X %X, offset %d phase %d", key->word(0), key->word(1), (int) dir_offset(to), (int) dir_phase(to)); + DDebug("dir_lookaside", "insert %X %X, offset %d phase %d", key->slice32(0), key->slice32(1), (int) dir_offset(to), (int) dir_phase(to)); ink_assert(d->mutex->thread_holding == this_ethread()); - int i = key->word(3) % LOOKASIDE_SIZE; + int i = key->slice32(3) % LOOKASIDE_SIZE; EvacuationBlock *b = new_EvacuationBlock(d->mutex->thread_holding); b->evac_frags.key = *key; b->evac_frags.earliest_key = *key; @@ -879,13 +879,13 @@ int dir_lookaside_fixup(CacheKey *key, Vol *d) { ink_assert(d->mutex->thread_holding == this_ethread()); - int i = key->word(3) % LOOKASIDE_SIZE; + int i = key->slice32(3) % LOOKASIDE_SIZE; EvacuationBlock *b = d->lookaside[i].head; while (b) { if (b->evac_frags.key == *key) { int res = dir_overwrite(key, d, &b->new_dir, &b->dir, false); DDebug("dir_lookaside", "fixup %X %X offset %" PRId64" phase %d %d", - key->word(0), key->word(1), dir_offset(&b->new_dir), dir_phase(&b->new_dir), res); + key->slice32(0), key->slice32(1), dir_offset(&b->new_dir), dir_phase(&b->new_dir), res); #if TS_USE_INTERIM_CACHE == 1 int64_t o = dir_get_offset(&b->dir), n = dir_get_offset(&b->new_dir); #else @@ -898,7 +898,7 @@ dir_lookaside_fixup(CacheKey *key, Vol *d) } b = b->link.next; } - DDebug("dir_lookaside", "fixup %X %X failed", key->word(0), key->word(1)); + DDebug("dir_lookaside", "fixup %X %X failed", key->slice32(0), key->slice32(1)); return 0; } @@ -912,7 +912,7 @@ dir_lookaside_cleanup(Vol *d) if (!dir_valid(d, &b->new_dir)) { EvacuationBlock *nb = b->link.next; DDebug("dir_lookaside", "cleanup %X %X cleaned up", - b->evac_frags.earliest_key.word(0), b->evac_frags.earliest_key.word(1)); + b->evac_frags.earliest_key.slice32(0), b->evac_frags.earliest_key.slice32(1)); d->lookaside[i].remove(b); free_CacheVC(b->earliest_evacuator); free_EvacuationBlock(b, d->mutex->thread_holding); @@ -929,19 +929,19 @@ void dir_lookaside_remove(CacheKey *key, Vol *d) { ink_assert(d->mutex->thread_holding == this_ethread()); - int i = key->word(3) % LOOKASIDE_SIZE; + int i = key->slice32(3) % LOOKASIDE_SIZE; EvacuationBlock *b = d->lookaside[i].head; while (b) { if (b->evac_frags.key == *key) { DDebug("dir_lookaside", "remove %X %X offset %" PRId64" phase %d", - key->word(0), key->word(1), dir_offset(&b->new_dir), dir_phase(&b->new_dir)); + key->slice32(0), key->slice32(1), dir_offset(&b->new_dir), dir_phase(&b->new_dir)); d->lookaside[i].remove(b); free_EvacuationBlock(b, d->mutex->thread_holding); return; } b = b->link.next; } - DDebug("dir_lookaside", "remove %X %X failed", key->word(0), key->word(1)); + DDebug("dir_lookaside", "remove %X %X failed", key->slice32(0), key->slice32(1)); return; } @@ -1015,13 +1015,13 @@ sync_cache_dir_on_shutdown(void) Vol *d = gvol[i]; if (DISK_BAD(d->disk)) { - Debug("cache_dir_sync", "Dir %s: ignoring -- bad disk", d->hash_id); + Debug("cache_dir_sync", "Dir %s: ignoring -- bad disk", d->hash_text); continue; } size_t dirlen = vol_dirlen(d); ink_assert(dirlen > 0); // make clang happy - if not > 0 the vol is seriously messed up if (!d->header->dirty && !d->dir_sync_in_progress) { - Debug("cache_dir_sync", "Dir %s: ignoring -- not dirty", d->hash_id); + Debug("cache_dir_sync", "Dir %s: ignoring -- not dirty", d->hash_text); continue; } // recompute hit_evacuate_window @@ -1032,7 +1032,7 @@ sync_cache_dir_on_shutdown(void) // dont worry about the cachevc s in the agg queue // directories have not been inserted for these writes if (d->agg_buf_pos) { - Debug("cache_dir_sync", "Dir %s: flushing agg buffer first", d->hash_id); + Debug("cache_dir_sync", "Dir %s: flushing agg buffer first", d->hash_text); // set write limit d->header->agg_pos = d->header->write_pos + d->agg_buf_pos; @@ -1054,7 +1054,7 @@ sync_cache_dir_on_shutdown(void) for (int i = 0; i < d->num_interim_vols; i++) { InterimCacheVol *sv = &(d->interim_vols[i]); if (sv->agg_buf_pos) { - Debug("cache_dir_sync", "Dir %s: flushing agg buffer first to interim", d->hash_id); + Debug("cache_dir_sync", "Dir %s: flushing agg buffer first to interim", d->hash_text); sv->header->agg_pos = sv->header->write_pos + sv->agg_buf_pos; int r = pwrite(sv->fd, sv->agg_buffer, sv->agg_buf_pos, sv->header->write_pos); @@ -1096,7 +1096,7 @@ sync_cache_dir_on_shutdown(void) off_t start = d->skip + (B ? dirlen : 0); B = pwrite(d->fd, buf, dirlen, start); ink_assert(B == dirlen); - Debug("cache_dir_sync", "done syncing dir for vol %s", d->hash_id); + Debug("cache_dir_sync", "done syncing dir for vol %s", d->hash_text); } Debug("cache_dir_sync", "sync done"); if (buf) @@ -1131,7 +1131,7 @@ Lrestart: if (event == AIO_EVENT_DONE) { // AIO Thread if (io.aio_result != (int64_t)io.aiocb.aio_nbytes) { - Warning("vol write error during directory sync '%s'", gvol[vol]->hash_id); + Warning("vol write error during directory sync '%s'", gvol[vol]->hash_text); event = EVENT_NONE; goto Ldone; } @@ -1164,11 +1164,11 @@ Lrestart: The dirty bit it set in dir_insert, dir_overwrite and dir_delete_entry */ if (!d->header->dirty) { - Debug("cache_dir_sync", "Dir %s not dirty", d->hash_id); + Debug("cache_dir_sync", "Dir %s not dirty", d->hash_text); goto Ldone; } if (d->is_io_in_progress() || d->agg_buf_pos) { - Debug("cache_dir_sync", "Dir %s: waiting for agg buffer", d->hash_id); + Debug("cache_dir_sync", "Dir %s: waiting for agg buffer", d->hash_text); d->dir_sync_waiting = 1; if (!d->is_io_in_progress()) d->aggWrite(EVENT_IMMEDIATE, 0); @@ -1182,7 +1182,7 @@ Lrestart: #endif return EVENT_CONT; } - Debug("cache_dir_sync", "pos: %" PRIu64 " Dir %s dirty...syncing to disk", d->header->write_pos, d->hash_id); + Debug("cache_dir_sync", "pos: %" PRIu64 " Dir %s dirty...syncing to disk", d->header->write_pos, d->hash_text); d->header->dirty = 0; if (buflen < dirlen) { if (buf) @@ -1276,7 +1276,7 @@ Vol::dir_check(bool /* fix ATS_UNUSED */) // TODO: we should eliminate this para free += dir_freelist_length(this, s); } int total = buckets * segments * DIR_DEPTH; - printf(" Directory for [%s]\n", hash_id); + printf(" Directory for [%s]\n", hash_text); printf(" Bytes: %d\n", total * SIZEOF_DIR); printf(" Segments: %" PRIu64 "\n", (uint64_t)segments); printf(" Buckets: %" PRIu64 "\n", (uint64_t)buckets); @@ -1446,7 +1446,7 @@ EXCLUSIVE_REGRESSION_TEST(Cache_dir) (RegressionTest *t, int /* atype ATS_UNUSED CacheKey key; rand_CacheKey(&key, thread->mutex); - int s = key.word(0) % d->segments, i, j; + int s = key.slice32(0) % d->segments, i, j; Dir *seg = dir_segment(s, d); // test insert @@ -1518,8 +1518,8 @@ EXCLUSIVE_REGRESSION_TEST(Cache_dir) (RegressionTest *t, int /* atype ATS_UNUSED #ifdef LOOP_CHECK_MODE // dir_probe in bucket with loop rand_CacheKey(&key, thread->mutex); - s1 = key.word(0) % d->segments; - b1 = key.word(1) % d->buckets; + s1 = key.slice32(0) % d->segments; + b1 = key.slice32(1) % d->buckets; dir_corrupt_bucket(dir_bucket(b1, dir_segment(s1, d)), s1, d); dir_insert(&key, d, &dir); Dir *last_collision = 0; @@ -1527,8 +1527,8 @@ EXCLUSIVE_REGRESSION_TEST(Cache_dir) (RegressionTest *t, int /* atype ATS_UNUSED rand_CacheKey(&key, thread->mutex); - s1 = key.word(0) % d->segments; - b1 = key.word(1) % d->buckets; + s1 = key.slice32(0) % d->segments; + b1 = key.slice32(1) % d->buckets; dir_corrupt_bucket(dir_bucket(b1, dir_segment(s1, d)), s1, d); last_collision = 0; @@ -1536,8 +1536,8 @@ EXCLUSIVE_REGRESSION_TEST(Cache_dir) (RegressionTest *t, int /* atype ATS_UNUSED // dir_overwrite in bucket with loop rand_CacheKey(&key, thread->mutex); - s1 = key.word(0) % d->segments; - b1 = key.word(1) % d->buckets; + s1 = key.slice32(0) % d->segments; + b1 = key.slice32(1) % d->buckets; CacheKey key1; key1.b[1] = 127; dir1 = dir; @@ -1550,23 +1550,23 @@ EXCLUSIVE_REGRESSION_TEST(Cache_dir) (RegressionTest *t, int /* atype ATS_UNUSED dir_overwrite(&key, d, &dir, &dir, 1); rand_CacheKey(&key, thread->mutex); - s1 = key.word(0) % d->segments; - b1 = key.word(1) % d->buckets; + s1 = key.slice32(0) % d->segments; + b1 = key.slice32(1) % d->buckets; key.b[1] = 23; dir_insert(&key, d, &dir1); dir_corrupt_bucket(dir_bucket(b1, dir_segment(s1, d)), s1, d); dir_overwrite(&key, d, &dir, &dir, 0); rand_CacheKey(&key, thread->mutex); - s1 = key.word(0) % d->segments; + s1 = key.slice32(0) % d->segments; Dir *seg1 = dir_segment(s1, d); // dir_freelist_length in freelist with loop dir_corrupt_bucket(dir_from_offset(d->header->freelist[s], seg1), s1, d); dir_freelist_length(d, s1); rand_CacheKey(&key, thread->mutex); - s1 = key.word(0) % d->segments; - b1 = key.word(1) % d->buckets; + s1 = key.slice32(0) % d->segments; + b1 = key.slice32(1) % d->buckets; // dir_bucket_length in bucket with loop dir_corrupt_bucket(dir_bucket(b1, dir_segment(s1, d)), s1, d); dir_bucket_length(dir_bucket(b1, dir_segment(s1, d)), s1, d); @@ -1575,8 +1575,8 @@ EXCLUSIVE_REGRESSION_TEST(Cache_dir) (RegressionTest *t, int /* atype ATS_UNUSED #else // test corruption detection rand_CacheKey(&key, thread->mutex); - s1 = key.word(0) % d->segments; - b1 = key.word(1) % d->buckets; + s1 = key.slice32(0) % d->segments; + b1 = key.slice32(1) % d->buckets; dir_insert(&key, d, &dir1); dir_insert(&key, d, &dir1); http://git-wip-us.apache.org/repos/asf/trafficserver/blob/2ac12c4a/iocore/cache/CacheHosting.cc ---------------------------------------------------------------------- diff --git a/iocore/cache/CacheHosting.cc b/iocore/cache/CacheHosting.cc index 2d2f3b2..3c7395b 100644 --- a/iocore/cache/CacheHosting.cc +++ b/iocore/cache/CacheHosting.cc @@ -101,7 +101,7 @@ CacheHostMatcher::AllocateSpace(int num_entries) // arg hostname // void -CacheHostMatcher::Match(char *rdata, int rlen, CacheHostResult * result) +CacheHostMatcher::Match(char const* rdata, int rlen, CacheHostResult * result) { void *opaque_ptr; @@ -233,7 +233,7 @@ CacheHostTable::Print() // Queries each table for the Result* // void -CacheHostTable::Match(char *rdata, int rlen, CacheHostResult * result) +CacheHostTable::Match(char const* rdata, int rlen, CacheHostResult * result) { hostMatch->Match(rdata, rlen, result); http://git-wip-us.apache.org/repos/asf/trafficserver/blob/2ac12c4a/iocore/cache/CacheHttp.cc ---------------------------------------------------------------------- diff --git a/iocore/cache/CacheHttp.cc b/iocore/cache/CacheHttp.cc index e07698c..6bcc4fc 100644 --- a/iocore/cache/CacheHttp.cc +++ b/iocore/cache/CacheHttp.cc @@ -154,7 +154,7 @@ CacheHTTPInfoVector::print(char *buffer, size_t buf_size, bool temps) if (temps || !(data[i].alternate.object_key_get() == zero_key)) { snprintf(p, buf_size, "[%d %s]", data[i].alternate.id_get(), - CacheKey(data[i].alternate.object_key_get()).string(buf)); + CacheKey(data[i].alternate.object_key_get()).toHexStr(buf)); tmp = strlen(p); p += tmp; buf_size -= tmp; http://git-wip-us.apache.org/repos/asf/trafficserver/blob/2ac12c4a/iocore/cache/CachePages.cc ---------------------------------------------------------------------- diff --git a/iocore/cache/CachePages.cc b/iocore/cache/CachePages.cc index 2f0e57a..c35f4f2 100644 --- a/iocore/cache/CachePages.cc +++ b/iocore/cache/CachePages.cc @@ -318,8 +318,8 @@ ShowCache::handleCacheEvent(int event, Event *e) { CHECK_SHOW(show("<P><TABLE border=1 width=100%%>")); CHECK_SHOW(show("<TR><TH bgcolor=\"#FFF0E0\" colspan=2>Doc</TH></TR>\n")); CHECK_SHOW(show("<TR><TD>Volume</td> <td>#%d - store='%s'</td></tr>\n", cache_vc->vol->cache_vol->vol_number, cache_vc->vol->path)); - CHECK_SHOW(show("<TR><TD>first key</td> <td>%s</td></tr>\n", d->first_key.string(tmpstr))); - CHECK_SHOW(show("<TR><TD>key</td> <td>%s</td></tr>\n", d->key.string(tmpstr))); + CHECK_SHOW(show("<TR><TD>first key</td> <td>%s</td></tr>\n", d->first_key.toHexStr(tmpstr))); + CHECK_SHOW(show("<TR><TD>key</td> <td>%s</td></tr>\n", d->key.toHexStr(tmpstr))); CHECK_SHOW(show("<tr><td>sync_serial</td><td>%lu</tr>\n", d->sync_serial)); CHECK_SHOW(show("<tr><td>write_serial</td><td>%lu</tr>\n", d->write_serial)); CHECK_SHOW(show("<tr><td>header length</td><td>%lu</tr>\n", d->hlen)); @@ -371,7 +371,7 @@ ShowCache::handleCacheEvent(int event, Event *e) { } while (!done); CHECK_SHOW(show("</PRE></td></tr>\n")); CHECK_SHOW(show("<tr><td>Size</td><td>%" PRId64 "</td>\n", obj_size)); - CHECK_SHOW(show("<tr><td>Key</td><td>%s</td>\n", obj_key.string(tmpstr))); + CHECK_SHOW(show("<tr><td>Key</td><td>%s</td>\n", obj_key.toHexStr(tmpstr))); t = obj->request_sent_time_get(); ink_ctime_r(&t, tmpstr); CHECK_SHOW(show("<tr><td>Request sent time</td><td>%s</td></tr>\n", tmpstr)); @@ -418,7 +418,7 @@ ShowCache::lookup_url(int event, Event *e) { url.parse(&s, s + strlen(s)); INK_MD5 md5; int len; - url.MD5_get(&md5); + url.hash_get(&md5); const char *hostname = url.host_get(&len); SET_HANDLER(&ShowCache::handleCacheEvent); Action *lookup_result = cacheProcessor.open_read(this, &md5, getClusterCacheLocal(&url, (char *)hostname), CACHE_FRAG_TYPE_HTTP, (char *) hostname, len); http://git-wip-us.apache.org/repos/asf/trafficserver/blob/2ac12c4a/iocore/cache/CacheRead.cc ---------------------------------------------------------------------- diff --git a/iocore/cache/CacheRead.cc b/iocore/cache/CacheRead.cc index e1e5542..5b3d071 100644 --- a/iocore/cache/CacheRead.cc +++ b/iocore/cache/CacheRead.cc @@ -256,14 +256,14 @@ CacheVC::openReadChooseWriter(int /* event ATS_UNUSED */, Event * /* e ATS_UNUSE } vector.clear(false); if (!write_vc) { - DDebug("cache_read_agg", "%p: key: %X writer alternate different: %d", this, first_key.word(1), alternate_index); + DDebug("cache_read_agg", "%p: key: %X writer alternate different: %d", this, first_key.slice32(1), alternate_index); od = NULL; return EVENT_RETURN; } DDebug("cache_read_agg", "%p: key: %X eKey: %d # alts: %d, ndx: %d, # writers: %d writer: %p", - this, first_key.word(1), write_vc->earliest_key.word(1), + this, first_key.slice32(1), write_vc->earliest_key.slice32(1), vector.count(), alternate_index, od->num_writers, write_vc); } #endif //HTTP_CACHE @@ -287,7 +287,7 @@ CacheVC::openReadFromWriter(int event, Event * e) } cancel_trigger(); intptr_t err = ECACHE_DOC_BUSY; - DDebug("cache_read_agg", "%p: key: %X In openReadFromWriter", this, first_key.word(1)); + DDebug("cache_read_agg", "%p: key: %X In openReadFromWriter", this, first_key.slice32(1)); #ifndef READ_WHILE_WRITER return openReadFromWriterFailure(CACHE_EVENT_OPEN_READ_FAILED, (Event *) -err); #else @@ -325,7 +325,7 @@ CacheVC::openReadFromWriter(int event, Event * e) if (writer_done()) { MUTEX_RELEASE(lock); DDebug("cache_read_agg", - "%p: key: %X writer %p has left, continuing as normal read", this, first_key.word(1), write_vc); + "%p: key: %X writer %p has left, continuing as normal read", this, first_key.slice32(1), write_vc); od = NULL; write_vc = NULL; SET_HANDLER(&CacheVC::openReadStartHead); @@ -353,13 +353,13 @@ CacheVC::openReadFromWriter(int event, Event * e) } DDebug("cache_read_agg", "%p: key: %X writer: closed:%d, fragment:%d, retry: %d", - this, first_key.word(1), write_vc->closed, write_vc->fragment, writer_lock_retry); + this, first_key.slice32(1), write_vc->closed, write_vc->fragment, writer_lock_retry); VC_SCHED_WRITER_RETRY(); } CACHE_TRY_LOCK(writer_lock, write_vc->mutex, mutex->thread_holding); if (!writer_lock) { - DDebug("cache_read_agg", "%p: key: %X lock miss", this, first_key.word(1)); + DDebug("cache_read_agg", "%p: key: %X lock miss", this, first_key.slice32(1)); VC_SCHED_LOCK_RETRY(); } MUTEX_RELEASE(lock); @@ -370,7 +370,7 @@ CacheVC::openReadFromWriter(int event, Event * e) if (frag_type == CACHE_FRAG_TYPE_HTTP) { DDebug("cache_read_agg", "%p: key: %X http passed stage 1, closed: %d, frag: %d", - this, first_key.word(1), write_vc->closed, write_vc->fragment); + this, first_key.slice32(1), write_vc->closed, write_vc->fragment); if (!write_vc->alternate.valid()) return openReadFromWriterFailure(CACHE_EVENT_OPEN_READ_FAILED, (Event *) - err); alternate.copy(&write_vc->alternate); @@ -386,7 +386,7 @@ CacheVC::openReadFromWriter(int event, Event * e) } else { key = write_vc->update_key; ink_assert(write_vc->closed); - DDebug("cache_read_agg", "%p: key: %X writer header update", this, first_key.word(1)); + DDebug("cache_read_agg", "%p: key: %X writer header update", this, first_key.slice32(1)); // Update case (b) : grab doc_len from the writer's alternate doc_len = alternate.object_size_get(); if (write_vc->update_key == cod->single_doc_key && @@ -417,7 +417,7 @@ CacheVC::openReadFromWriter(int event, Event * e) } } else { #endif //HTTP_CACHE - DDebug("cache_read_agg", "%p: key: %X non-http passed stage 1", this, first_key.word(1)); + DDebug("cache_read_agg", "%p: key: %X non-http passed stage 1", this, first_key.slice32(1)); key = write_vc->earliest_key; #ifdef HTTP_CACHE } @@ -427,7 +427,7 @@ CacheVC::openReadFromWriter(int event, Event * e) last_collision = NULL; DDebug("cache_read_agg", "%p: key: %X closed: %d, fragment: %d, len: %d starting first fragment", - this, first_key.word(1), write_vc->closed, write_vc->fragment, (int)doc_len); + this, first_key.slice32(1), write_vc->closed, write_vc->fragment, (int)doc_len); MUTEX_RELEASE(writer_lock); // either a header + body update or a new document SET_HANDLER(&CacheVC::openReadStartEarliest); @@ -444,7 +444,7 @@ CacheVC::openReadFromWriter(int event, Event * e) doc_len = write_vc->total_len; dir_clean(&first_dir); dir_clean(&earliest_dir); - DDebug("cache_read_agg", "%p: key: %X %X: single fragment read", this, first_key.word(1), key.word(0)); + DDebug("cache_read_agg", "%p: key: %X %X: single fragment read", this, first_key.slice32(1), key.slice32(0)); MUTEX_RELEASE(writer_lock); SET_HANDLER(&CacheVC::openReadFromWriterMain); CACHE_INCREMENT_DYN_STAT(cache_read_busy_success_stat); @@ -465,11 +465,11 @@ CacheVC::openReadFromWriterMain(int /* event ATS_UNUSED */, Event * /* e ATS_UNU if (ntodo <= 0) return EVENT_CONT; if (length < ((int64_t)doc_len) - vio.ndone) { - DDebug("cache_read_agg", "truncation %X", first_key.word(1)); + DDebug("cache_read_agg", "truncation %X", first_key.slice32(1)); if (is_action_tag_set("cache")) { ink_release_assert(false); } - Warning("Document %X truncated at %d of %d, reading from writer", first_key.word(1), (int)vio.ndone, (int)doc_len); + Warning("Document %X truncated at %d of %d, reading from writer", first_key.slice32(1), (int)vio.ndone, (int)doc_len); return calluser(VC_EVENT_ERROR); } /* its possible that the user did a do_io_close before @@ -544,9 +544,9 @@ CacheVC::openReadReadDone(int event, Event * e) if (doc->magic != DOC_MAGIC) { char tmpstring[100]; if (doc->magic == DOC_CORRUPT) - Warning("Middle: Doc checksum does not match for %s", key.string(tmpstring)); + Warning("Middle: Doc checksum does not match for %s", key.toHexStr(tmpstring)); else - Warning("Middle: Doc magic does not match for %s", key.string(tmpstring)); + Warning("Middle: Doc magic does not match for %s", key.toHexStr(tmpstring)); #if TS_USE_INTERIM_CACHE == 1 if (dir_ininterim(&dir)) { dir_delete(&key, vol, &dir); @@ -587,23 +587,23 @@ Lread: if (dir_offset(&dir) == dir_offset(&earliest_dir)) { #endif DDebug("cache_read_agg", "%p: key: %X ReadRead complete: %d", - this, first_key.word(1), (int)vio.ndone); + this, first_key.slice32(1), (int)vio.ndone); doc_len = vio.ndone; goto Ldone; } } DDebug("cache_read_agg", "%p: key: %X ReadRead writer aborted: %d", - this, first_key.word(1), (int)vio.ndone); + this, first_key.slice32(1), (int)vio.ndone); goto Lerror; } - DDebug("cache_read_agg", "%p: key: %X ReadRead retrying: %d", this, first_key.word(1), (int)vio.ndone); + DDebug("cache_read_agg", "%p: key: %X ReadRead retrying: %d", this, first_key.slice32(1), (int)vio.ndone); VC_SCHED_WRITER_RETRY(); // wait for writer } // fall through for truncated documents } Lerror: char tmpstring[100]; - Warning("Document %s truncated", earliest_key.string(tmpstring)); + Warning("Document %s truncated", earliest_key.toHexStr(tmpstring)); return calluser(VC_EVENT_ERROR); Ldone: return calluser(VC_EVENT_EOS); @@ -752,22 +752,22 @@ Lread: { while (dir_probe(&earliest_key, vol, &dir, &last_collision)) { if (dir_offset(&dir) == dir_offset(&earliest_dir)) { DDebug("cache_read_agg", "%p: key: %X ReadMain complete: %d", - this, first_key.word(1), (int)vio.ndone); + this, first_key.slice32(1), (int)vio.ndone); doc_len = vio.ndone; goto Leos; } } DDebug("cache_read_agg", "%p: key: %X ReadMain writer aborted: %d", - this, first_key.word(1), (int)vio.ndone); + this, first_key.slice32(1), (int)vio.ndone); goto Lerror; } - DDebug("cache_read_agg", "%p: key: %X ReadMain retrying: %d", this, first_key.word(1), (int)vio.ndone); + DDebug("cache_read_agg", "%p: key: %X ReadMain retrying: %d", this, first_key.slice32(1), (int)vio.ndone); SET_HANDLER(&CacheVC::openReadMain); VC_SCHED_WRITER_RETRY(); } if (is_action_tag_set("cache")) ink_release_assert(false); - Warning("Document %X truncated at %d of %d, missing fragment %X", first_key.word(1), (int)vio.ndone, (int)doc_len, key.word(1)); + Warning("Document %X truncated at %d of %d, missing fragment %X", first_key.slice32(1), (int)vio.ndone, (int)doc_len, key.slice32(1)); // remove the directory entry dir_delete(&earliest_key, vol, &earliest_dir); } @@ -815,9 +815,9 @@ CacheVC::openReadStartEarliest(int /* event ATS_UNUSED */, Event * /* e ATS_UNUS ink_release_assert(false); } if (doc->magic == DOC_CORRUPT) - Warning("Earliest: Doc checksum does not match for %s", key.string(tmpstring)); + Warning("Earliest: Doc checksum does not match for %s", key.toHexStr(tmpstring)); else - Warning("Earliest : Doc magic does not match for %s", key.string(tmpstring)); + Warning("Earliest : Doc magic does not match for %s", key.toHexStr(tmpstring)); // remove the dir entry dir_delete(&key, vol, &dir); // try going through the directory entries again @@ -911,7 +911,7 @@ Lread: od->move_resident_alt = 1; od->single_doc_key = doc1->key; dir_assign(&od->single_doc_dir, &dir); - dir_set_tag(&od->single_doc_dir, od->single_doc_key.word(2)); + dir_set_tag(&od->single_doc_dir, od->single_doc_key.slice32(2)); } SET_HANDLER(&CacheVC::openReadVecWrite); if ((ret = do_write_call()) == EVENT_RETURN) @@ -1031,9 +1031,9 @@ CacheVC::openReadStartHead(int event, Event * e) ink_release_assert(false); } if (doc->magic == DOC_CORRUPT) - Warning("Head: Doc checksum does not match for %s", key.string(tmpstring)); + Warning("Head: Doc checksum does not match for %s", key.toHexStr(tmpstring)); else - Warning("Head : Doc magic does not match for %s", key.string(tmpstring)); + Warning("Head : Doc magic does not match for %s", key.toHexStr(tmpstring)); // remove the dir entry dir_delete(&key, vol, &dir); // try going through the directory entries again @@ -1079,7 +1079,7 @@ CacheVC::openReadStartHead(int event, Event * e) "unmarshalled %d expecting %d in %d (base=%d, flen=%d) " "- vector n=%d size=%d" "first alt=%d[%s]" - , key.word(0) + , key.slice32(0) , uml, doc->hlen, doc->len, sizeofDoc, doc->_flen , vector.count(), alt_length , alt->m_magic @@ -1104,7 +1104,7 @@ CacheVC::openReadStartHead(int event, Event * e) alternate_tmp = vector.get(alternate_index); if (!alternate_tmp->valid()) { if (buf) { - Note("OpenReadHead failed for cachekey %X : alternate inconsistency", key.word(0)); + Note("OpenReadHead failed for cachekey %X : alternate inconsistency", key.slice32(0)); dir_delete(&key, vol, &dir); } goto Ldone; http://git-wip-us.apache.org/repos/asf/trafficserver/blob/2ac12c4a/iocore/cache/CacheTest.cc ---------------------------------------------------------------------- diff --git a/iocore/cache/CacheTest.cc b/iocore/cache/CacheTest.cc index 3c601ca..2bb1194 100644 --- a/iocore/cache/CacheTest.cc +++ b/iocore/cache/CacheTest.cc @@ -446,7 +446,7 @@ REGRESSION_TEST(cache_disk_replacement_stability)(RegressionTest *t, int level, vols[i].len = DEFAULT_STRIPE_SIZE; snprintf(buff, sizeof(buff), "/dev/sd%c %" PRIu64 ":%" PRIu64, 'a' + i, DEFAULT_SKIP, vols[i].len); - vols[i].hash_id_md5.encodeBuffer(buff, strlen(buff)); + MD5Context().hash_immediate(vols[i].hash_id, buff, strlen(buff)); } hr1.vol_hash_table = 0; @@ -462,7 +462,7 @@ REGRESSION_TEST(cache_disk_replacement_stability)(RegressionTest *t, int level, sample->len = 1024ULL * 1024 * 1024 * (1024+128); // 1.1 TB snprintf(buff, sizeof(buff), "/dev/sd%c %" PRIu64 ":%" PRIu64, 'a' + sample_idx, DEFAULT_SKIP, sample->len); - sample->hash_id_md5.encodeBuffer(buff, strlen(buff)); + MD5Context().hash_immediate(sample->hash_id, buff, strlen(buff)); build_vol_hash_table(&hr2); // See what the difference is http://git-wip-us.apache.org/repos/asf/trafficserver/blob/2ac12c4a/iocore/cache/CacheVol.cc ---------------------------------------------------------------------- diff --git a/iocore/cache/CacheVol.cc b/iocore/cache/CacheVol.cc index 9fb690c..07d6199 100644 --- a/iocore/cache/CacheVol.cc +++ b/iocore/cache/CacheVol.cc @@ -438,7 +438,7 @@ CacheVC::scanOpenWrite(int /* event ATS_UNUSED */, Event * /* e ATS_UNUSED */) dir_assign(&od->first_dir, &dir); if (doc->total_len) { dir_assign(&od->single_doc_dir, &dir); - dir_set_tag(&od->single_doc_dir, doc->key.word(2)); + dir_set_tag(&od->single_doc_dir, doc->key.slice32(2)); od->single_doc_key = doc->key; od->move_resident_alt = 1; } http://git-wip-us.apache.org/repos/asf/trafficserver/blob/2ac12c4a/iocore/cache/CacheWrite.cc ---------------------------------------------------------------------- diff --git a/iocore/cache/CacheWrite.cc b/iocore/cache/CacheWrite.cc index ee2160f..7108fde 100644 --- a/iocore/cache/CacheWrite.cc +++ b/iocore/cache/CacheWrite.cc @@ -42,7 +42,7 @@ get_alternate_index(CacheHTTPInfoVector *cache_vector, CacheKey key) for (int i = 0; i < alt_count; i++) { obj = cache_vector->get(i); if (obj->compare_object_key(&key)) { - // Debug("cache_key", "Resident alternate key %X", key.word(0)); + // Debug("cache_key", "Resident alternate key %X", key.slice32(0)); return i; } } @@ -126,7 +126,7 @@ CacheVC::updateVector(int /* event ATS_UNUSED */, Event */* e ATS_UNUSED */) f.rewrite_resident_alt = 1; write_len = doc->data_len(); Debug("cache_update_alt", - "rewriting resident alt size: %d key: %X, first_key: %X", write_len, doc->key.word(0), first_key.word(0)); + "rewriting resident alt size: %d key: %X, first_key: %X", write_len, doc->key.slice32(0), first_key.slice32(0)); } } header_len = write_vector->marshal_length(); @@ -260,7 +260,7 @@ Vol::force_evacuate_head(Dir *evac_dir, int pinned) } b->f.pinned = pinned; b->f.evacuate_head = 1; - b->evac_frags.key.set(0, 0); // ensure that the block gets + b->evac_frags.key = zero_key; // ensure that the block gets // evacuated no matter what b->readers = 0; // ensure that the block does not disappear return b; @@ -319,7 +319,7 @@ Vol::aggWriteDone(int event, Event *e) header->write_pos += io.aiocb.aio_nbytes; ink_assert(header->write_pos >= start); DDebug("cache_agg", "Dir %s, Write: %" PRIu64 ", last Write: %" PRIu64 "\n", - hash_id, header->write_pos, header->last_write_pos); + hash_text, header->write_pos, header->last_write_pos); ink_assert(header->write_pos == header->agg_pos); if (header->write_pos + EVACUATION_SIZE > scan_pos) periodic_scan(); @@ -330,7 +330,7 @@ Vol::aggWriteDone(int event, Event *e) // for fragments is this aggregation buffer Debug("cache_disk_error", "Write error on disk %s\n \ write range : [%" PRIu64 " - %" PRIu64 " bytes] [%" PRIu64 " - %" PRIu64 " blocks] \n", - hash_id, (uint64_t)io.aiocb.aio_offset, + hash_text, (uint64_t)io.aiocb.aio_offset, (uint64_t)io.aiocb.aio_offset + io.aiocb.aio_nbytes, (uint64_t)io.aiocb.aio_offset / CACHE_BLOCK_SIZE, (uint64_t)(io.aiocb.aio_offset + io.aiocb.aio_nbytes) / CACHE_BLOCK_SIZE); @@ -412,7 +412,7 @@ CacheVC::evacuateReadHead(int /* event ATS_UNUSED */, Event * /* e ATS_UNUSED */ alternate_tmp = vector.get(alternate_index); doc_len = alternate_tmp->object_size_get(); Debug("cache_evac", "evacuateReadHead http earliest %X first: %X len: %" PRId64, - first_key.word(0), earliest_key.word(0), doc_len); + first_key.slice32(0), earliest_key.slice32(0), doc_len); } else #endif { @@ -423,7 +423,7 @@ CacheVC::evacuateReadHead(int /* event ATS_UNUSED */, Event * /* e ATS_UNUSED */ goto Ldone; doc_len = doc->total_len; DDebug("cache_evac", - "evacuateReadHead non-http earliest %X first: %X len: %" PRId64, first_key.word(0), earliest_key.word(0), doc_len); + "evacuateReadHead non-http earliest %X first: %X len: %" PRId64, first_key.slice32(0), earliest_key.slice32(0), doc_len); } if (doc_len == total_len) { // the whole document has been evacuated. Insert the directory @@ -450,7 +450,7 @@ CacheVC::evacuateDocDone(int /* event ATS_UNUSED */, Event */* e ATS_UNUSED */) ink_assert(vol->mutex->thread_holding == this_ethread()); Doc *doc = (Doc *) buf->data(); DDebug("cache_evac", "evacuateDocDone %X o %d p %d new_o %d new_p %d", - (int) key.word(0), (int) dir_offset(&overwrite_dir), + (int) key.slice32(0), (int) dir_offset(&overwrite_dir), (int) dir_phase(&overwrite_dir), (int) dir_offset(&dir), (int) dir_phase(&dir)); int i = dir_evac_bucket(&overwrite_dir); // nasty beeping race condition, need to have the EvacuationBlock here @@ -474,7 +474,7 @@ CacheVC::evacuateDocDone(int /* event ATS_UNUSED */, Event */* e ATS_UNUSED */) break; if (evac->earliest_key.fold()) { DDebug("cache_evac", "evacdocdone: evacuating key %X earliest %X", - evac->key.word(0), evac->earliest_key.word(0)); + evac->key.slice32(0), evac->earliest_key.slice32(0)); EvacuationBlock *eblock = 0; Dir dir_tmp; dir_lookaside_probe(&evac->earliest_key, vol, &dir_tmp, &eblock); @@ -497,16 +497,16 @@ CacheVC::evacuateDocDone(int /* event ATS_UNUSED */, Event */* e ATS_UNUSED */) if (dir_head(&overwrite_dir) && b->f.evacuate_head) { DDebug("cache_evac", "evacuateDocDone evacuate_head %X %X hlen %d offset %d", - (int) key.word(0), (int) doc->key.word(0), doc->hlen, (int) dir_offset(&overwrite_dir)); + (int) key.slice32(0), (int) doc->key.slice32(0), doc->hlen, (int) dir_offset(&overwrite_dir)); if (dir_compare_tag(&overwrite_dir, &doc->first_key)) { OpenDirEntry *cod; DDebug("cache_evac", "evacuating vector: %X %d", - (int) doc->first_key.word(0), (int) dir_offset(&overwrite_dir)); + (int) doc->first_key.slice32(0), (int) dir_offset(&overwrite_dir)); if ((cod = vol->open_read(&doc->first_key))) { // writer exists DDebug("cache_evac", "overwriting the open directory %X %d %d", - (int) doc->first_key.word(0), (int) dir_offset(&cod->first_dir), (int) dir_offset(&dir)); + (int) doc->first_key.slice32(0), (int) dir_offset(&cod->first_dir), (int) dir_offset(&dir)); cod->first_dir = dir; } @@ -515,7 +515,7 @@ CacheVC::evacuateDocDone(int /* event ATS_UNUSED */, Event */* e ATS_UNUSED */) vol->ram_cache->fixup(&doc->first_key, (uint32_t)(o >> 32), (uint32_t)o, (uint32_t)(n >> 32), (uint32_t)n); } } else { - DDebug("cache_evac", "evacuating earliest: %X %d", (int) doc->key.word(0), (int) dir_offset(&overwrite_dir)); + DDebug("cache_evac", "evacuating earliest: %X %d", (int) doc->key.slice32(0), (int) dir_offset(&overwrite_dir)); ink_assert(dir_compare_tag(&overwrite_dir, &doc->key)); ink_assert(b->earliest_evacuator == this); total_len += doc->data_len(); @@ -573,7 +573,7 @@ evacuate_fragments(CacheKey *key, CacheKey *earliest_key, int force, Vol *vol) b->readers = 0; DDebug("cache_evac", "next fragment %X Earliest: %X offset %d phase %d force %d", - (int) key->word(0), (int) earliest_key->word(0), (int) dir_offset(&dir), (int) dir_phase(&dir), force); + (int) key->slice32(0), (int) earliest_key->slice32(0), (int) dir_offset(&dir), (int) dir_phase(&dir), force); } return i; } @@ -614,7 +614,7 @@ Vol::evacuateDocReadDone(int event, Event *e) goto Ldone; } DDebug("cache_evac", "evacuateDocReadDone %X offset %d", - (int) doc->key.word(0), (int) dir_offset(&doc_evacuator->overwrite_dir)); + (int) doc->key.slice32(0), (int) dir_offset(&doc_evacuator->overwrite_dir)); b = evacuate[dir_evac_bucket(&doc_evacuator->overwrite_dir)].head; while (b) { @@ -635,7 +635,7 @@ Vol::evacuateDocReadDone(int event, Event *e) doc_evacuator->key = doc->first_key; b->evac_frags.key = doc->first_key; DDebug("cache_evac", "evacuating vector %X offset %d", - (int) doc->first_key.word(0), (int) dir_offset(&doc_evacuator->overwrite_dir)); + (int) doc->first_key.slice32(0), (int) dir_offset(&doc_evacuator->overwrite_dir)); b->f.unused = 57; } else { // if its an earliest fragment (alternate) evacuation, things get @@ -648,7 +648,7 @@ Vol::evacuateDocReadDone(int event, Event *e) b->evac_frags.earliest_key = doc->key; b->earliest_evacuator = doc_evacuator; DDebug("cache_evac", "evacuating earliest %X %X evac: %p offset: %d", - (int) b->evac_frags.key.word(0), (int) doc->key.word(0), + (int) b->evac_frags.key.slice32(0), (int) doc->key.slice32(0), doc_evacuator, (int) dir_offset(&doc_evacuator->overwrite_dir)); b->f.unused = 67; } @@ -663,7 +663,7 @@ Vol::evacuateDocReadDone(int event, Event *e) doc_evacuator->key = ek->key; doc_evacuator->earliest_key = ek->earliest_key; DDebug("cache_evac", "evacuateDocReadDone key: %X earliest: %X", - (int) ek->key.word(0), (int) ek->earliest_key.word(0)); + (int) ek->key.slice32(0), (int) ek->earliest_key.slice32(0)); b->f.unused = 87; } // if the tag in the c->dir does match the first_key in the @@ -891,7 +891,7 @@ Vol::evacuate_cleanup_blocks(int i) (header->phase == dir_phase(&b->dir) && header->write_pos <= vol_offset(this, &b->dir)))) { EvacuationBlock *x = b; DDebug("cache_evac", "evacuate cleanup free %X offset %d", - (int) b->evac_frags.key.word(0), (int) dir_offset(&b->dir)); + (int) b->evac_frags.key.slice32(0), (int) dir_offset(&b->dir)); b = b->link.next; evacuate[i].remove(x); free_EvacuationBlock(x, mutex->thread_holding); @@ -977,7 +977,7 @@ Lagain: header->write_pos + agg_buf_pos + writelen > (skip + len)) break; DDebug("agg_read", "copying: %d, %" PRIu64 ", key: %d", - agg_buf_pos, header->write_pos + agg_buf_pos, c->first_key.word(0)); + agg_buf_pos, header->write_pos + agg_buf_pos, c->first_key.slice32(0)); int wrotelen = agg_copy(agg_buffer + agg_buf_pos, c); ink_assert(writelen == wrotelen); agg_todo_size -= writelen; @@ -1096,14 +1096,14 @@ CacheVC::openWriteCloseDir(int /* event ATS_UNUSED */, Event */* e ATS_UNUSED */ if (f.update && closed > 0) { if (!total_len && alternate_index != CACHE_ALT_REMOVED) { Debug("cache_update", "header only %d (%" PRIu64 ", %" PRIu64 ")\n", - DIR_MASK_TAG(first_key.word(2)), update_key.b[0], update_key.b[1]); + DIR_MASK_TAG(first_key.slice32(2)), update_key.b[0], update_key.b[1]); } else if (total_len && alternate_index != CACHE_ALT_REMOVED) { Debug("cache_update", "header body, %d, (%" PRIu64 ", %" PRIu64 "), (%" PRIu64 ", %" PRIu64 ")\n", - DIR_MASK_TAG(first_key.word(2)), update_key.b[0], update_key.b[1], earliest_key.b[0], earliest_key.b[1]); + DIR_MASK_TAG(first_key.slice32(2)), update_key.b[0], update_key.b[1], earliest_key.b[0], earliest_key.b[1]); } else if (!total_len && alternate_index == CACHE_ALT_REMOVED) { Debug("cache_update", "alt delete, %d, (%" PRIu64 ", %" PRIu64 ")\n", - DIR_MASK_TAG(first_key.word(2)), update_key.b[0], update_key.b[1]); + DIR_MASK_TAG(first_key.slice32(2)), update_key.b[0], update_key.b[1]); } } } @@ -1169,7 +1169,7 @@ CacheVC::openWriteCloseHeadDone(int event, Event *e) od->single_doc_key = earliest_key; } dir_assign(&od->single_doc_dir, &dir); - dir_set_tag(&od->single_doc_dir, od->single_doc_key.word(2)); + dir_set_tag(&od->single_doc_dir, od->single_doc_key.slice32(2)); } } } @@ -1331,7 +1331,7 @@ CacheVC::openWriteWriteDone(int event, Event *e) ++fragment; write_pos += write_len; dir_insert(&key, vol, &dir); - DDebug("cache_insert", "WriteDone: %X, %X, %d", key.word(0), first_key.word(0), write_len); + DDebug("cache_insert", "WriteDone: %X, %X, %d", key.slice32(0), first_key.slice32(0), write_len); blocks = iobufferblock_skip(blocks, &offset, &length, write_len); next_CacheKey(&key, &key); } @@ -1533,7 +1533,7 @@ Lagain: 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)); + dir_set_tag(&od->single_doc_dir, od->single_doc_key.slice32(2)); } first_buf = buf; goto Lsuccess; @@ -1644,7 +1644,7 @@ Cache::open_write(Continuation *cont, CacheKey *key, CacheFragType frag_type, */ do { rand_CacheKey(&c->key, cont->mutex); - } while (DIR_MASK_TAG(c->key.word(2)) == DIR_MASK_TAG(c->first_key.word(2))); + } while (DIR_MASK_TAG(c->key.slice32(2)) == DIR_MASK_TAG(c->first_key.slice32(2))); c->earliest_key = c->key; #ifdef HTTP_CACHE c->info = 0; @@ -1707,7 +1707,7 @@ Cache::open_write(Continuation *cont, CacheKey *key, CacheHTTPInfo *info, time_t do { rand_CacheKey(&c->key, cont->mutex); } - while (DIR_MASK_TAG(c->key.word(2)) == DIR_MASK_TAG(c->first_key.word(2))); + while (DIR_MASK_TAG(c->key.slice32(2)) == DIR_MASK_TAG(c->first_key.slice32(2))); c->earliest_key = c->key; c->frag_type = CACHE_FRAG_TYPE_HTTP; c->vol = key_to_vol(key, hostname, host_len); @@ -1859,7 +1859,7 @@ Lagain: else dir_insert(&mts->key, vol, &mts->dir); DDebug("cache_insert", "InterimCache: WriteDone: key: %X, first_key: %X, write_len: %d, write_offset: %" PRId64 ", dir_last_word: %X", - doc->key.word(0), doc->first_key.word(0), mts->agg_len, o, mts->dir.w[4]); + doc->key.slice32(0), doc->first_key.slice32(0), mts->agg_len, o, mts->dir.w[4]); if (mts->copy) { mts->interim_vol->vol->ram_cache->fixup(&mts->key, (uint32_t)(old_off >> 32), (uint32_t)old_off, http://git-wip-us.apache.org/repos/asf/trafficserver/blob/2ac12c4a/iocore/cache/P_CacheDir.h ---------------------------------------------------------------------- diff --git a/iocore/cache/P_CacheDir.h b/iocore/cache/P_CacheDir.h index 013698a..638051c 100644 --- a/iocore/cache/P_CacheDir.h +++ b/iocore/cache/P_CacheDir.h @@ -289,7 +289,7 @@ struct OpenDir: public Continuation int open_write(CacheVC *c, int allow_if_writers, int max_writers); int close_write(CacheVC *c); - OpenDirEntry *open_read(INK_MD5 *key); + OpenDirEntry *open_read(CryptoHash *key); int signal_readers(int event, Event *e); OpenDir(); @@ -347,7 +347,7 @@ extern Dir empty_dir; TS_INLINE bool dir_compare_tag(Dir *e, CacheKey *key) { - return (dir_tag(e) == DIR_MASK_TAG(key->word(2))); + return (dir_tag(e) == DIR_MASK_TAG(key->slice32(2))); } TS_INLINE Dir * http://git-wip-us.apache.org/repos/asf/trafficserver/blob/2ac12c4a/iocore/cache/P_CacheHosting.h ---------------------------------------------------------------------- diff --git a/iocore/cache/P_CacheHosting.h b/iocore/cache/P_CacheHosting.h index 5d1e793..ce376cc 100644 --- a/iocore/cache/P_CacheHosting.h +++ b/iocore/cache/P_CacheHosting.h @@ -80,7 +80,7 @@ public: CacheHostMatcher(const char * name, CacheType typ); ~CacheHostMatcher(); - void Match(char *rdata, int rlen, CacheHostResult *result); + void Match(char const* rdata, int rlen, CacheHostResult *result); void AllocateSpace(int num_entries); void NewEntry(matcher_line *line_info); void Print(); @@ -107,7 +107,7 @@ public: ~CacheHostTable(); int BuildTable(const char * config_file_path); int BuildTableFromString(const char * config_file_path, char *str); - void Match(char *rdata, int rlen, CacheHostResult *result); + void Match(char const* rdata, int rlen, CacheHostResult *result); void Print(); int getEntryCount() const { return m_numEntries; } http://git-wip-us.apache.org/repos/asf/trafficserver/blob/2ac12c4a/iocore/cache/P_CacheInternal.h ---------------------------------------------------------------------- diff --git a/iocore/cache/P_CacheInternal.h b/iocore/cache/P_CacheInternal.h index 3b8987e..5afac60 100644 --- a/iocore/cache/P_CacheInternal.h +++ b/iocore/cache/P_CacheInternal.h @@ -1020,7 +1020,7 @@ struct Cache int open(bool reconfigure, bool fix); int close(); - Action *lookup(Continuation *cont, CacheKey *key, CacheFragType type, char *hostname, int host_len); + Action *lookup(Continuation *cont, CacheKey *key, CacheFragType type, char const* hostname, int host_len); inkcoreapi Action *open_read(Continuation *cont, CacheKey *key, CacheFragType type, char *hostname, int len); inkcoreapi Action *open_write(Continuation *cont, CacheKey *key, CacheFragType frag_type, int options = 0, @@ -1055,7 +1055,7 @@ struct Cache int open_done(); - Vol *key_to_vol(CacheKey *key, char *hostname, int host_len); + Vol *key_to_vol(CacheKey *key, char const* hostname, int host_len); Cache() : cache_read_done(0), total_good_nvol(0), total_nvol(0), ready(CACHE_INITIALIZING), cache_size(0), // in store block size @@ -1074,7 +1074,7 @@ Cache::open_read(Continuation *cont, CacheURL *url, CacheHTTPHdr *request, { INK_MD5 md5; int len; - url->MD5_get(&md5); + url->hash_get(&md5); const char *hostname = url->host_get(&len); return open_read(cont, &md5, request, params, type, (char *) hostname, len); } @@ -1082,7 +1082,7 @@ Cache::open_read(Continuation *cont, CacheURL *url, CacheHTTPHdr *request, TS_INLINE void Cache::generate_key(INK_MD5 *md5, URL *url) { - url->MD5_get(md5); + url->hash_get(md5); } TS_INLINE Action * @@ -1091,7 +1091,7 @@ Cache::open_write(Continuation *cont, CacheURL *url, CacheHTTPHdr *request, { (void) request; INK_MD5 url_md5; - url->MD5_get(&url_md5); + url->hash_get(&url_md5); int len; const char *hostname = url->host_get(&len); @@ -1229,7 +1229,7 @@ CacheProcessor::lookup(Continuation *cont, URL *url, bool cluster_cache_local, b { (void) local_only; INK_MD5 md5; - url->MD5_get(&md5); + url->hash_get(&md5); int host_len = 0; const char *hostname = url->host_get(&host_len); http://git-wip-us.apache.org/repos/asf/trafficserver/blob/2ac12c4a/iocore/cache/P_CacheVol.h ---------------------------------------------------------------------- diff --git a/iocore/cache/P_CacheVol.h b/iocore/cache/P_CacheVol.h index ecf2d41..7c8ea0e 100644 --- a/iocore/cache/P_CacheVol.h +++ b/iocore/cache/P_CacheVol.h @@ -124,8 +124,8 @@ struct VolHeaderFooter struct EvacuationKey { SLink<EvacuationKey> link; - INK_MD5 key; - INK_MD5 earliest_key; + CryptoHash key; + CryptoHash earliest_key; }; struct EvacuationBlock @@ -236,9 +236,9 @@ struct AccessHistory { return tail; } - void set_in_progress(INK_MD5 *key) { - uint32_t key_index = key->word(3); - uint16_t tag = (uint16_t) key->word(1); + void set_in_progress(CryptoHash *key) { + uint32_t key_index = key->slice32(3); + uint16_t tag = static_cast<uint16_t>(key->slice32(1)); unsigned int hash_index = (uint32_t) (key_index % hash_size); uint32_t index = hash[hash_index]; @@ -248,9 +248,9 @@ struct AccessHistory { } } - void set_not_in_progress(INK_MD5 *key) { - uint32_t key_index = key->word(3); - uint16_t tag = (uint16_t) key->word(1); + void set_not_in_progress(CryptoHash *key) { + uint32_t key_index = key->slice32(3); + uint16_t tag = static_cast<uint16_t>(key->slice32(1)); unsigned int hash_index = (uint32_t) (key_index % hash_size); uint32_t index = hash[hash_index]; @@ -260,9 +260,9 @@ struct AccessHistory { } } - void put_key(INK_MD5 *key) { - uint32_t key_index = key->word(3); - uint16_t tag = (uint16_t) key->word(1); + void put_key(CryptoHash *key) { + uint32_t key_index = key->slice32(3); + uint16_t tag = static_cast<uint16_t>(key->slice32(1)); unsigned int hash_index = (uint32_t) (key_index % hash_size); uint32_t index = hash[hash_index]; @@ -292,11 +292,11 @@ struct AccessHistory { } } - bool remove_key(INK_MD5 *key) { - unsigned int hash_index = (uint32_t) (key->word(3) % hash_size); + bool remove_key(CryptoHash *key) { + unsigned int hash_index = static_cast<uint32_t>(key->slice32(3) % hash_size); uint32_t index = hash[hash_index]; AccessEntry *entry = &base[index]; - if (index != 0 && entry->item.tag == (uint16_t)key->word(1) && entry->item.index == key->word(3)) { + if (index != 0 && entry->item.tag == static_cast<uint16_t>(key->slice32(1)) && entry->item.index == key->slice32(3)) { remove(entry); freeEntry(entry); return true; @@ -304,9 +304,9 @@ struct AccessHistory { return false; } - bool is_hot(INK_MD5 *key) { - uint32_t key_index = key->word(3); - uint16_t tag = (uint16_t) key->word(1); + bool is_hot(CryptoHash *key) { + uint32_t key_index = key->slice32(3); + uint16_t tag = (uint16_t) key->slice32(1); unsigned int hash_index = (uint32_t) (key_index % hash_size); uint32_t index = hash[hash_index]; @@ -414,8 +414,8 @@ void dir_clean_interimvol(InterimCacheVol *d); struct Vol: public Continuation { char *path; - char *hash_id; - INK_MD5 hash_id_md5; + char *hash_text; + CryptoHash hash_id; int fd; char *raw_dir; @@ -477,7 +477,7 @@ struct Vol: public Continuation bool migrate_probe(CacheKey *key, MigrateToInterimCache **result) { - uint32_t indx = key->word(3) % MIGRATE_BUCKETS; + uint32_t indx = key->slice32(3) % MIGRATE_BUCKETS; MigrateToInterimCache *m = mig_hash[indx].head; while (m != NULL && !(m->key == *key)) { m = mig_hash[indx].next(m); @@ -516,8 +516,8 @@ struct Vol: public Continuation int begin_read_lock(CacheVC *cont); // unused read-write interlock code // currently http handles a write-lock failure by retrying the read - OpenDirEntry *open_read(INK_MD5 *key); - OpenDirEntry *open_read_lock(INK_MD5 *key, EThread *t); + OpenDirEntry *open_read(CryptoHash *key); + OpenDirEntry *open_read_lock(CryptoHash *key, EThread *t); int close_read(CacheVC *cont); int close_read_lock(CacheVC *cont); @@ -625,8 +625,8 @@ struct Doc uint32_t magic; // DOC_MAGIC uint32_t len; // length of this segment (including hlen, flen & sizeof(Doc), unrounded) uint64_t total_len; // total length of document - INK_MD5 first_key; // first key in document (http: vector) - INK_MD5 key; + CryptoHash first_key; // first key in document (http: vector) + CryptoHash key; uint32_t hlen; // header length uint32_t ftype:8; // fragment type CACHE_FRAG_TYPE_XX uint32_t _flen:24; // fragment table length [amc] NOT USED @@ -849,7 +849,7 @@ free_EvacuationBlock(EvacuationBlock *b, EThread *t) } TS_INLINE OpenDirEntry * -Vol::open_read(INK_MD5 *key) +Vol::open_read(CryptoHash *key) { return open_dir.open_read(key); } http://git-wip-us.apache.org/repos/asf/trafficserver/blob/2ac12c4a/iocore/cache/RamCacheCLFUS.cc ---------------------------------------------------------------------- diff --git a/iocore/cache/RamCacheCLFUS.cc b/iocore/cache/RamCacheCLFUS.cc index bcdfc98..f7781de 100644 --- a/iocore/cache/RamCacheCLFUS.cc +++ b/iocore/cache/RamCacheCLFUS.cc @@ -156,7 +156,7 @@ RamCacheCLFUS::resize_hashtable() for (int64_t i = 0; i < nbuckets; i++) { RamCacheCLFUSEntry *e = 0; while ((e = bucket[i].pop())) - new_bucket[e->key.word(3) % anbuckets].push(e); + new_bucket[e->key.slice32(3) % anbuckets].push(e); } ats_free(bucket); } @@ -204,7 +204,7 @@ RamCacheCLFUS::get(INK_MD5 *key, Ptr<IOBufferData> *ret_data, uint32_t auxkey1, { if (!max_bytes) return 0; - int64_t i = key->word(3) % nbuckets; + int64_t i = key->slice32(3) % nbuckets; RamCacheCLFUSEntry *e = bucket[i].head; char *b = 0; while (e) { @@ -264,25 +264,25 @@ RamCacheCLFUS::get(INK_MD5 *key, Ptr<IOBufferData> *ret_data, uint32_t auxkey1, (*ret_data) = data; } CACHE_SUM_DYN_STAT_THREAD(cache_ram_cache_hits_stat, 1); - DDebug("ram_cache", "get %X %d %d size %d HIT", key->word(3), auxkey1, auxkey2, e->size); + DDebug("ram_cache", "get %X %d %d size %d HIT", key->slice32(3), auxkey1, auxkey2, e->size); return 1; } else { CACHE_SUM_DYN_STAT_THREAD(cache_ram_cache_misses_stat, 1); - DDebug("ram_cache", "get %X %d %d HISTORY", key->word(3), auxkey1, auxkey2); + DDebug("ram_cache", "get %X %d %d HISTORY", key->slice32(3), auxkey1, auxkey2); return 0; } } assert(e != e->hash_link.next); e = e->hash_link.next; } - DDebug("ram_cache", "get %X %d %d MISS", key->word(3), auxkey1, auxkey2); + DDebug("ram_cache", "get %X %d %d MISS", key->slice32(3), auxkey1, auxkey2); Lerror: CACHE_SUM_DYN_STAT_THREAD(cache_ram_cache_misses_stat, 1); return 0; Lfailed: ats_free(b); destroy(e); - DDebug("ram_cache", "get %X %d %d Z_ERR", key->word(3), auxkey1, auxkey2); + DDebug("ram_cache", "get %X %d %d Z_ERR", key->slice32(3), auxkey1, auxkey2); goto Lerror; } @@ -302,9 +302,9 @@ void RamCacheCLFUS::tick() { Lfree: e->flag_bits.lru = 0; history--; - uint32_t b = e->key.word(3) % nbuckets; + uint32_t b = e->key.slice32(3) % nbuckets; bucket[b].remove(e); - DDebug("ram_cache", "put %X %d %d size %d FREED", e->key.word(3), e->auxkey1, e->auxkey2, e->size); + DDebug("ram_cache", "put %X %d %d size %d FREED", e->key.slice32(3), e->auxkey1, e->auxkey2, e->size); THREAD_FREE(e, ramCacheCLFUSEntryAllocator, this_thread()); } @@ -312,7 +312,7 @@ void RamCacheCLFUS::victimize(RamCacheCLFUSEntry *e) { objects--; - DDebug("ram_cache", "put %X %d %d size %d VICTIMIZED", e->key.word(3), e->auxkey1, e->auxkey2, e->size); + DDebug("ram_cache", "put %X %d %d size %d VICTIMIZED", e->key.slice32(3), e->auxkey1, e->auxkey2, e->size); e->data = NULL; e->flag_bits.lru = 1; lru[1].enqueue(e); @@ -345,9 +345,9 @@ RamCacheCLFUS::destroy(RamCacheCLFUSEntry *e) e->data = NULL; } else history--; - uint32_t b = e->key.word(3) % nbuckets; + uint32_t b = e->key.slice32(3) % nbuckets; bucket[b].remove(e); - DDebug("ram_cache", "put %X %d %d DESTROYED", e->key.word(3), e->auxkey1, e->auxkey2); + DDebug("ram_cache", "put %X %d %d DESTROYED", e->key.slice32(3), e->auxkey1, e->auxkey2); THREAD_FREE(e, ramCacheCLFUSEntryAllocator, this_thread()); return ret; } @@ -424,7 +424,7 @@ RamCacheCLFUS::compress_entries(EThread *thread, int do_at_most) MUTEX_TAKE_LOCK(vol->mutex, thread); // see if the entry is till around { - uint32_t i = key.word(3) % nbuckets; + uint32_t i = key.slice32(3) % nbuckets; RamCacheCLFUSEntry *ee = bucket[i].head; while (ee) { if (ee->key == key && ee->data == edata) break; @@ -472,7 +472,7 @@ RamCacheCLFUS::compress_entries(EThread *thread, int do_at_most) e->flag_bits.incompressible = 1; Lcontinue:; DDebug("ram_cache", "compress %X %d %d %d %d %d %d %d", - e->key.word(3), e->auxkey1, e->auxkey2, + e->key.slice32(3), e->auxkey1, e->auxkey2, e->flag_bits.incompressible, e->flag_bits.compressed, e->len, e->compressed_len, ncompressed); if (!e->lru_link.next) @@ -501,7 +501,7 @@ RamCacheCLFUS::put(INK_MD5 *key, IOBufferData *data, uint32_t len, bool copy, ui { if (!max_bytes) return 0; - uint32_t i = key->word(3) % nbuckets; + uint32_t i = key->slice32(3) % nbuckets; RamCacheCLFUSEntry *e = bucket[i].head; uint32_t size = copy ? len : data->block_size(); while (e) { @@ -537,7 +537,7 @@ RamCacheCLFUS::put(INK_MD5 *key, IOBufferData *data, uint32_t len, bool copy, ui check_accounting(this); e->flag_bits.copy = copy; e->flag_bits.compressed = 0; - DDebug("ram_cache", "put %X %d %d size %d HIT", key->word(3), auxkey1, auxkey2, e->size); + DDebug("ram_cache", "put %X %d %d size %d HIT", key->slice32(3), auxkey1, auxkey2, e->size); return 1; } else lru[1].remove(e); @@ -548,12 +548,12 @@ RamCacheCLFUS::put(INK_MD5 *key, IOBufferData *data, uint32_t len, bool copy, ui if (bytes + size <= max_bytes) goto Linsert; if (!e && cache_config_ram_cache_use_seen_filter) { - uint32_t s = key->word(3) % bucket_sizes[ibuckets]; - uint16_t k = key->word(3) >> 16; + uint32_t s = key->slice32(3) % bucket_sizes[ibuckets]; + uint16_t k = key->slice32(3) >> 16; uint16_t kk = seen[s]; seen[s] = k; if (history >= objects && kk != k) { - DDebug("ram_cache", "put %X %d %d size %d UNSEEN", key->word(3), auxkey1, auxkey2, size); + DDebug("ram_cache", "put %X %d %d size %d UNSEEN", key->slice32(3), auxkey1, auxkey2, size); return 0; } } @@ -565,7 +565,7 @@ RamCacheCLFUS::put(INK_MD5 *key, IOBufferData *data, uint32_t len, bool copy, ui if (e) lru[1].enqueue(e); requeue_victims(this, victims); - DDebug("ram_cache", "put %X %d %d NO VICTIM", key->word(3), auxkey1, auxkey2); + DDebug("ram_cache", "put %X %d %d NO VICTIM", key->slice32(3), auxkey1, auxkey2); return 0; } bytes -= victim->size + ENTRY_OVERHEAD; @@ -585,7 +585,7 @@ RamCacheCLFUS::put(INK_MD5 *key, IOBufferData *data, uint32_t len, bool copy, ui requeue_victims(this, victims); lru[1].enqueue(e); DDebug("ram_cache", "put %X %d %d size %d INC %" PRId64" HISTORY", - key->word(3), auxkey1, auxkey2, e->size, e->hits); + key->slice32(3), auxkey1, auxkey2, e->size, e->hits); return 0; } } @@ -634,7 +634,7 @@ Linsert: lru[0].enqueue(e); e->len = len; check_accounting(this); - DDebug("ram_cache", "put %X %d %d size %d INSERTED", key->word(3), auxkey1, auxkey2, e->size); + DDebug("ram_cache", "put %X %d %d size %d INSERTED", key->slice32(3), auxkey1, auxkey2, e->size); return 1; Lhistory: requeue_victims(this, victims); @@ -650,7 +650,7 @@ Lhistory: e->flag_bits.lru = 1; lru[1].enqueue(e); history++; - DDebug("ram_cache", "put %X %d %d HISTORY", key->word(3), auxkey1, auxkey2); + DDebug("ram_cache", "put %X %d %d HISTORY", key->slice32(3), auxkey1, auxkey2); return 0; } @@ -660,7 +660,7 @@ RamCacheCLFUS::fixup(INK_MD5 * key, uint32_t old_auxkey1, uint32_t old_auxkey2, { if (!max_bytes) return 0; - uint32_t i = key->word(3) % nbuckets; + uint32_t i = key->slice32(3) % nbuckets; RamCacheCLFUSEntry *e = bucket[i].head; while (e) { if (e->key == *key && e->auxkey1 == old_auxkey1 && e->auxkey2 == old_auxkey2) { http://git-wip-us.apache.org/repos/asf/trafficserver/blob/2ac12c4a/iocore/cache/RamCacheLRU.cc ---------------------------------------------------------------------- diff --git a/iocore/cache/RamCacheLRU.cc b/iocore/cache/RamCacheLRU.cc index ddf7620..c85df38 100644 --- a/iocore/cache/RamCacheLRU.cc +++ b/iocore/cache/RamCacheLRU.cc @@ -76,7 +76,7 @@ void RamCacheLRU::resize_hashtable() { for (int64_t i = 0; i < nbuckets; i++) { RamCacheLRUEntry *e = 0; while ((e = bucket[i].pop())) - new_bucket[e->key.word(3) % anbuckets].push(e); + new_bucket[e->key.slice32(3) % anbuckets].push(e); } ats_free(bucket); } @@ -104,32 +104,32 @@ int RamCacheLRU::get(INK_MD5 * key, Ptr<IOBufferData> *ret_data, uint32_t auxkey1, uint32_t auxkey2) { if (!max_bytes) return 0; - uint32_t i = key->word(3) % nbuckets; + uint32_t i = key->slice32(3) % nbuckets; RamCacheLRUEntry *e = bucket[i].head; while (e) { if (e->key == *key && e->auxkey1 == auxkey1 && e->auxkey2 == auxkey2) { lru.remove(e); lru.enqueue(e); (*ret_data) = e->data; - DDebug("ram_cache", "get %X %d %d HIT", key->word(3), auxkey1, auxkey2); + DDebug("ram_cache", "get %X %d %d HIT", key->slice32(3), auxkey1, auxkey2); CACHE_SUM_DYN_STAT_THREAD(cache_ram_cache_hits_stat, 1); return 1; } e = e->hash_link.next; } - DDebug("ram_cache", "get %X %d %d MISS", key->word(3), auxkey1, auxkey2); + DDebug("ram_cache", "get %X %d %d MISS", key->slice32(3), auxkey1, auxkey2); CACHE_SUM_DYN_STAT_THREAD(cache_ram_cache_misses_stat, 1); return 0; } RamCacheLRUEntry * RamCacheLRU::remove(RamCacheLRUEntry *e) { RamCacheLRUEntry *ret = e->hash_link.next; - uint32_t b = e->key.word(3) % nbuckets; + uint32_t b = e->key.slice32(3) % nbuckets; bucket[b].remove(e); lru.remove(e); bytes -= e->data->block_size(); CACHE_SUM_DYN_STAT_THREAD(cache_ram_cache_bytes_stat, -e->data->block_size()); - DDebug("ram_cache", "put %X %d %d FREED", e->key.word(3), e->auxkey1, e->auxkey2); + DDebug("ram_cache", "put %X %d %d FREED", e->key.slice32(3), e->auxkey1, e->auxkey2); e->data = NULL; THREAD_FREE(e, ramCacheLRUEntryAllocator, this_thread()); objects--; @@ -140,13 +140,13 @@ RamCacheLRUEntry * RamCacheLRU::remove(RamCacheLRUEntry *e) { int RamCacheLRU::put(INK_MD5 *key, IOBufferData *data, uint32_t len, bool, uint32_t auxkey1, uint32_t auxkey2) { if (!max_bytes) return 0; - uint32_t i = key->word(3) % nbuckets; + uint32_t i = key->slice32(3) % nbuckets; if (cache_config_ram_cache_use_seen_filter) { - uint16_t k = key->word(3) >> 16; + uint16_t k = key->slice32(3) >> 16; uint16_t kk = seen[i]; seen[i] = k; if ((kk != (uint16_t)k)) { - DDebug("ram_cache", "put %X %d %d len %d UNSEEN", key->word(3), auxkey1, auxkey2, len); + DDebug("ram_cache", "put %X %d %d len %d UNSEEN", key->slice32(3), auxkey1, auxkey2, len); return 0; } } @@ -181,7 +181,7 @@ int RamCacheLRU::put(INK_MD5 *key, IOBufferData *data, uint32_t len, bool, uint3 else break; } - DDebug("ram_cache", "put %X %d %d INSERTED", key->word(3), auxkey1, auxkey2); + DDebug("ram_cache", "put %X %d %d INSERTED", key->slice32(3), auxkey1, auxkey2); if (objects > nbuckets) { ++ibuckets; resize_hashtable(); @@ -192,7 +192,7 @@ int RamCacheLRU::put(INK_MD5 *key, IOBufferData *data, uint32_t len, bool, uint3 int RamCacheLRU::fixup(INK_MD5 * key, uint32_t old_auxkey1, uint32_t old_auxkey2, uint32_t new_auxkey1, uint32_t new_auxkey2) { if (!max_bytes) return 0; - uint32_t i = key->word(3) % nbuckets; + uint32_t i = key->slice32(3) % nbuckets; RamCacheLRUEntry *e = bucket[i].head; while (e) { if (e->key == *key && e->auxkey1 == old_auxkey1 && e->auxkey2 == old_auxkey2) { http://git-wip-us.apache.org/repos/asf/trafficserver/blob/2ac12c4a/iocore/hostdb/HostDB.cc ---------------------------------------------------------------------- diff --git a/iocore/hostdb/HostDB.cc b/iocore/hostdb/HostDB.cc index 1b082ee..e295f7d 100644 --- a/iocore/hostdb/HostDB.cc +++ b/iocore/hostdb/HostDB.cc @@ -175,7 +175,8 @@ HostDBMD5::refresh() { memset(buff, 0, 2); memcpy(buff+2, ip._addr._byte, n); memset(buff + 2 + n , 0, 2); - hash.encodeBuffer(buff, n+4); + MD5Context().hash_immediate(hash, buff, n+4); +// hash.encodeBuffer(buff, n+4); } } http://git-wip-us.apache.org/repos/asf/trafficserver/blob/2ac12c4a/lib/ts/CryptoHash.h ---------------------------------------------------------------------- diff --git a/lib/ts/CryptoHash.h b/lib/ts/CryptoHash.h new file mode 100644 index 0000000..9dcec91 --- /dev/null +++ b/lib/ts/CryptoHash.h @@ -0,0 +1,124 @@ +# if ! defined CRYPTO_HASH_HEADER +# define CRYPTO_HASH_HEADER + +/** @file + Protocol class for crypto hashes. + + @section license License + + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +/// Apache Traffic Server commons. +namespace ats { + /// Crypto hash output. + union CryptoHash { + uint64_t b[2]; // Legacy placeholder + uint64_t u64[2]; + uint32_t u32[4]; + uint8_t u8[16]; + + /// Default constructor - init to zero. + CryptoHash() { + u64[0] = 0; + u64[1] = 0; + } + + /// Assignment - bitwise copy. + CryptoHash& operator = (CryptoHash const& that) { + u64[0] = that.u64[0]; + u64[1] = that.u64[1]; + return *this; + } + + /// Equality - bitwise identical. + bool operator == (CryptoHash const& that) const { + return u64[0] == that.u64[0] && u64[1] == that.u64[1]; + } + + /// Equality - bitwise identical. + bool operator != (CryptoHash const& that) const { + return !(*this == that); + } + + /// Reduce to 64 bit value. + uint64_t fold() const { + return u64[0] ^ u64[1]; + } + + /// Access 64 bit slice. + uint64_t operator [] (int i) const { + return u64[i]; + } + + /// Access 64 bit slice. + /// @note Identical to @ operator[] but included for symmetry. + uint64_t slice64(int i) const { + return u64[i]; + } + + /// Access 32 bit slice. + uint32_t slice32(int i) const { + return u32[i]; + } + + /// Fast conversion to hex in fixed sized string. + char *toHexStr(char buffer[33]) { + return ink_code_to_hex_str(buffer, u8); + } + }; + + extern CryptoHash const CRYPTO_HASH_ZERO; + + /** Protocol class for a crypto hash context. + + A hash of this type is used for strong hashing, such as for URLs. + */ + class CryptoContext { + typedef CryptoContext self; ///< Self reference type. + public: + + /// Destructor (force virtual) + virtual ~CryptoContext() { } + + /// Update the hash with @a data of @a length bytes. + virtual bool update(void const* data, int length) = 0; + /// Finalize and extract the @a hash. + virtual bool finalize(CryptoHash& hash) = 0; + + /// Convenience overload. + bool finalize(CryptoHash* hash); + + /// Convenience - compute final @a hash for @a data. + /// @note This is just as fast as the previous style, as a new context must be initialized + /// everytime this is done. + virtual bool hash_immediate(CryptoHash& hash, void const* data, int length); + }; + + inline bool CryptoContext::hash_immediate(CryptoHash& hash, void const* data, int length) { + return this->update(data, length) && this->finalize(hash); + } + inline bool CryptoContext::finalize(CryptoHash* hash) { return this->finalize(*hash); } + +} // end namespace + +// Promote for the primitives who don't use namespaces... +using ats::CryptoHash; +using ats::CryptoContext; +using ats::CRYPTO_HASH_ZERO; + +# endif // CRYPTO_HASH_HEADER
