Summary: as subject Test Plan: run db_bench readrandom Reviewers: dhruba Reviewed By: dhruba CC: MarkCallaghan, emayanke, sheki Differential Revision: https://reviews.facebook.net/D6495main
parent
9b87a2bae8
commit
3fcf533ed0
@ -0,0 +1,92 @@ |
|||||||
|
// Copyright (c) 2012 Facebook. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style license that can be
|
||||||
|
// found in the LICENSE file.
|
||||||
|
|
||||||
|
#include "db/db_impl_readonly.h" |
||||||
|
#include "db/db_impl.h" |
||||||
|
|
||||||
|
#include <algorithm> |
||||||
|
#include <set> |
||||||
|
#include <string> |
||||||
|
#include <stdint.h> |
||||||
|
#include <stdio.h> |
||||||
|
#include <vector> |
||||||
|
#include <algorithm> |
||||||
|
#include "db/db_iter.h" |
||||||
|
#include "db/dbformat.h" |
||||||
|
#include "db/filename.h" |
||||||
|
#include "db/log_reader.h" |
||||||
|
#include "db/log_writer.h" |
||||||
|
#include "db/memtable.h" |
||||||
|
#include "db/table_cache.h" |
||||||
|
#include "db/version_set.h" |
||||||
|
#include "db/write_batch_internal.h" |
||||||
|
#include "leveldb/db.h" |
||||||
|
#include "leveldb/env.h" |
||||||
|
#include "leveldb/status.h" |
||||||
|
#include "leveldb/table.h" |
||||||
|
#include "leveldb/table_builder.h" |
||||||
|
#include "port/port.h" |
||||||
|
#include "table/block.h" |
||||||
|
#include "table/merger.h" |
||||||
|
#include "table/two_level_iterator.h" |
||||||
|
#include "util/coding.h" |
||||||
|
#include "util/logging.h" |
||||||
|
#include "util/build_version.h" |
||||||
|
|
||||||
|
namespace leveldb { |
||||||
|
|
||||||
|
DBImplReadOnly::DBImplReadOnly(const Options& options, |
||||||
|
const std::string& dbname) |
||||||
|
: DBImpl(options, dbname) { |
||||||
|
Log(options_.info_log, "Opening the db in read only mode"); |
||||||
|
} |
||||||
|
|
||||||
|
DBImplReadOnly::~DBImplReadOnly() { |
||||||
|
} |
||||||
|
|
||||||
|
// Implementations of the DB interface
|
||||||
|
Status DBImplReadOnly::Get(const ReadOptions& options, |
||||||
|
const Slice& key, |
||||||
|
std::string* value) { |
||||||
|
Status s; |
||||||
|
Version* current = versions_->current(); |
||||||
|
SequenceNumber snapshot = versions_->LastSequence(); |
||||||
|
LookupKey lkey(key, snapshot); |
||||||
|
Version::GetStats stats; |
||||||
|
s = current->Get(options, lkey, value, &stats); |
||||||
|
return s; |
||||||
|
} |
||||||
|
|
||||||
|
Iterator* DBImplReadOnly::NewIterator(const ReadOptions& options) { |
||||||
|
std::vector<Iterator*> list; |
||||||
|
versions_->current()->AddIterators(options, &list); |
||||||
|
Iterator* internal_iter = |
||||||
|
NewMergingIterator(&internal_comparator_, &list[0], list.size()); |
||||||
|
return NewDBIterator( |
||||||
|
&dbname_, env_, user_comparator(), internal_iter, |
||||||
|
reinterpret_cast<const SnapshotImpl*>(options.snapshot)->number_); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
Status DB::OpenForReadOnly(const Options& options, const std::string& dbname, |
||||||
|
DB** dbptr, bool no_log_recory, bool error_if_log_file_exist) { |
||||||
|
*dbptr = NULL; |
||||||
|
|
||||||
|
DBImplReadOnly* impl = new DBImplReadOnly(options, dbname); |
||||||
|
impl->mutex_.Lock(); |
||||||
|
VersionEdit edit(impl->NumberLevels()); |
||||||
|
Status s = impl->Recover(&edit, no_log_recory, error_if_log_file_exist); |
||||||
|
if (s.ok() && !no_log_recory) { |
||||||
|
s = impl->versions_->LogAndApply(&edit, &impl->mutex_); |
||||||
|
} |
||||||
|
impl->mutex_.Unlock(); |
||||||
|
if (s.ok()) { |
||||||
|
*dbptr = impl; |
||||||
|
} else { |
||||||
|
delete impl; |
||||||
|
} |
||||||
|
return s; |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,72 @@ |
|||||||
|
// Copyright (c) 2012 Facebook. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style license that can be
|
||||||
|
// found in the LICENSE file.
|
||||||
|
|
||||||
|
#ifndef STORAGE_LEVELDB_DB_DB_IMPL_READONLY_H_ |
||||||
|
#define STORAGE_LEVELDB_DB_DB_IMPL_READONLY_H_ |
||||||
|
|
||||||
|
#include "db/db_impl.h" |
||||||
|
|
||||||
|
#include <deque> |
||||||
|
#include <set> |
||||||
|
#include "db/dbformat.h" |
||||||
|
#include "db/log_writer.h" |
||||||
|
#include "db/snapshot.h" |
||||||
|
#include "leveldb/db.h" |
||||||
|
#include "leveldb/env.h" |
||||||
|
#include "port/port.h" |
||||||
|
#include "util/stats_logger.h" |
||||||
|
|
||||||
|
#ifdef USE_SCRIBE |
||||||
|
#include "scribe/scribe_logger.h" |
||||||
|
#endif |
||||||
|
|
||||||
|
namespace leveldb { |
||||||
|
|
||||||
|
class DBImplReadOnly : public DBImpl { |
||||||
|
public: |
||||||
|
DBImplReadOnly(const Options& options, const std::string& dbname); |
||||||
|
virtual ~DBImplReadOnly(); |
||||||
|
|
||||||
|
// Implementations of the DB interface
|
||||||
|
virtual Status Get(const ReadOptions& options, |
||||||
|
const Slice& key, |
||||||
|
std::string* value); |
||||||
|
virtual Iterator* NewIterator(const ReadOptions&); |
||||||
|
|
||||||
|
virtual Status Put(const WriteOptions&, const Slice& key, const Slice& value) { |
||||||
|
return Status::NotSupported("Not supported operation in read only mode."); |
||||||
|
} |
||||||
|
virtual Status Delete(const WriteOptions&, const Slice& key) { |
||||||
|
return Status::NotSupported("Not supported operation in read only mode."); |
||||||
|
} |
||||||
|
virtual Status Write(const WriteOptions& options, WriteBatch* updates) { |
||||||
|
return Status::NotSupported("Not supported operation in read only mode."); |
||||||
|
} |
||||||
|
virtual void CompactRange(const Slice* begin, const Slice* end) { |
||||||
|
} |
||||||
|
virtual Status DisableFileDeletions() { |
||||||
|
return Status::NotSupported("Not supported operation in read only mode."); |
||||||
|
} |
||||||
|
virtual Status EnableFileDeletions() { |
||||||
|
return Status::NotSupported("Not supported operation in read only mode."); |
||||||
|
} |
||||||
|
virtual Status GetLiveFiles(std::vector<std::string>&, |
||||||
|
uint64_t* manifest_file_size) { |
||||||
|
return Status::NotSupported("Not supported operation in read only mode."); |
||||||
|
} |
||||||
|
virtual Status Flush(const FlushOptions& options) { |
||||||
|
return Status::NotSupported("Not supported operation in read only mode."); |
||||||
|
} |
||||||
|
|
||||||
|
private: |
||||||
|
friend class DB; |
||||||
|
|
||||||
|
// No copying allowed
|
||||||
|
DBImplReadOnly(const DBImplReadOnly&); |
||||||
|
void operator=(const DBImplReadOnly&); |
||||||
|
}; |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
#endif |
Loading…
Reference in new issue