]>
git.proxmox.com Git - ceph.git/blob - ceph/src/mds/StrayManager.h
1 // vim: ts=8 sw=2 smarttab
3 * Ceph - scalable distributed file system
5 * Copyright (C) 2015 Red Hat
7 * This is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License version 2.1, as published by the Free Software
10 * Foundation. See file COPYING.
14 #ifndef STRAY_MANAGER_H
15 #define STRAY_MANAGER_H
17 #include "include/common_fwd.h"
18 #include "include/elist.h"
21 #include "PurgeQueue.h"
29 // My public interface is for consumption by MDCache
31 explicit StrayManager(MDSRank
*mds
, PurgeQueue
&purge_queue_
);
32 void set_logger(PerfCounters
*l
) {logger
= l
;}
35 bool eval_stray(CDentry
*dn
);
37 void set_num_strays(uint64_t num
);
38 uint64_t get_num_strays() const { return num_strays
; }
41 * Queue dentry for later evaluation. (evaluate it while not in the
42 * middle of another metadata operation)
44 void queue_delayed(CDentry
*dn
);
47 * Eval strays in the delayed_eval_stray list
49 void advance_delayed();
52 * Remote dentry potentially points to a stray. When it is touched,
53 * call in here to evaluate it for migration (move a stray residing
54 * on another MDS to this MDS) or reintegration (move a stray dentry's
55 * inode into a non-stray hardlink dentry and clean up the stray).
57 * @param stray_dn a stray dentry whose inode has been referenced
59 * @param remote_dn (optional) which remote dentry was touched
60 * in an operation that led us here: this is used
61 * as a hint for which remote to reintegrate into
62 * if there are multiple remotes.
64 void eval_remote(CDentry
*remote_dn
);
67 * Given a dentry within one of my stray directories,
68 * send it off to a stray directory in another MDS.
71 * * Case A: when shutting down a rank, we migrate strays
72 * away from ourselves rather than waiting for purge
73 * * Case B: when a client request has a trace that refers to
74 * a stray inode on another MDS, we migrate that inode from
75 * there to here, in order that we can later re-integrate it
78 * In case B, the receiver should be calling into eval_stray
79 * on completion of mv (i.e. inode put), resulting in a subsequent
82 void migrate_stray(CDentry
*dn
, mds_rank_t dest
);
85 * Update stats to reflect a newly created stray dentry. Needed
86 * because stats on strays live here, but creation happens
87 * in Server or MDCache. For our purposes "creation" includes
88 * loading a stray from a dirfrag and migrating a stray from
89 * another MDS, in addition to creations per-se.
91 void notify_stray_created();
94 * Update stats to reflect a removed stray dentry. Needed because
95 * stats on strays live here, but removal happens in Server or
96 * MDCache. Also includes migration (rename) of strays from
97 * this MDS to another MDS.
99 void notify_stray_removed();
102 friend class StrayManagerIOContext
;
103 friend class StrayManagerLogContext
;
104 friend class StrayManagerContext
;
106 friend class C_StraysFetched
;
107 friend class C_RetryEnqueue
;
108 friend class C_PurgeStrayLogged
;
109 friend class C_TruncateStrayLogged
;
110 friend class C_IO_PurgeStrayPurged
;
112 void truncate(CDentry
*dn
);
115 * Purge a dentry from a stray directory. This function
116 * is called once eval_stray is satisfied and StrayManager
117 * throttling is also satisfied. There is no going back
120 void purge(CDentry
*dn
);
123 * Completion handler for a Filer::purge on a stray inode.
125 void _purge_stray_purged(CDentry
*dn
, bool only_head
);
127 void _purge_stray_logged(CDentry
*dn
, version_t pdv
, MutationRef
& mut
);
130 * Callback: we have logged the update to an inode's metadata
131 * reflecting it's newly-zeroed length.
133 void _truncate_stray_logged(CDentry
*dn
, MutationRef
&mut
);
135 * Call this on a dentry that has been identified as
136 * eligible for purging. It will be passed on to PurgeQueue.
138 void enqueue(CDentry
*dn
, bool trunc
);
140 * Final part of enqueue() which we may have to retry
141 * after opening snap parents.
143 void _enqueue(CDentry
*dn
, bool trunc
);
146 * When hard links exist to an inode whose primary dentry
147 * is unlinked, the inode gets a stray primary dentry.
149 * We may later "reintegrate" the inode into a remaining
150 * non-stray dentry (one of what was previously a remote
151 * dentry) by issuing a rename from the stray to the other
154 void reintegrate_stray(CDentry
*dn
, CDentry
*rlink
);
157 * Evaluate a stray dentry for purging or reintegration.
159 * purging: If the inode has no linkage, and no more references, then
160 * we may decide to purge it.
162 * reintegration: If the inode still has linkage, then it means someone else
163 * (a hard link) is still referring to it, and we should
164 * think about reintegrating that inode into the remote dentry.
166 * @returns true if the dentry will be purged (caller should never
167 * take more refs after this happens), else false.
169 bool _eval_stray(CDentry
*dn
);
171 void _eval_stray_remote(CDentry
*stray_dn
, CDentry
*remote_dn
);
173 // Has passed through eval_stray and still has refs
174 elist
<CDentry
*> delayed_eval_stray
;
176 // strays that have been trimmed from cache
177 std::set
<std::string
> trimmed_strays
;
179 // Global references for doing I/O
181 PerfCounters
*logger
= nullptr;
183 bool started
= false;
185 // Stray dentries for this rank (including those not in cache)
186 uint64_t num_strays
= 0;
189 uint64_t num_strays_delayed
= 0;
191 * Entries that have entered enqueue() but not been persistently
192 * recorded by PurgeQueue yet
194 uint64_t num_strays_enqueuing
= 0;
196 PurgeQueue
&purge_queue
;
198 #endif // STRAY_MANAGER_H