2019-09-16 19:31:27 +02:00
|
|
|
// Copyright (c) 2011-present, Facebook, Inc. All rights reserved.
|
|
|
|
// This source code is licensed under both the GPLv2 (found in the
|
|
|
|
// COPYING file in the root directory) and Apache 2.0 License
|
|
|
|
// (found in the LICENSE.Apache file in the root directory).
|
|
|
|
//
|
|
|
|
// Copyright (c) 2011 The LevelDB Authors. All rights reserved.
|
|
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
|
|
// found in the LICENSE file. See the AUTHORS file for names of contributors.
|
|
|
|
|
|
|
|
#include "file/read_write_util.h"
|
|
|
|
|
|
|
|
#include <sstream>
|
|
|
|
#include "test_util/sync_point.h"
|
|
|
|
|
|
|
|
namespace rocksdb {
|
|
|
|
Status NewWritableFile(Env* env, const std::string& fname,
|
|
|
|
std::unique_ptr<WritableFile>* result,
|
|
|
|
const EnvOptions& options) {
|
|
|
|
Status s = env->NewWritableFile(fname, result, options);
|
|
|
|
TEST_KILL_RANDOM("NewWritableFile:0", rocksdb_kill_odds * REDUCE_ODDS2);
|
|
|
|
return s;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool ReadOneLine(std::istringstream* iss, SequentialFile* seq_file,
|
|
|
|
std::string* output, bool* has_data, Status* result) {
|
|
|
|
const int kBufferSize = 8192;
|
|
|
|
char buffer[kBufferSize + 1];
|
|
|
|
Slice input_slice;
|
|
|
|
|
|
|
|
std::string line;
|
|
|
|
bool has_complete_line = false;
|
|
|
|
while (!has_complete_line) {
|
|
|
|
if (std::getline(*iss, line)) {
|
|
|
|
has_complete_line = !iss->eof();
|
|
|
|
} else {
|
|
|
|
has_complete_line = false;
|
|
|
|
}
|
|
|
|
if (!has_complete_line) {
|
|
|
|
// if we're not sure whether we have a complete line,
|
|
|
|
// further read from the file.
|
|
|
|
if (*has_data) {
|
|
|
|
*result = seq_file->Read(kBufferSize, &input_slice, buffer);
|
|
|
|
}
|
|
|
|
if (input_slice.size() == 0) {
|
|
|
|
// meaning we have read all the data
|
|
|
|
*has_data = false;
|
|
|
|
break;
|
|
|
|
} else {
|
|
|
|
iss->str(line + input_slice.ToString());
|
|
|
|
// reset the internal state of iss so that we can keep reading it.
|
|
|
|
iss->clear();
|
|
|
|
*has_data = (input_slice.size() == kBufferSize);
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
*output = line;
|
|
|
|
return *has_data || has_complete_line;
|
|
|
|
}
|
|
|
|
|
2019-09-17 05:40:44 +02:00
|
|
|
#ifndef NDEBUG
|
|
|
|
bool IsFileSectorAligned(const size_t off, size_t sector_size) {
|
|
|
|
return off % sector_size == 0;
|
|
|
|
}
|
|
|
|
#endif // NDEBUG
|
2019-09-16 19:31:27 +02:00
|
|
|
} // namespace rocksdb
|