char *SharedStoreFileStorage::put(const char *data, int32_t len) { Lock lock(m_lock); if (m_state != StorageState::Open || len + PaddingSize > m_chunkSize - PaddingSize) { return nullptr; } if (len + PaddingSize > m_chunkRemain && !addFile()) { m_state = StorageState::Full; return nullptr; } assert(m_current); assert(len + PaddingSize <= m_chunkRemain); strhash_t h = hash_string_inline(data, len); *(strhash_t*)m_current = h; m_current += sizeof(h); *(int32_t*)m_current = len; m_current += sizeof(len); // should be no overlap memcpy(m_current, data, len); char *addr = m_current; addr[len] = '\0'; m_current += len + sizeof(char); *(strhash_t*)m_current = TombHash; m_chunkRemain -= len + PaddingSize; return addr; }
char *SharedStoreFileStorage::put(const char *data, int32 len) { Lock lock(m_lock); if (m_state != StateOpen || len + PaddingSize > m_chunkSize - PaddingSize) { return NULL; } if (len + PaddingSize > m_chunkRemain && !addFile()) { m_state = StateFull; return NULL; } ASSERT(m_current); ASSERT(len + PaddingSize <= m_chunkRemain); int64 h = hash_string_inline(data, len); *(int64*)m_current = h; m_current += sizeof(h); *(int32*)m_current = len; m_current += sizeof(len); // should be no overlap memcpy(m_current, data, len); char *addr = m_current; addr[len] = '\0'; m_current += len + sizeof(char); *(int64*)m_current = TombHash; m_chunkRemain -= len + PaddingSize; return addr; }
size_t operator()(StrInternKey k) const { assert(k > 0 || k < kAhmMagicThreshold); if (LIKELY(k > 0)) { return to_sdata(k)->hash(); } auto const slice = *to_sslice(k); return hash_string_inline(slice.ptr, slice.len); }
HOT_FUNC strhash_t StringData::hashHelper() const { strhash_t h = isShared() ? m_big.shared->stringHash() : hash_string_inline(m_data, m_len); assert(h >= 0); m_hash |= h; return h; }
HOT_FUNC strhash_t StringData::hashHelper() const { // We don't want to collect taint for a hash strhash_t h = isShared() ? m_big.shared->stringHash() : hash_string_inline(m_data, m_len); ASSERT(h >= 0); m_hash |= h; return h; }
bool SharedStoreFileStorage::hashCheck() { Lock lock(m_lock); for (int i = 0; i < (int)m_chunks.size(); i++) { char *current = (char*)m_chunks[i]; char *boundary = (char*)m_chunks[i] + m_chunkSize; while (1) { strhash_t h = *(strhash_t*)current; if (h == TombHash) { break; } current += sizeof(h); int32_t len = *(int32_t*)current; current += sizeof(len); if (len < 0 || len + PaddingSize >= (int64_t)boundary - (int64_t)current) { Logger::Error("invalid len %d at chunk %d offset %" PRId64, len, i, (int64_t)current - (int64_t)m_chunks[i]); return false; } strhash_t h_data = hash_string_inline(current, len); if (h_data != h) { Logger::Error("invalid hash at chunk %d offset %" PRId64, i, (int64_t)current - (int64_t)m_chunks[i]); return false; } current += len; if (*current != '\0') { Logger::Error("missing \\0 at chunk %d offset %" PRId64, i, (int64_t)current - (int64_t)m_chunks[i]); return false; } current++; } } return true; }