Repository: trafficserver Updated Branches: refs/heads/master ce415f5de -> b5673f75c
[TS-3881] new TS API TSHttpTxnInfoGet. Project: http://git-wip-us.apache.org/repos/asf/trafficserver/repo Commit: http://git-wip-us.apache.org/repos/asf/trafficserver/commit/b5673f75 Tree: http://git-wip-us.apache.org/repos/asf/trafficserver/tree/b5673f75 Diff: http://git-wip-us.apache.org/repos/asf/trafficserver/diff/b5673f75 Branch: refs/heads/master Commit: b5673f75c53cf3f7d077dba7db558f6224ffc6ad Parents: ce415f5 Author: Sudheer Vinukonda <[email protected]> Authored: Mon Sep 14 19:21:24 2015 +0000 Committer: Sudheer Vinukonda <[email protected]> Committed: Mon Sep 14 19:21:24 2015 +0000 ---------------------------------------------------------------------- iocore/cache/Cache.cc | 4 ++- iocore/cache/I_Cache.h | 13 ++++++++++ iocore/cache/P_CacheInternal.h | 15 +++++++++++ iocore/cache/RamCacheCLFUS.cc | 6 ++++- lib/ts/apidefs.h.in | 11 ++++++++ proxy/InkAPI.cc | 35 +++++++++++++++++++++++++ proxy/InkAPITest.cc | 51 +++++++++++++++++++++++++++++++++++++ proxy/api/ts/experimental.h | 13 ++++++++++ proxy/http/HttpCacheSM.h | 42 ++++++++++++++++++++++++++++++ 9 files changed, 188 insertions(+), 2 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/trafficserver/blob/b5673f75/iocore/cache/Cache.cc ---------------------------------------------------------------------- diff --git a/iocore/cache/Cache.cc b/iocore/cache/Cache.cc index 2e57525..1fa4284 100644 --- a/iocore/cache/Cache.cc +++ b/iocore/cache/Cache.cc @@ -2459,7 +2459,9 @@ CacheVC::handleRead(int /* event ATS_UNUSED */, Event * /* e ATS_UNUSED */) // check ram cache ink_assert(vol->mutex->thread_holding == this_ethread()); int64_t o = dir_offset(&dir); - if (vol->ram_cache->get(read_key, &buf, (uint32_t)(o >> 32), (uint32_t)o)) { + int ram_hit_state = vol->ram_cache->get(read_key, &buf, (uint32_t)(o >> 32), (uint32_t)o); + f.compressed_in_ram = (ram_hit_state > RAM_HIT_COMPRESS_NONE) ? 1 : 0; + if (ram_hit_state >= RAM_HIT_COMPRESS_NONE) { goto LramHit; } http://git-wip-us.apache.org/repos/asf/trafficserver/blob/b5673f75/iocore/cache/I_Cache.h ---------------------------------------------------------------------- diff --git a/iocore/cache/I_Cache.h b/iocore/cache/I_Cache.h index de06a44..eb8bdbd 100644 --- a/iocore/cache/I_Cache.h +++ b/iocore/cache/I_Cache.h @@ -49,6 +49,8 @@ #define CACHE_COMPRESSION_LIBZ 2 #define CACHE_COMPRESSION_LIBLZMA 3 +enum { RAM_HIT_COMPRESS_NONE = 1, RAM_HIT_COMPRESS_FASTLZ, RAM_HIT_COMPRESS_LIBZ, RAM_HIT_COMPRESS_LIBLZMA, RAM_HIT_LAST_ENTRY }; + struct CacheVC; struct CacheDisk; #ifdef HTTP_CACHE @@ -204,6 +206,17 @@ struct CacheVConnection : public VConnection { virtual bool set_pin_in_cache(time_t t) = 0; virtual time_t get_pin_in_cache() = 0; virtual int64_t get_object_size() = 0; + virtual bool + is_compressed_in_ram() const + { + return false; + } + + virtual int + get_volume_number() const + { + return -1; + } /** Test if the VC can support pread. @return @c true if @c do_io_pread will work, @c false if not. http://git-wip-us.apache.org/repos/asf/trafficserver/blob/b5673f75/iocore/cache/P_CacheInternal.h ---------------------------------------------------------------------- diff --git a/iocore/cache/P_CacheInternal.h b/iocore/cache/P_CacheInternal.h index 74efade..b3858d2 100644 --- a/iocore/cache/P_CacheInternal.h +++ b/iocore/cache/P_CacheInternal.h @@ -269,6 +269,20 @@ struct CacheVC : public CacheVConnection { } return -1; } + int + get_volume_number() const + { + if (vol && vol->cache_vol) { + return vol->cache_vol->vol_number; + } + return -1; + } + bool + is_compressed_in_ram() const + { + ink_assert(vio.op == VIO::READ); + return !f.compressed_in_ram; + } bool writer_done(); int calluser(int event); @@ -477,6 +491,7 @@ struct CacheVC : public CacheVConnection { unsigned int readers : 1; unsigned int doc_from_ram_cache : 1; unsigned int hit_evacuate : 1; + unsigned int compressed_in_ram : 1; // compressed state in ram cache #ifdef HTTP_CACHE unsigned int allow_empty_doc : 1; // used for cache empty http document #endif http://git-wip-us.apache.org/repos/asf/trafficserver/blob/b5673f75/iocore/cache/RamCacheCLFUS.cc ---------------------------------------------------------------------- diff --git a/iocore/cache/RamCacheCLFUS.cc b/iocore/cache/RamCacheCLFUS.cc index 8eb72ce..db44527 100644 --- a/iocore/cache/RamCacheCLFUS.cc +++ b/iocore/cache/RamCacheCLFUS.cc @@ -220,6 +220,7 @@ RamCacheCLFUS::get(INK_MD5 *key, Ptr<IOBufferData> *ret_data, uint32_t auxkey1, lru[e->flag_bits.lru].remove(e); lru[e->flag_bits.lru].enqueue(e); if (!e->flag_bits.lru) { // in memory + uint32_t ram_hit_state = RAM_HIT_COMPRESS_NONE; e->hits++; if (e->flag_bits.compressed) { b = (char *)ats_malloc(e->len); @@ -230,6 +231,7 @@ RamCacheCLFUS::get(INK_MD5 *key, Ptr<IOBufferData> *ret_data, uint32_t auxkey1, int l = (int)e->len; if ((l != (int)fastlz_decompress(e->data->data(), e->compressed_len, b, l))) goto Lfailed; + ram_hit_state = RAM_HIT_COMPRESS_FASTLZ; break; } #if TS_HAS_LIBZ @@ -237,6 +239,7 @@ RamCacheCLFUS::get(INK_MD5 *key, Ptr<IOBufferData> *ret_data, uint32_t auxkey1, uLongf l = e->len; if (Z_OK != uncompress((Bytef *)b, &l, (Bytef *)e->data->data(), e->compressed_len)) goto Lfailed; + ram_hit_state = RAM_HIT_COMPRESS_LIBZ; break; } #endif @@ -247,6 +250,7 @@ RamCacheCLFUS::get(INK_MD5 *key, Ptr<IOBufferData> *ret_data, uint32_t auxkey1, if (LZMA_OK != lzma_stream_buffer_decode(&memlimit, 0, NULL, (uint8_t *)e->data->data(), &ipos, e->compressed_len, (uint8_t *)b, &opos, l)) goto Lfailed; + ram_hit_state = RAM_HIT_COMPRESS_LIBLZMA; break; } #endif @@ -273,7 +277,7 @@ RamCacheCLFUS::get(INK_MD5 *key, Ptr<IOBufferData> *ret_data, uint32_t auxkey1, } CACHE_SUM_DYN_STAT_THREAD(cache_ram_cache_hits_stat, 1); DDebug("ram_cache", "get %X %d %d size %d HIT", key->slice32(3), auxkey1, auxkey2, e->size); - return 1; + return ram_hit_state; } else { CACHE_SUM_DYN_STAT_THREAD(cache_ram_cache_misses_stat, 1); DDebug("ram_cache", "get %X %d %d HISTORY", key->slice32(3), auxkey1, auxkey2); http://git-wip-us.apache.org/repos/asf/trafficserver/blob/b5673f75/lib/ts/apidefs.h.in ---------------------------------------------------------------------- diff --git a/lib/ts/apidefs.h.in b/lib/ts/apidefs.h.in index 174ac0e..48bd64a 100644 --- a/lib/ts/apidefs.h.in +++ b/lib/ts/apidefs.h.in @@ -493,6 +493,17 @@ typedef enum { TS_CACHE_SCAN_RESULT_RETRY } TSCacheScanResult; +typedef enum { + TS_TXN_INFO_NONE = -1, + TS_TXN_INFO_CACHE_HIT_RAM, + TS_TXN_INFO_COMPRESSED_IN_RAM, + TS_TXN_INFO_CACHE_HIT_RWW, // READ_WHILE_WRITE + TS_TXN_INFO_CACHE_OPEN_READ_TRIES, + TS_TXN_INFO_CACHE_OPEN_WRITE_TRIES, + TS_TXN_INFO_CACHE_VOLUME, + TS_TXN_INFO_LAST_ENTRY +} TSHttpTxnInfoKey; + typedef enum { TS_VC_CLOSE_ABORT = -1, TS_VC_CLOSE_NORMAL = 1 } TSVConnCloseFlags; typedef enum { http://git-wip-us.apache.org/repos/asf/trafficserver/blob/b5673f75/proxy/InkAPI.cc ---------------------------------------------------------------------- diff --git a/proxy/InkAPI.cc b/proxy/InkAPI.cc index 923ae29..0c736de 100644 --- a/proxy/InkAPI.cc +++ b/proxy/InkAPI.cc @@ -4833,6 +4833,41 @@ TSHttpTxnCacheLookupStatusSet(TSHttpTxn txnp, int cachelookup) } TSReturnCode +TSHttpTxnInfoGet(TSHttpTxn txnp, TSHttpTxnInfoKey key, TSMgmtInt *value) +{ + sdk_assert(sdk_sanity_check_txn(txnp) == TS_SUCCESS); + sdk_assert(sdk_sanity_check_null_ptr((void *)value) == TS_SUCCESS); + + HttpSM *s = reinterpret_cast<HttpSM *>(txnp); + HttpCacheSM *c_sm = &(s->get_cache_sm()); + + switch (key) { + case TS_TXN_INFO_CACHE_HIT_RAM: + *value = (static_cast<TSMgmtInt>(c_sm->is_ram_cache_hit())); + break; + case TS_TXN_INFO_COMPRESSED_IN_RAM: + *value = (static_cast<TSMgmtInt>(c_sm->is_compressed_in_ram())); + break; + case TS_TXN_INFO_CACHE_HIT_RWW: + *value = (static_cast<TSMgmtInt>(c_sm->is_readwhilewrite_inprogress())); + break; + case TS_TXN_INFO_CACHE_OPEN_READ_TRIES: + *value = (static_cast<TSMgmtInt>(c_sm->get_open_read_tries())); + break; + case TS_TXN_INFO_CACHE_OPEN_WRITE_TRIES: + *value = (static_cast<TSMgmtInt>(c_sm->get_open_write_tries())); + break; + case TS_TXN_INFO_CACHE_VOLUME: + *value = (static_cast<TSMgmtInt>(c_sm->get_volume_number())); + break; + default: + return TS_ERROR; + } + + return TS_SUCCESS; +} + +TSReturnCode TSHttpTxnCacheLookupUrlGet(TSHttpTxn txnp, TSMBuffer bufp, TSMLoc obj) { sdk_assert(sdk_sanity_check_txn(txnp) == TS_SUCCESS); http://git-wip-us.apache.org/repos/asf/trafficserver/blob/b5673f75/proxy/InkAPITest.cc ---------------------------------------------------------------------- diff --git a/proxy/InkAPITest.cc b/proxy/InkAPITest.cc index 968e990..dd57d34 100644 --- a/proxy/InkAPITest.cc +++ b/proxy/InkAPITest.cc @@ -7298,6 +7298,57 @@ REGRESSION_TEST(SDK_API_OVERRIDABLE_CONFIGS)(RegressionTest *test, int /* atype } //////////////////////////////////////////////// +// SDK_API_TXN_HTTP_INFO_GET +// +// Unit Test for API: TSHttpTxnInfoGet +//////////////////////////////////////////////// + +REGRESSION_TEST(SDK_API_TXN_HTTP_INFO_GET)(RegressionTest *test, int /* atype ATS_UNUSED */, int *pstatus) +{ + HttpSM *s = HttpSM::allocate(); + bool success = true; + TSHttpTxn txnp = reinterpret_cast<TSHttpTxn>(s); + TSMgmtInt ival_read; + + + s->init(); + + *pstatus = REGRESSION_TEST_INPROGRESS; + HttpCacheSM *c_sm = &(s->get_cache_sm()); + c_sm->set_readwhilewrite_inprogress(true); + c_sm->set_open_read_tries(5); + c_sm->set_open_write_tries(8); + + TSHttpTxnInfoGet(txnp, TS_TXN_INFO_CACHE_HIT_RWW, &ival_read); + if (ival_read == 0) { + SDK_RPRINT(test, "TSHttpTxnInfoGet", "TestCase1", TC_FAIL, "Failed on %d, %d != %d", TS_TXN_INFO_CACHE_HIT_RWW, ival_read, 1); + success = false; + } + + TSHttpTxnInfoGet(txnp, TS_TXN_INFO_CACHE_OPEN_READ_TRIES, &ival_read); + if (ival_read != 5) { + SDK_RPRINT(test, "TSHttpTxnInfoGet", "TestCase1", TC_FAIL, "Failed on %d, %d != %d", TS_TXN_INFO_CACHE_HIT_RWW, ival_read, 5); + success = false; + } + + TSHttpTxnInfoGet(txnp, TS_TXN_INFO_CACHE_OPEN_WRITE_TRIES, &ival_read); + if (ival_read != 8) { + SDK_RPRINT(test, "TSHttpTxnInfoGet", "TestCase1", TC_FAIL, "Failed on %d, %d != %d", TS_TXN_INFO_CACHE_HIT_RWW, ival_read, 8); + success = false; + } + + s->destroy(); + if (success) { + *pstatus = REGRESSION_TEST_PASSED; + SDK_RPRINT(test, "TSHttpTxnInfoGet", "TestCase1", TC_PASS, "ok"); + } else { + *pstatus = REGRESSION_TEST_FAILED; + } + + return; +} + +//////////////////////////////////////////////// // SDK_API_ENCODING // // Unit Test for API: TSStringPercentEncode http://git-wip-us.apache.org/repos/asf/trafficserver/blob/b5673f75/proxy/api/ts/experimental.h ---------------------------------------------------------------------- diff --git a/proxy/api/ts/experimental.h b/proxy/api/ts/experimental.h index ee4fd57..ebe43c0 100644 --- a/proxy/api/ts/experimental.h +++ b/proxy/api/ts/experimental.h @@ -188,6 +188,19 @@ tsapi void TSCacheHttpInfoReqGet(TSCacheHttpInfo infop, TSMBuffer *bufp, TSMLoc tsapi void TSCacheHttpInfoRespGet(TSCacheHttpInfo infop, TSMBuffer *bufp, TSMLoc *offset); tsapi void TSCacheHttpInfoDestroy(TSCacheHttpInfo infop); +/* Get Arbitrary Txn info such as cache lookup details etc as defined in TSHttpTxnInfoKey */ +/** + Return the particular txn info requested. + + @param txnp the transaction pointer + @param key the requested txn info. + @param TSMgmtInt a pointer to a integer where the return value is stored + + @return @c TS_SUCCESS if the requested info is supported, TS_ERROR otherwise + +*/ +tsapi TSReturnCode TSHttpTxnInfoGet(TSHttpTxn txnp, TSHttpTxnInfoKey key, TSMgmtInt *value); + /* ===== ICP ===== */ tsapi void TSHttpIcpDynamicSet(int value); http://git-wip-us.apache.org/repos/asf/trafficserver/blob/b5673f75/proxy/http/HttpCacheSM.h ---------------------------------------------------------------------- diff --git a/proxy/http/HttpCacheSM.h b/proxy/http/HttpCacheSM.h index 3c14da3..9190d2a 100644 --- a/proxy/http/HttpCacheSM.h +++ b/proxy/http/HttpCacheSM.h @@ -98,6 +98,48 @@ public: return readwhilewrite_inprogress; } + bool + is_ram_cache_hit() + { + return cache_read_vc ? (cache_read_vc->is_ram_cache_hit()) : 0; + } + + bool + is_compressed_in_ram() + { + return cache_read_vc ? (cache_read_vc->is_compressed_in_ram()) : 0; + } + + inline void + set_open_read_tries(int value) + { + open_read_tries = value; + } + + int + get_open_read_tries() + { + return open_read_tries; + } + + inline void + set_open_write_tries(int value) + { + open_write_tries = value; + } + + int + get_open_write_tries() + { + return open_write_tries; + } + + int + get_volume_number() + { + return cache_read_vc ? (cache_read_vc->get_volume_number()) : -1; + } + inline void abort_read() {
