Summary: Store links to live files in directory on same disk Test Plan: Take snapshot and open it. Added a test GetSnapshotLink in db_test. Reviewers: sdong Reviewed By: sdong Subscribers: dhruba, leveldb Differential Revision: https://reviews.facebook.net/D28713main
parent
9be338cf9d
commit
6c1b040cc9
@ -0,0 +1,59 @@ |
||||
// Copyright (c) 2013, Facebook, Inc. All rights reserved.
|
||||
// This source code is licensed under the BSD-style license found in the
|
||||
// LICENSE file in the root directory of this source tree. An additional grant
|
||||
// of patent rights can be found in the PATENTS file in the same directory.
|
||||
//
|
||||
#include <string> |
||||
#include <algorithm> |
||||
#include "util/file_util.h" |
||||
#include "rocksdb/env.h" |
||||
#include "db/filename.h" |
||||
|
||||
namespace rocksdb { |
||||
|
||||
// Utility function to copy a file up to a specified length
|
||||
Status CopyFile(Env* env, const std::string& source, |
||||
const std::string& destination, uint64_t size) { |
||||
const EnvOptions soptions; |
||||
unique_ptr<SequentialFile> srcfile; |
||||
Status s; |
||||
s = env->NewSequentialFile(source, &srcfile, soptions); |
||||
unique_ptr<WritableFile> destfile; |
||||
if (s.ok()) { |
||||
s = env->NewWritableFile(destination, &destfile, soptions); |
||||
} else { |
||||
return s; |
||||
} |
||||
|
||||
if (size == 0) { |
||||
// default argument means copy everything
|
||||
if (s.ok()) { |
||||
s = env->GetFileSize(source, &size); |
||||
} else { |
||||
return s; |
||||
} |
||||
} |
||||
|
||||
char buffer[4096]; |
||||
Slice slice; |
||||
while (size > 0) { |
||||
uint64_t bytes_to_read = |
||||
std::min(static_cast<uint64_t>(sizeof(buffer)), size); |
||||
if (s.ok()) { |
||||
s = srcfile->Read(bytes_to_read, &slice, buffer); |
||||
} |
||||
if (s.ok()) { |
||||
if (slice.size() == 0) { |
||||
return Status::Corruption("file too small"); |
||||
} |
||||
s = destfile->Append(slice); |
||||
} |
||||
if (!s.ok()) { |
||||
return s; |
||||
} |
||||
size -= slice.size(); |
||||
} |
||||
return Status::OK(); |
||||
} |
||||
|
||||
} // namespace rocksdb
|
@ -0,0 +1,18 @@ |
||||
// Copyright (c) 2013, Facebook, Inc. All rights reserved.
|
||||
// This source code is licensed under the BSD-style license found in the
|
||||
// LICENSE file in the root directory of this source tree. An additional grant
|
||||
// of patent rights can be found in the PATENTS file in the same directory.
|
||||
//
|
||||
#include <string> |
||||
|
||||
#pragma once |
||||
#include "rocksdb/status.h" |
||||
#include "rocksdb/types.h" |
||||
#include "rocksdb/env.h" |
||||
|
||||
namespace rocksdb { |
||||
|
||||
extern Status CopyFile(Env* env, const std::string& source, |
||||
const std::string& destination, uint64_t size = 0); |
||||
|
||||
} // namespace rocksdb
|
Loading…
Reference in new issue