blob: 051bf7d8c0c59217fc163389a1b8f2892a2125c1 [file]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
#ifndef FILE_RESTORABLE_TSFILE_IO_WRITER_H
#define FILE_RESTORABLE_TSFILE_IO_WRITER_H
#include <memory>
#include <set>
#include <string>
#include <vector>
#include "common/schema.h"
#include "common/tsfile_common.h"
#include "file/tsfile_io_writer.h"
#include "file/write_file.h"
namespace storage {
/**
* TsFile check status constants for self-check result.
* COMPLETE_FILE (0): File is complete, no recovery needed.
* INCOMPATIBLE_FILE (-2): File is not in TsFile format.
*/
constexpr int64_t TSFILE_CHECK_COMPLETE = 0;
constexpr int64_t TSFILE_CHECK_INCOMPATIBLE = -2;
/**
* RestorableTsFileIOWriter opens and optionally recovers a TsFile.
* Inherits from TsFileIOWriter for continued writing after recovery.
*
* (1) If the TsFile is closed normally: has_crashed()=false, can_write()=false
*
* (2) If the TsFile is incomplete/crashed: has_crashed()=true,
* can_write()=true, the writer truncates corrupted data and allows continued
* writing.
*
* Uses standard C++11 and avoids memory leaks via RAII and smart pointers.
*/
class RestorableTsFileIOWriter : public TsFileIOWriter {
public:
RestorableTsFileIOWriter();
~RestorableTsFileIOWriter();
// Non-copyable
RestorableTsFileIOWriter(const RestorableTsFileIOWriter&) = delete;
RestorableTsFileIOWriter& operator=(const RestorableTsFileIOWriter&) =
delete;
/**
* Open a TsFile for recovery/append.
* Uses O_RDWR|O_CREAT without O_TRUNC, so existing file content is
* preserved.
*
* @param file_path Path to the TsFile
* @param truncate_corrupted If true, truncate corrupted data. If false,
* do not truncate (incomplete file will remain as-is).
* @return E_OK on success, error code otherwise.
*/
int open(const std::string& file_path, bool truncate_corrupted = true);
void close();
bool can_write() const { return can_write_; }
bool has_crashed() const { return crashed_; }
int64_t get_truncated_size() const { return truncated_size_; }
std::shared_ptr<Schema> get_known_schema() { return get_schema(); }
/** True if the device was recovered as aligned (has time column). */
bool is_device_aligned(const std::string& device) const;
/**
* Recovered chunk group metas from self_check (actual device_id and chunk
* metas from file). TsFileWriter::init() uses this to rebuild schemas_
* with the real device keys (aligned with Java). Valid until close().
*/
const std::vector<ChunkGroupMeta*>& get_recovered_chunk_group_metas()
const {
return self_check_recovered_cgm_;
}
/**
* Get the TsFileIOWriter for continued writing. Only valid when
* can_write() is true. Returns this (since we inherit TsFileIOWriter).
*/
TsFileIOWriter* get_tsfile_io_writer();
/**
* Get the WriteFile for TsFileWriter::init(). Only valid when can_write().
* Caller must not destroy the returned pointer.
*/
WriteFile* get_write_file();
std::string get_file_path() const;
private:
int self_check(bool truncate_corrupted);
private:
std::string file_path_;
WriteFile* write_file_;
bool write_file_owned_;
int64_t truncated_size_;
bool crashed_;
bool can_write_;
std::set<std::string> aligned_devices_;
common::PageArena self_check_arena_;
/** ChunkGroupMeta* allocated from self_check_arena_; reset device_id before
* arena destroy to avoid leak. */
std::vector<ChunkGroupMeta*> self_check_recovered_cgm_;
};
} // namespace storage
#endif // FILE_RESTORABLE_TSFILE_IO_WRITER_H