Commit | Line | Data |
---|---|---|
d7e09d03 PT |
1 | /* |
2 | * GPL HEADER START | |
3 | * | |
4 | * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | |
5 | * | |
6 | * This program is free software; you can redistribute it and/or modify | |
7 | * it under the terms of the GNU General Public License version 2 only, | |
8 | * as published by the Free Software Foundation. | |
9 | * | |
10 | * This program is distributed in the hope that it will be useful, but | |
11 | * WITHOUT ANY WARRANTY; without even the implied warranty of | |
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
13 | * General Public License version 2 for more details (a copy is included | |
14 | * in the LICENSE file that accompanied this code). | |
15 | * | |
16 | * You should have received a copy of the GNU General Public License | |
17 | * version 2 along with this program; If not, see | |
6a5b99a4 | 18 | * http://www.gnu.org/licenses/gpl-2.0.html |
d7e09d03 | 19 | * |
d7e09d03 PT |
20 | * GPL HEADER END |
21 | */ | |
22 | /* | |
23 | * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved. | |
24 | * Use is subject to license terms. | |
25 | * | |
1dc563a6 | 26 | * Copyright (c) 2012, 2015, Intel Corporation. |
d7e09d03 PT |
27 | */ |
28 | /* | |
29 | * This file is part of Lustre, http://www.lustre.org/ | |
30 | * Lustre is a trademark of Sun Microsystems, Inc. | |
31 | * | |
32 | * lustre/fld/fld_internal.h | |
33 | * | |
aa08b0e3 PF |
34 | * Subsystem Description: |
35 | * FLD is FID Location Database, which stores where (IE, on which MDT) | |
36 | * FIDs are located. | |
37 | * The database is basically a record file, each record consists of a FID | |
38 | * sequence range, MDT/OST index, and flags. The FLD for the whole FS | |
39 | * is only stored on the sequence controller(MDT0) right now, but each target | |
40 | * also has its local FLD, which only stores the local sequence. | |
41 | * | |
42 | * The FLD subsystem usually has two tasks: | |
43 | * 1. maintain the database, i.e. when the sequence controller allocates | |
44 | * new sequence ranges to some nodes, it will call the FLD API to insert the | |
45 | * location information <sequence_range, node_index> in FLDB. | |
46 | * | |
47 | * 2. Handle requests from other nodes, i.e. if client needs to know where | |
48 | * the FID is located, if it can not find the information in the local cache, | |
49 | * it will send a FLD lookup RPC to the FLD service, and the FLD service will | |
50 | * look up the FLDB entry and return the location information to client. | |
51 | * | |
52 | * | |
d7e09d03 PT |
53 | * Author: Yury Umanets <umka@clusterfs.com> |
54 | * Author: Tom WangDi <wangdi@clusterfs.com> | |
55 | */ | |
56 | #ifndef __FLD_INTERNAL_H | |
57 | #define __FLD_INTERNAL_H | |
58 | ||
0e9ad0ef | 59 | #include "../include/lustre/lustre_idl.h" |
d7e09d03 | 60 | |
9fdaf8c0 | 61 | #include "../../include/linux/libcfs/libcfs.h" |
0e9ad0ef GKH |
62 | #include "../include/lustre_req_layout.h" |
63 | #include "../include/lustre_fld.h" | |
d7e09d03 PT |
64 | |
65 | enum { | |
66 | LUSTRE_FLD_INIT = 1 << 0, | |
67 | LUSTRE_FLD_RUN = 1 << 1 | |
68 | }; | |
69 | ||
70 | struct fld_stats { | |
71 | __u64 fst_count; | |
72 | __u64 fst_cache; | |
73 | __u64 fst_inflight; | |
74 | }; | |
75 | ||
d7e09d03 PT |
76 | struct lu_fld_hash { |
77 | const char *fh_name; | |
8111e432 OD |
78 | int (*fh_hash_func)(struct lu_client_fld *, __u64); |
79 | struct lu_fld_target *(*fh_scan_func)(struct lu_client_fld *, __u64); | |
d7e09d03 PT |
80 | }; |
81 | ||
82 | struct fld_cache_entry { | |
83 | struct list_head fce_lru; | |
84 | struct list_head fce_list; | |
52581b89 | 85 | /** fld cache entries are sorted on range->lsr_start field. */ |
d7e09d03 PT |
86 | struct lu_seq_range fce_range; |
87 | }; | |
88 | ||
89 | struct fld_cache { | |
90 | /** | |
91 | * Cache guard, protects fci_hash mostly because others immutable after | |
92 | * init is finished. | |
93 | */ | |
94 | rwlock_t fci_lock; | |
95 | ||
52581b89 | 96 | /** Cache shrink threshold */ |
d7e09d03 PT |
97 | int fci_threshold; |
98 | ||
52581b89 | 99 | /** Preferred number of cached entries */ |
d7e09d03 PT |
100 | int fci_cache_size; |
101 | ||
52581b89 | 102 | /** Current number of cached entries. Protected by \a fci_lock */ |
d7e09d03 PT |
103 | int fci_cache_count; |
104 | ||
52581b89 | 105 | /** LRU list fld entries. */ |
d7e09d03 PT |
106 | struct list_head fci_lru; |
107 | ||
52581b89 | 108 | /** sorted fld entries. */ |
d7e09d03 PT |
109 | struct list_head fci_entries_head; |
110 | ||
52581b89 | 111 | /** Cache statistics. */ |
d7e09d03 PT |
112 | struct fld_stats fci_stat; |
113 | ||
52581b89 | 114 | /** Cache name used for debug and messages. */ |
37604896 | 115 | char fci_name[LUSTRE_MDT_MAXNAMELEN]; |
d7e09d03 PT |
116 | unsigned int fci_no_shrink:1; |
117 | }; | |
118 | ||
d7e09d03 PT |
119 | enum { |
120 | /* 4M of FLD cache will not hurt client a lot. */ | |
121 | FLD_SERVER_CACHE_SIZE = (4 * 0x100000), | |
122 | ||
123 | /* 1M of FLD cache will not hurt client a lot. */ | |
124 | FLD_CLIENT_CACHE_SIZE = (1 * 0x100000) | |
125 | }; | |
126 | ||
127 | enum { | |
128 | /* Cache threshold is 10 percent of size. */ | |
129 | FLD_SERVER_CACHE_THRESHOLD = 10, | |
130 | ||
131 | /* Cache threshold is 10 percent of size. */ | |
132 | FLD_CLIENT_CACHE_THRESHOLD = 10 | |
133 | }; | |
134 | ||
135 | extern struct lu_fld_hash fld_hash[]; | |
136 | ||
d7e09d03 | 137 | int fld_client_rpc(struct obd_export *exp, |
b78c2b9b | 138 | struct lu_seq_range *range, __u32 fld_op, |
139 | struct ptlrpc_request **reqp); | |
d7e09d03 | 140 | |
82765049 | 141 | extern struct lprocfs_vars fld_client_debugfs_list[]; |
d7e09d03 PT |
142 | |
143 | struct fld_cache *fld_cache_init(const char *name, | |
144 | int cache_size, int cache_threshold); | |
145 | ||
146 | void fld_cache_fini(struct fld_cache *cache); | |
147 | ||
148 | void fld_cache_flush(struct fld_cache *cache); | |
149 | ||
150 | int fld_cache_insert(struct fld_cache *cache, | |
151 | const struct lu_seq_range *range); | |
152 | ||
153 | struct fld_cache_entry | |
154 | *fld_cache_entry_create(const struct lu_seq_range *range); | |
155 | ||
d7e09d03 | 156 | int fld_cache_lookup(struct fld_cache *cache, |
114acca8 | 157 | const u64 seq, struct lu_seq_range *range); |
d7e09d03 PT |
158 | |
159 | struct fld_cache_entry* | |
160 | fld_cache_entry_lookup(struct fld_cache *cache, struct lu_seq_range *range); | |
d7e09d03 PT |
161 | |
162 | struct fld_cache_entry | |
163 | *fld_cache_entry_lookup_nolock(struct fld_cache *cache, | |
164 | struct lu_seq_range *range); | |
d7e09d03 PT |
165 | |
166 | static inline const char * | |
167 | fld_target_name(struct lu_fld_target *tar) | |
168 | { | |
6ac49ca5 | 169 | if (tar->ft_srv) |
d7e09d03 PT |
170 | return tar->ft_srv->lsf_name; |
171 | ||
172 | return (const char *)tar->ft_exp->exp_obd->obd_name; | |
173 | } | |
174 | ||
d7e09d03 | 175 | #endif /* __FLD_INTERNAL_H */ |