Esempio n. 1
0
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;
}
Esempio n. 3
0
 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);
 }
Esempio n. 4
0
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;
}
Esempio n. 5
0
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;
}
Esempio n. 6
0
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;
}