blob: ff2422dbbb6b1022775ca4b2fcff2e2f33ffd9b5 [file] [log] [blame]
Shuo Chen478204c2014-03-18 18:27:04 -07001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2/**
Alexander Afanasyev42290b22017-03-09 12:58:29 -08003 * Copyright (c) 2014-2017, Regents of the University of California.
Alexander Afanasyeve1e6f2a2014-04-25 11:28:12 -07004 *
5 * This file is part of NDN repo-ng (Next generation of NDN repository).
6 * See AUTHORS.md for complete list of repo-ng authors and contributors.
7 *
8 * repo-ng is free software: you can redistribute it and/or modify it under the terms
9 * of the GNU General Public License as published by the Free Software Foundation,
10 * either version 3 of the License, or (at your option) any later version.
11 *
12 * repo-ng is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
13 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
14 * PURPOSE. See the GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License along with
17 * repo-ng, e.g., in COPYING.md file. If not, see <http://www.gnu.org/licenses/>.
Shuo Chen478204c2014-03-18 18:27:04 -070018 */
19
20#include "repo.hpp"
Weiqi Shif0330d52014-07-09 10:54:27 -070021#include "storage/sqlite-storage.hpp"
Wentao Shanga8f3c402014-10-30 14:03:27 -070022
Shuo Chen478204c2014-03-18 18:27:04 -070023namespace repo {
24
25RepoConfig
26parseConfig(const std::string& configPath)
27{
28 if (configPath.empty()) {
29 std::cerr << "configuration file path is empty" << std::endl;
30 }
31
32 std::ifstream fin(configPath.c_str());
33 if (!fin.is_open())
Alexander Afanasyev42290b22017-03-09 12:58:29 -080034 BOOST_THROW_EXCEPTION(Repo::Error("failed to open configuration file '"+ configPath +"'"));
Shuo Chen478204c2014-03-18 18:27:04 -070035
36 using namespace boost::property_tree;
37 ptree propertyTree;
38 try {
39 read_info(fin, propertyTree);
40 }
Alexander Afanasyev42290b22017-03-09 12:58:29 -080041 catch (const ptree_error& e) {
42 BOOST_THROW_EXCEPTION(Repo::Error("failed to read configuration file '"+ configPath +"'"));
Shuo Chen478204c2014-03-18 18:27:04 -070043 }
44
45 ptree repoConf = propertyTree.get_child("repo");
46
47 RepoConfig repoConfig;
Shuo Chen028dcd32014-06-21 16:36:44 +080048 repoConfig.repoConfigPath = configPath;
Shuo Chen478204c2014-03-18 18:27:04 -070049
50 ptree dataConf = repoConf.get_child("data");
Shuo Chen478204c2014-03-18 18:27:04 -070051 for (ptree::const_iterator it = dataConf.begin();
52 it != dataConf.end();
53 ++it)
54 {
55 if (it->first == "prefix")
56 repoConfig.dataPrefixes.push_back(Name(it->second.get_value<std::string>()));
57 else
Alexander Afanasyev42290b22017-03-09 12:58:29 -080058 BOOST_THROW_EXCEPTION(Repo::Error("Unrecognized '" + it->first + "' option in 'data' section in "
59 "configuration file '"+ configPath +"'"));
Shuo Chen478204c2014-03-18 18:27:04 -070060 }
61
62 ptree commandConf = repoConf.get_child("command");
63 for (ptree::const_iterator it = commandConf.begin();
64 it != commandConf.end();
65 ++it)
66 {
67 if (it->first == "prefix")
68 repoConfig.repoPrefixes.push_back(Name(it->second.get_value<std::string>()));
69 else
Alexander Afanasyev42290b22017-03-09 12:58:29 -080070 BOOST_THROW_EXCEPTION(Repo::Error("Unrecognized '" + it->first + "' option in 'command' section in "
71 "configuration file '"+ configPath +"'"));
Shuo Chen478204c2014-03-18 18:27:04 -070072 }
73
74 ptree tcpBulkInsert = repoConf.get_child("tcp_bulk_insert");
75 bool isTcpBulkEnabled = false;
76 std::string host = "localhost";
77 std::string port = "7376";
78 for (ptree::const_iterator it = tcpBulkInsert.begin();
79 it != tcpBulkInsert.end();
80 ++it)
81 {
82 isTcpBulkEnabled = true;
83
84 // tcp_bulk_insert {
85 // host "localhost" ; IP address or hostname to listen on
86 // port 7635 ; Port number to listen on
87 // }
88 if (it->first == "host") {
89 host = it->second.get_value<std::string>();
90 }
91 else if (it->first == "port") {
92 port = it->second.get_value<std::string>();
93 }
94 else
Alexander Afanasyev42290b22017-03-09 12:58:29 -080095 BOOST_THROW_EXCEPTION(Repo::Error("Unrecognized '" + it->first + "' option in 'tcp_bulk_insert' section in "
96 "configuration file '"+ configPath +"'"));
Shuo Chen478204c2014-03-18 18:27:04 -070097 }
98 if (isTcpBulkEnabled) {
99 repoConfig.tcpBulkInsertEndpoints.push_back(std::make_pair(host, port));
100 }
101
Alexander Afanasyev42290b22017-03-09 12:58:29 -0800102 if (repoConf.get<std::string>("storage.method") != "sqlite") {
103 BOOST_THROW_EXCEPTION(Repo::Error("Only 'sqlite' storage method is supported"));
104 }
Shuo Chen478204c2014-03-18 18:27:04 -0700105
106 repoConfig.dbPath = repoConf.get<std::string>("storage.path");
107
108 repoConfig.validatorNode = repoConf.get_child("validator");
Weiqi Shif0330d52014-07-09 10:54:27 -0700109
Shuo Chen6e818122015-05-04 10:40:03 +0800110 repoConfig.nMaxPackets = repoConf.get<uint64_t>("storage.max-packets");
Weiqi Shif0330d52014-07-09 10:54:27 -0700111
Shuo Chen478204c2014-03-18 18:27:04 -0700112 return repoConfig;
113}
114
Shuo Chen478204c2014-03-18 18:27:04 -0700115Repo::Repo(boost::asio::io_service& ioService, const RepoConfig& config)
116 : m_config(config)
117 , m_scheduler(ioService)
Wentao Shang91fb4f22014-05-20 10:55:22 -0700118 , m_face(ioService)
Wentao Shanga8f3c402014-10-30 14:03:27 -0700119 , m_store(std::make_shared<SqliteStorage>(config.dbPath))
Weiqi Shif0330d52014-07-09 10:54:27 -0700120 , m_storageHandle(config.nMaxPackets, *m_store)
Weiqi Shif0330d52014-07-09 10:54:27 -0700121 , m_readHandle(m_face, m_storageHandle, m_keyChain, m_scheduler)
122 , m_writeHandle(m_face, m_storageHandle, m_keyChain, m_scheduler, m_validator)
Weiqi Shi098f91c2014-07-23 17:41:35 -0700123 , m_watchHandle(m_face, m_storageHandle, m_keyChain, m_scheduler, m_validator)
Weiqi Shif0330d52014-07-09 10:54:27 -0700124 , m_deleteHandle(m_face, m_storageHandle, m_keyChain, m_scheduler, m_validator)
125 , m_tcpBulkInsertHandle(ioService, m_storageHandle)
Shuo Chen478204c2014-03-18 18:27:04 -0700126
127{
Junxiao Shi047a6fb2017-06-08 16:16:05 +0000128 this->enableValidation();
Shuo Chen478204c2014-03-18 18:27:04 -0700129}
130
131void
Shuo Chena12f5282014-08-01 15:18:30 +0800132Repo::initializeStorage()
133{
134 // Rebuild storage if storage checkpoin exists
135 ndn::time::steady_clock::TimePoint start = ndn::time::steady_clock::now();
136 m_storageHandle.initialize();
137 ndn::time::steady_clock::TimePoint end = ndn::time::steady_clock::now();
138 ndn::time::milliseconds cost = ndn::time::duration_cast<ndn::time::milliseconds>(end - start);
139 std::cerr << "initialize storage cost: " << cost << "ms" << std::endl;
140}
141
142void
Shuo Chen478204c2014-03-18 18:27:04 -0700143Repo::enableListening()
144{
145 // Enable "listening" on Data prefixes
Wentao Shanga8f3c402014-10-30 14:03:27 -0700146 for (auto it = m_config.dataPrefixes.begin();
Shuo Chen478204c2014-03-18 18:27:04 -0700147 it != m_config.dataPrefixes.end();
148 ++it)
149 {
150 m_readHandle.listen(*it);
151 }
152
153 // Enable "listening" on control prefixes
Wentao Shanga8f3c402014-10-30 14:03:27 -0700154 for (auto it = m_config.repoPrefixes.begin();
Shuo Chen478204c2014-03-18 18:27:04 -0700155 it != m_config.repoPrefixes.end();
156 ++it)
157 {
158 m_writeHandle.listen(*it);
Weiqi Shi098f91c2014-07-23 17:41:35 -0700159 m_watchHandle.listen(*it);
Shuo Chen478204c2014-03-18 18:27:04 -0700160 m_deleteHandle.listen(*it);
161 }
162
163 // Enable listening on TCP bulk insert addresses
Wentao Shanga8f3c402014-10-30 14:03:27 -0700164 for (auto it = m_config.tcpBulkInsertEndpoints.begin();
Shuo Chen478204c2014-03-18 18:27:04 -0700165 it != m_config.tcpBulkInsertEndpoints.end();
166 ++it)
167 {
168 m_tcpBulkInsertHandle.listen(it->first, it->second);
169 }
170}
171
Shuo Chen028dcd32014-06-21 16:36:44 +0800172void
173Repo::enableValidation()
174{
Junxiao Shi047a6fb2017-06-08 16:16:05 +0000175 std::cerr << "Validation is temporarily disabled. All commands will be authorized.\n";
176 /// \todo #4091 restore with ValidatorPolicyConf
177 // m_validator.load(m_config.validatorNode, m_config.repoConfigPath);
Shuo Chen028dcd32014-06-21 16:36:44 +0800178}
179
Shuo Chen478204c2014-03-18 18:27:04 -0700180} // namespace repo