Skip to content

Commit

Permalink
mgr/volumes: fetch oldest clone entry
Browse files Browse the repository at this point in the history
Signed-off-by: Venky Shankar <vshankar@redhat.com>
  • Loading branch information
vshankar committed Jan 31, 2020
1 parent b2145b7 commit 7ad14cf
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 0 deletions.
14 changes: 14 additions & 0 deletions src/pybind/mgr/volumes/fs/fs_util.py
Expand Up @@ -71,6 +71,20 @@ def listdir(fs, dirpath):
raise VolumeException(-e.args[0], e.args[1])
return dirs

def list_one_entry_at_a_time(fs, dirpath):
"""
Get a directory entry (one entry a time)
"""
try:
with fs.opendir(dirpath) as dir_handle:
d = fs.readdir(dir_handle)
while d:
if d.d_name not in (b".", b".."):
yield d
d = fs.readdir(dir_handle)
except cephfs.Error as e:
raise VolumeException(-e.args[0], e.args[1])

def get_ancestor_xattr(fs, path, attr):
"""
Helper for reading layout information: if this xattr is missing
Expand Down
22 changes: 22 additions & 0 deletions src/pybind/mgr/volumes/fs/operations/clone_index.py
Expand Up @@ -9,11 +9,13 @@

from .index import Index
from ..exception import IndexException, VolumeException
from ..fs_util import list_one_entry_at_a_time

log = logging.getLogger(__name__)

class CloneIndex(Index):
SUB_GROUP_NAME = "clone"
PATH_MAX = 4096

@property
def path(self):
Expand Down Expand Up @@ -45,6 +47,26 @@ def untrack(self, tracking_id):
except cephfs.Error as e:
raise IndexException(-e.args[0], e.args[1])

def get_oldest_clone_entry(self, exclude=[]):
min_ctime_entry = None
exclude_tracking_ids = [v[0] for v in exclude]
log.debug("excluded tracking ids: {0}".format(exclude_tracking_ids))
for entry in list_one_entry_at_a_time(self.fs, self.path):
dname = entry.d_name
dpath = os.path.join(self.path, dname)
st = self.fs.lstat(dpath)
if dname not in exclude_tracking_ids and stat.S_ISLNK(st.st_mode):
if min_ctime_entry is None or st.st_ctime < min_ctime_entry[1].st_ctime:
min_ctime_entry = (dname, st)
if min_ctime_entry:
try:
linklen = min_ctime_entry[1].st_size
sink_path = self.fs.readlink(os.path.join(self.path, min_ctime_entry[0]), CloneIndex.PATH_MAX)
return (min_ctime_entry[0], sink_path[:linklen])
except cephfs.Error as e:
raise IndexException(-e.args[0], e.args[1])
return None

def create_clone_index(fs, vol_spec):
clone_index = CloneIndex(fs, vol_spec)
try:
Expand Down

0 comments on commit 7ad14cf

Please sign in to comment.