(defn db
"Etcd DB for a particular version."
[version]
(reify db/DB
(setup! [_ test node]
(info node "installing etcd" version))
(teardown! [_ test node]
(info node "tearing down etcd"))))
如上代码块所示,(defn db ...之后的字符串是文档字符串 ,记录了函数的行为。 当获得version时,db函数使用reify构造一个满足Jepsen的DB协议的新对象(来自db命名空间)。该协议指定所有数据库必须支持的两个功能:(setup!db test node)和(teardown! db test node),分别代表设置和拆除数据这两大功能。 我们提供存根(stub)实现在这里,它仅仅是输出一条参考消息日志。
(def dir "/opt/etcd")
(defn db
"Etcd DB for a particular version."
[version]
(reify db/DB
(setup! [_ test node]
(info node "installing etcd" version)
(c/su
(let [url (str "https://storage.googleapis.com/etcd/" version
"/etcd-" version "-linux-amd64.tar.gz")]
(cu/install-archive! url dir))))
(teardown! [_ test node]
(info node "tearing down etcd"))))
现在,lein run test将自动安装etcd。请注意,Jepsen在所有节点上同时进行“设置”和“拆卸”。这可能需要一些时间,因为每个节点都必须下载tarball,但是在以后的运行中,Jepsen将重新使用磁盘上缓存的tarball。
启动数据库
(defn node-url
"An HTTP url for connecting to a node on a particular port."
[node port]
(str "http://" node ":" port))
(defn peer-url
"The HTTP url for other peers to talk to a node."
[node]
(node-url node 2380))
(defn client-url
"The HTTP url clients use to talk to a node."
[node]
(node-url node 2379))
(defn initial-cluster
"Constructs an initial cluster string for a test, like
\"foo=foo:2380,bar=bar:2380,...\""
[test]
(->> (:nodes test)
(map (fn [node]
(str node "=" (peer-url node))))
(str/join ",")))
->>是Clojure的一个宏,将一个形式插入到下一个形式作为最后一个参数(因为作用类似于缝衣服时候的穿线,因此在英文中命名这个宏为“threading”)。因此,(->> test :nodes)就变成了(:nodes test),而(->> test :nodes (map-indexed (fn ...)))就变成了(map-indexed (fn ...) (:nodes test)),以此类推。普通的函数调用看起来就是“由内而外”,但是->>这个宏让我们“按顺序”编写一系列操作,类似于一个面向对象语言的foo.bar().baz()表示形式。
(defn db
"Etcd DB for a particular version."
[version]
(reify db/DB
(setup! [_ test node]
...)
(teardown! [_ test node]
...)
db/LogFiles
(log-files [_ test node]
[logfile])))
$ less store/latest/n1/etcd.log
...
2018-02-02 11:36:51.848330 I | raft: 5440ff22fe632778 became leader at term 2
2018-02-02 11:36:51.848360 I | raft: raft.node: 5440ff22fe632778 elected leader 5440ff22fe632778 at term 2
2018-02-02 11:36:51.860295 I | etcdserver: setting up the initial cluster version to 3.1
2018-02-02 11:36:51.864532 I | embed: ready to serve client requests
...