diff --git a/patroni/dcs/raft.py b/patroni/dcs/raft.py index 3a9dab2a..811e3ff6 100644 --- a/patroni/dcs/raft.py +++ b/patroni/dcs/raft.py @@ -5,6 +5,7 @@ import threading import time from patroni.dcs import AbstractDCS, ClusterConfig, Cluster, Failover, Leader, Member, SyncState, TimelineHistory +from ..utils import validate_directory from pysyncobj import SyncObj, SyncObjConf, replicated, FAIL_REASON from pysyncobj.transport import Node, TCPTransport, CONNECTION_STATE @@ -275,6 +276,11 @@ class Raft(AbstractDCS): partner_addrs.append(self_addr) self_addr = None + # Create raft data_dir if necessary + raft_data_dir = config.get('data_dir', '') + if raft_data_dir != '': + validate_directory(raft_data_dir) + ready_event = threading.Event() file_template = os.path.join(config.get('data_dir', ''), (self_addr or '')) conf = SyncObjConf(password=config.get('password'), appendEntriesUseBatch=False, diff --git a/patroni/utils.py b/patroni/utils.py index 637291e5..0bbddb4d 100644 --- a/patroni/utils.py +++ b/patroni/utils.py @@ -1,3 +1,4 @@ +import errno import json.decoder as json_decoder import logging import os @@ -461,7 +462,8 @@ def validate_directory(d, msg="{} {}"): os.makedirs(d) except OSError as e: logger.error(e) - raise PatroniException(msg.format(d, "couldn't create the directory")) + if e.errno != errno.EEXIST: + raise PatroniException(msg.format(d, "couldn't create the directory")) elif os.path.isdir(d): try: fd, tmpfile = tempfile.mkstemp(dir=d)