DEBUG: Add HashTable::operator<<, expand StoredValue::operator<< 87/76187/16
authorDave Rigby <daver@couchbase.com>
Fri, 31 Mar 2017 17:41:19 +0000 (18:41 +0100)
committerDave Rigby <daver@couchbase.com>
Thu, 20 Apr 2017 08:35:05 +0000 (08:35 +0000)
Also fix some formatting on the existing output. Example from dump():

  HashTable[0x104cd4010] with numInMemory:3 numDeleted:2 values:
    OSV @0x104cd1e30 ... WDN.. temp:    seq:5 rev:2 key:"ns:0 1" exp:0 vallen:0
    OSV @0x104cd1de0 ... WDN.. temp:    seq:4 rev:2 key:"ns:0 0" exp:0 vallen:0
    OSV @0x104cd1e80 ... W.N.. temp:    seq:3 rev:1 key:"ns:0 2" exp:0 vallen:2 val:"2"

Change-Id: I8794f0565bf8280d6019443329b5c04730722cb6
Reviewed-on: http://review.couchbase.org/76187
Reviewed-by: Jim Walker <jim@couchbase.com>
Tested-by: Build Bot <build@couchbase.com>
src/ephemeral_vb.cc
src/hash_table.cc
src/hash_table.h
src/linked_list.cc
src/stored-value.cc
src/stored-value.h
src/vbucket.cc

index 28b1c45..d2ce3ec 100644 (file)
@@ -146,10 +146,11 @@ void EphemeralVBucket::addStats(bool details,
 
 void EphemeralVBucket::dump() const {
     std::cerr << "EphemeralVBucket[" << this
-              << "] with state: " << toString(getState())
+              << "] with state:" << toString(getState())
               << " numItems:" << getNumItems()
               << std::endl;
     seqList->dump();
+    std::cerr << ht << std::endl;
 }
 
 ENGINE_ERROR_CODE EphemeralVBucket::completeBGFetchForSingleItem(
index aa7c141..9acd61a 100644 (file)
@@ -742,3 +742,19 @@ void HashTable::unlocked_restoreMeta(const std::unique_lock<std::mutex>& htLock,
         ++datatypeCounts[v.getDatatype()];
     }
 }
+
+std::ostream& operator<<(std::ostream& os, const HashTable& ht) {
+    os << "HashTable[" << &ht << "] with"
+       << " numInMemory:" << ht.getNumInMemoryItems()
+       << " numDeleted:" << ht.getNumDeletedItems()
+       << " values: " << std::endl;
+    for (const auto& chain : ht.values) {
+        if (chain) {
+            for (StoredValue* sv = chain.get(); sv != nullptr;
+                 sv = sv->next.get()) {
+                os << "    " << *sv << std::endl;
+            }
+        }
+    }
+    return os;
+}
index 11a6214..ee73118 100644 (file)
@@ -600,6 +600,7 @@ private:
     using table_type = std::vector<StoredValue::UniquePtr>;
 
     friend class StoredValue;
+    friend std::ostream& operator<<(std::ostream& os, const HashTable& ht);
 
     inline bool isActive() const { return activeState; }
     inline void setActiveState(bool newv) { activeState = newv; }
@@ -672,6 +673,8 @@ private:
     DISALLOW_COPY_AND_ASSIGN(HashTable);
 };
 
+std::ostream& operator<<(std::ostream& os, const HashTable& ht);
+
 /**
  * Base class for visiting a hash table.
  */
index da0acfe..3bff91c 100644 (file)
@@ -351,7 +351,7 @@ std::ostream& operator <<(std::ostream& os, const BasicLinkedList& ll) {
     for (const auto& val : ll.seqList) {
         os << "    " << val << std::endl;
     }
-    os << "]" << std::endl;
+    os << "]";
     return os;
 }
 
index d6d937b..b1a70f8 100644 (file)
@@ -255,11 +255,21 @@ std::ostream& operator<<(std::ostream& os, const StoredValue& sv) {
     os << (sv.isNewCacheItem() ? 'N' : '.');
     os << ' ';
 
-    // seqno, revid
+    // Temporary states
+    os << "temp:"
+       << (sv.isTempInitialItem() ? 'I' : ' ')
+       << (sv.isTempDeletedItem() ? 'D' : ' ')
+       << (sv.isTempNonExistentItem() ? 'N' : ' ')
+       << ' ';
+
+    // seqno, revid, expiry
     os << "seq:" << sv.getBySeqno() << " rev:" << sv.getRevSeqno();
-    os << " key:\"" << sv.getKey();
-    os << "\" val:[";
+    os << " key:\"" << sv.getKey() << "\"";
+    os << " exp:" << sv.getExptime();
+
+    os << " vallen:" << sv.valuelen();
     if (sv.getValue().get()) {
+        os << " val:\"";
         const char* data = sv.getValue()->getData();
         // print up to first 40 bytes of value.
         const size_t limit = std::min(size_t(40), sv.getValue()->vlength());
@@ -269,10 +279,8 @@ std::ostream& operator<<(std::ostream& os, const StoredValue& sv) {
         if (limit < sv.getValue()->vlength()) {
             os << " <cut>";
         }
-    } else {
-        os << "<null>";
+        os << "\"";
     }
-    os << "]";
     return os;
 }
 
index e8515bf..39ff590 100644 (file)
@@ -729,6 +729,7 @@ protected:
 
     friend class HashTable;
     friend class StoredValueFactory;
+    friend std::ostream& operator<<(std::ostream& os, const HashTable& ht);
 
     value_t            value;          // 8 bytes
     // Used to implement HashTable chaining (for elements hashing to the same
index cdac653..cef8e07 100644 (file)
@@ -1825,7 +1825,9 @@ void VBucket::postProcessRollback(const RollbackResult& rollbackResult,
 void VBucket::dump() const {
     std::cerr << "VBucket[" << this << "] with state: " << toString(getState())
               << " numItems:" << getNumItems()
-              << " numNonResident:" << getNumNonResidentItems() << std::endl;
+              << " numNonResident:" << getNumNonResidentItems()
+              << " ht: " << std::endl << "  " << ht << std::endl
+              << "]" << std::endl;
 }
 
 void VBucket::_addStats(bool details, ADD_STAT add_stat, const void* c) {