blob: f415cb958d3631fe37585e1ae43fe231ffb96fa1 [file] [log] [blame]
// 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.
#pragma once
#include <sys/types.h>
#include <map>
#include <set>
#include <string>
#include <vector>
#include "common/logging.h"
#include "common/status.h"
namespace doris {
// DiskInfo is an interface to query for the disk information at runtime. This
// contains information about the system as well as the specific data node
// configuration.
// This information is pulled from /proc/partitions.
// TODO: datanode information not implemented
class DiskInfo {
public:
// Initialize DiskInfo. Just be called before any other functions.
static void init();
// Returns the number of (logical) disks on the system
static int num_disks() {
DCHECK(_s_initialized);
return _s_disks.size();
}
// Returns the 0-based disk index for 'path' (path must be a FS path, not
// hdfs path).
static int disk_id(const char* path);
// Returns the device name (e.g. sda) for disk_id
static const std::string& device_name(int disk_id) {
DCHECK_GE(disk_id, 0);
DCHECK_LT(disk_id, _s_disks.size());
return _s_disks[disk_id].name;
}
static bool is_rotational(int disk_id) {
DCHECK_GE(disk_id, 0);
DCHECK_LT(disk_id, _s_disks.size());
return _s_disks[disk_id].is_rotational;
}
static std::string debug_string();
// get disk devices of given path
static Status get_disk_devices(const std::vector<std::string>& paths,
std::set<std::string>* devices);
private:
static bool _s_initialized;
struct Disk {
// Name of the disk (e.g. sda)
std::string name;
// 0 based index. Does not map to anything in the system, useful to index into
// our structures
int id;
bool is_rotational;
Disk() : name(""), id(0) {}
Disk(const std::string& name) : name(name), id(0), is_rotational(true) {}
Disk(const std::string& name, int id) : name(name), id(id), is_rotational(true) {}
Disk(const std::string& name, int id, bool is_rotational)
: name(name), id(id), is_rotational(is_rotational) {}
};
// All disks
static std::vector<Disk> _s_disks;
// mapping of dev_ts to disk ids
static std::map<dev_t, int> _s_device_id_to_disk_id;
// mapping of devices names to disk ids
static std::map<std::string, int> _s_disk_name_to_disk_id;
static int _s_num_datanode_dirs;
static void get_device_names();
};
} // namespace doris