|
|
|
// 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.
|
|
|
|
#pragma once
|
|
|
|
|
|
|
|
#include <stdint.h>
|
|
|
|
|
|
|
|
#include <memory>
|
|
|
|
|
|
|
|
#include "db/log_format.h"
|
Pass IOStatus to write path and set retryable IO Error as hard error in BG jobs (#6487)
Summary:
In the current code base, we use Status to get and store the returned status from the call. Specifically, for IO related functions, the current Status cannot reflect the IO Error details such as error scope, error retryable attribute, and others. With the implementation of https://github.com/facebook/rocksdb/issues/5761, we have the new Wrapper for IO, which returns IOStatus instead of Status. However, the IOStatus is purged at the lower level of write path and transferred to Status.
The first job of this PR is to pass the IOStatus to the write path (flush, WAL write, and Compaction). The second job is to identify the Retryable IO Error as HardError, and set the bg_error_ as HardError. In this case, the DB Instance becomes read only. User is informed of the Status and need to take actions to deal with it (e.g., call db->Resume()).
Pull Request resolved: https://github.com/facebook/rocksdb/pull/6487
Test Plan: Added the testing case to error_handler_fs_test. Pass make asan_check
Reviewed By: anand1976
Differential Revision: D20685017
Pulled By: zhichao-cao
fbshipit-source-id: ff85f042896243abcd6ef37877834e26f36b6eb0
5 years ago
|
|
|
#include "rocksdb/io_status.h"
|
|
|
|
#include "rocksdb/slice.h"
|
|
|
|
#include "rocksdb/status.h"
|
|
|
|
|
|
|
|
namespace ROCKSDB_NAMESPACE {
|
|
|
|
|
Move rate_limiter, write buffering, most perf context instrumentation and most random kill out of Env
Summary: We want to keep Env a think layer for better portability. Less platform dependent codes should be moved out of Env. In this patch, I create a wrapper of file readers and writers, and put rate limiting, write buffering, as well as most perf context instrumentation and random kill out of Env. It will make it easier to maintain multiple Env in the future.
Test Plan: Run all existing unit tests.
Reviewers: anthony, kradhakrishnan, IslamAbdelRahman, yhchiang, igor
Reviewed By: igor
Subscribers: leveldb, dhruba
Differential Revision: https://reviews.facebook.net/D42321
10 years ago
|
|
|
class WritableFileWriter;
|
|
|
|
|
|
|
|
namespace log {
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Writer is a general purpose log stream writer. It provides an append-only
|
|
|
|
* abstraction for writing data. The details of the how the data is written is
|
|
|
|
* handled by the WriteableFile sub-class implementation.
|
|
|
|
*
|
|
|
|
* File format:
|
|
|
|
*
|
|
|
|
* File is broken down into variable sized records. The format of each record
|
|
|
|
* is described below.
|
|
|
|
* +-----+-------------+--+----+----------+------+-- ... ----+
|
|
|
|
* File | r0 | r1 |P | r2 | r3 | r4 | |
|
|
|
|
* +-----+-------------+--+----+----------+------+-- ... ----+
|
|
|
|
* <--- kBlockSize ------>|<-- kBlockSize ------>|
|
|
|
|
* rn = variable size records
|
|
|
|
* P = Padding
|
|
|
|
*
|
|
|
|
* Data is written out in kBlockSize chunks. If next record does not fit
|
|
|
|
* into the space left, the leftover space will be padded with \0.
|
|
|
|
*
|
|
|
|
* Legacy record format:
|
|
|
|
*
|
|
|
|
* +---------+-----------+-----------+--- ... ---+
|
|
|
|
* |CRC (4B) | Size (2B) | Type (1B) | Payload |
|
|
|
|
* +---------+-----------+-----------+--- ... ---+
|
|
|
|
*
|
|
|
|
* CRC = 32bit hash computed over the record type and payload using CRC
|
|
|
|
* Size = Length of the payload data
|
|
|
|
* Type = Type of record
|
|
|
|
* (kZeroType, kFullType, kFirstType, kLastType, kMiddleType )
|
|
|
|
* The type is used to group a bunch of records together to represent
|
|
|
|
* blocks that are larger than kBlockSize
|
|
|
|
* Payload = Byte stream as long as specified by the payload size
|
|
|
|
*
|
|
|
|
* Recyclable record format:
|
|
|
|
*
|
|
|
|
* +---------+-----------+-----------+----------------+--- ... ---+
|
|
|
|
* |CRC (4B) | Size (2B) | Type (1B) | Log number (4B)| Payload |
|
|
|
|
* +---------+-----------+-----------+----------------+--- ... ---+
|
|
|
|
*
|
|
|
|
* Same as above, with the addition of
|
|
|
|
* Log number = 32bit log file number, so that we can distinguish between
|
|
|
|
* records written by the most recent log writer vs a previous one.
|
|
|
|
*/
|
|
|
|
class Writer {
|
|
|
|
public:
|
|
|
|
// Create a writer that will append data to "*dest".
|
|
|
|
// "*dest" must be initially empty.
|
|
|
|
// "*dest" must remain live while this Writer is in use.
|
|
|
|
explicit Writer(std::unique_ptr<WritableFileWriter>&& dest,
|
|
|
|
uint64_t log_number, bool recycle_log_files,
|
|
|
|
bool manual_flush = false);
|
|
|
|
// No copying allowed
|
|
|
|
Writer(const Writer&) = delete;
|
|
|
|
void operator=(const Writer&) = delete;
|
|
|
|
|
|
|
|
~Writer();
|
|
|
|
|
Pass IOStatus to write path and set retryable IO Error as hard error in BG jobs (#6487)
Summary:
In the current code base, we use Status to get and store the returned status from the call. Specifically, for IO related functions, the current Status cannot reflect the IO Error details such as error scope, error retryable attribute, and others. With the implementation of https://github.com/facebook/rocksdb/issues/5761, we have the new Wrapper for IO, which returns IOStatus instead of Status. However, the IOStatus is purged at the lower level of write path and transferred to Status.
The first job of this PR is to pass the IOStatus to the write path (flush, WAL write, and Compaction). The second job is to identify the Retryable IO Error as HardError, and set the bg_error_ as HardError. In this case, the DB Instance becomes read only. User is informed of the Status and need to take actions to deal with it (e.g., call db->Resume()).
Pull Request resolved: https://github.com/facebook/rocksdb/pull/6487
Test Plan: Added the testing case to error_handler_fs_test. Pass make asan_check
Reviewed By: anand1976
Differential Revision: D20685017
Pulled By: zhichao-cao
fbshipit-source-id: ff85f042896243abcd6ef37877834e26f36b6eb0
5 years ago
|
|
|
IOStatus AddRecord(const Slice& slice);
|
|
|
|
|
Move rate_limiter, write buffering, most perf context instrumentation and most random kill out of Env
Summary: We want to keep Env a think layer for better portability. Less platform dependent codes should be moved out of Env. In this patch, I create a wrapper of file readers and writers, and put rate limiting, write buffering, as well as most perf context instrumentation and random kill out of Env. It will make it easier to maintain multiple Env in the future.
Test Plan: Run all existing unit tests.
Reviewers: anthony, kradhakrishnan, IslamAbdelRahman, yhchiang, igor
Reviewed By: igor
Subscribers: leveldb, dhruba
Differential Revision: https://reviews.facebook.net/D42321
10 years ago
|
|
|
WritableFileWriter* file() { return dest_.get(); }
|
|
|
|
const WritableFileWriter* file() const { return dest_.get(); }
|
|
|
|
|
|
|
|
uint64_t get_log_number() const { return log_number_; }
|
|
|
|
|
Pass IOStatus to write path and set retryable IO Error as hard error in BG jobs (#6487)
Summary:
In the current code base, we use Status to get and store the returned status from the call. Specifically, for IO related functions, the current Status cannot reflect the IO Error details such as error scope, error retryable attribute, and others. With the implementation of https://github.com/facebook/rocksdb/issues/5761, we have the new Wrapper for IO, which returns IOStatus instead of Status. However, the IOStatus is purged at the lower level of write path and transferred to Status.
The first job of this PR is to pass the IOStatus to the write path (flush, WAL write, and Compaction). The second job is to identify the Retryable IO Error as HardError, and set the bg_error_ as HardError. In this case, the DB Instance becomes read only. User is informed of the Status and need to take actions to deal with it (e.g., call db->Resume()).
Pull Request resolved: https://github.com/facebook/rocksdb/pull/6487
Test Plan: Added the testing case to error_handler_fs_test. Pass make asan_check
Reviewed By: anand1976
Differential Revision: D20685017
Pulled By: zhichao-cao
fbshipit-source-id: ff85f042896243abcd6ef37877834e26f36b6eb0
5 years ago
|
|
|
IOStatus WriteBuffer();
|
|
|
|
|
Pass IOStatus to write path and set retryable IO Error as hard error in BG jobs (#6487)
Summary:
In the current code base, we use Status to get and store the returned status from the call. Specifically, for IO related functions, the current Status cannot reflect the IO Error details such as error scope, error retryable attribute, and others. With the implementation of https://github.com/facebook/rocksdb/issues/5761, we have the new Wrapper for IO, which returns IOStatus instead of Status. However, the IOStatus is purged at the lower level of write path and transferred to Status.
The first job of this PR is to pass the IOStatus to the write path (flush, WAL write, and Compaction). The second job is to identify the Retryable IO Error as HardError, and set the bg_error_ as HardError. In this case, the DB Instance becomes read only. User is informed of the Status and need to take actions to deal with it (e.g., call db->Resume()).
Pull Request resolved: https://github.com/facebook/rocksdb/pull/6487
Test Plan: Added the testing case to error_handler_fs_test. Pass make asan_check
Reviewed By: anand1976
Differential Revision: D20685017
Pulled By: zhichao-cao
fbshipit-source-id: ff85f042896243abcd6ef37877834e26f36b6eb0
5 years ago
|
|
|
IOStatus Close();
|
|
|
|
|
|
|
|
bool TEST_BufferIsEmpty();
|
|
|
|
|
|
|
|
private:
|
|
|
|
std::unique_ptr<WritableFileWriter> dest_;
|
|
|
|
size_t block_offset_; // Current offset in block
|
|
|
|
uint64_t log_number_;
|
|
|
|
bool recycle_log_files_;
|
|
|
|
|
|
|
|
// crc32c values for all supported record types. These are
|
|
|
|
// pre-computed to reduce the overhead of computing the crc of the
|
|
|
|
// record type stored in the header.
|
|
|
|
uint32_t type_crc_[kMaxRecordType + 1];
|
|
|
|
|
Pass IOStatus to write path and set retryable IO Error as hard error in BG jobs (#6487)
Summary:
In the current code base, we use Status to get and store the returned status from the call. Specifically, for IO related functions, the current Status cannot reflect the IO Error details such as error scope, error retryable attribute, and others. With the implementation of https://github.com/facebook/rocksdb/issues/5761, we have the new Wrapper for IO, which returns IOStatus instead of Status. However, the IOStatus is purged at the lower level of write path and transferred to Status.
The first job of this PR is to pass the IOStatus to the write path (flush, WAL write, and Compaction). The second job is to identify the Retryable IO Error as HardError, and set the bg_error_ as HardError. In this case, the DB Instance becomes read only. User is informed of the Status and need to take actions to deal with it (e.g., call db->Resume()).
Pull Request resolved: https://github.com/facebook/rocksdb/pull/6487
Test Plan: Added the testing case to error_handler_fs_test. Pass make asan_check
Reviewed By: anand1976
Differential Revision: D20685017
Pulled By: zhichao-cao
fbshipit-source-id: ff85f042896243abcd6ef37877834e26f36b6eb0
5 years ago
|
|
|
IOStatus EmitPhysicalRecord(RecordType type, const char* ptr, size_t length);
|
|
|
|
|
|
|
|
// If true, it does not flush after each write. Instead it relies on the upper
|
|
|
|
// layer to manually does the flush by calling ::WriteBuffer()
|
|
|
|
bool manual_flush_;
|
|
|
|
};
|
|
|
|
|
|
|
|
} // namespace log
|
|
|
|
} // namespace ROCKSDB_NAMESPACE
|