Skip to content

Commit 76750ad

Browse files
committed
MGM: add by 'app' ns accounting
MGM: refactor Fusex 'SET" function to set appliation name (to bypass throttling/stalling e.g. restic)
1 parent 566999e commit 76750ad

File tree

7 files changed

+50
-36
lines changed

7 files changed

+50
-36
lines changed

mgm/FuseServer/Clients.hh

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,17 @@ public:
158158
return mMap;
159159
}
160160

161+
162+
std::string client2app (const std::string& clientid) {
163+
eos::common::RWMutexReadLock lLock(*this);
164+
auto client = map().find(clientid);
165+
if (client != map().end()) {
166+
return client->second.heartbeat().appname();
167+
}
168+
// return just generic 'fuse' app if we don't find the client
169+
return "fuse";
170+
}
171+
161172
client_uuid_t& uuidview()
162173
{
163174
return mUUIDView;

mgm/FuseServer/Server.cc

Lines changed: 30 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -380,7 +380,7 @@ Server::FillContainerMD(uint64_t id, eos::fusex::md& dir,
380380

381381
if (dir.operation() == dir.LS) {
382382
// we put a hard-coded listing limit for service protection
383-
if (vid.app != "fuse::restic") {
383+
if (vid.app != gOFS->mFuseNoStallApp) {
384384
// no restrictions for restic backups
385385
if ((uint64_t)dir.nchildren() > c_max_children) {
386386
// xrootd does not handle E2BIG ... sigh
@@ -1154,7 +1154,7 @@ Server::OpBeginFlush(const std::string& id,
11541154
std::string* response,
11551155
uint64_t* clock)
11561156
{
1157-
gOFS->MgmStats.Add("Eosxd::ext::BEGINFLUSH", vid.uid, vid.gid, 1);
1157+
gOFS->MgmStats.Add("Eosxd::ext::BEGINFLUSH", vid.uid, vid.gid, 1, vid.app);
11581158
EXEC_TIMING_BEGIN("Eosxd::ext::BEGINFLUSH");
11591159
// this is a flush begin/end indicator
11601160
Flushs().beginFlush(md.md_ino(), md.clientuuid());
@@ -1176,7 +1176,7 @@ Server::OpEndFlush(const std::string& id,
11761176
std::string* response,
11771177
uint64_t* clock)
11781178
{
1179-
gOFS->MgmStats.Add("Eosxd::ext::ENDFLUSH", vid.uid, vid.gid, 1);
1179+
gOFS->MgmStats.Add("Eosxd::ext::ENDFLUSH", vid.uid, vid.gid, 1, vid.app);
11801180
EXEC_TIMING_BEGIN("Eosxd::ext::ENDFLUSH");
11811181
Flushs().endFlush(md.md_ino(), md.clientuuid());
11821182
eos::fusex::response resp;
@@ -1217,10 +1217,10 @@ Server::OpGetLs(const std::string& id,
12171217
"Eosxd::ext::GET");
12181218

12191219
if (md.operation() == md.LS) {
1220-
gOFS->MgmStats.Add("Eosxd::ext::LS", vid.uid, vid.gid, 1);
1220+
gOFS->MgmStats.Add("Eosxd::ext::LS", vid.uid, vid.gid, 1, vid.app);
12211221
(*parent)[md.md_ino()].set_operation(md.LS);
12221222
} else {
1223-
gOFS->MgmStats.Add("Eosxd::ext::GET", vid.uid, vid.gid, 1);
1223+
gOFS->MgmStats.Add("Eosxd::ext::GET", vid.uid, vid.gid, 1, vid.app);
12241224
}
12251225

12261226
size_t n_attached = 1;
@@ -1242,7 +1242,7 @@ Server::OpGetLs(const std::string& id,
12421242
auto map = (*parent)[md.md_ino()].children();
12431243
auto it = map.begin();
12441244
size_t n_caps = 0;
1245-
gOFS->MgmStats.Add("Eosxd::ext::LS-Entry", vid.uid, vid.gid, map.size());
1245+
gOFS->MgmStats.Add("Eosxd::ext::LS-Entry", vid.uid, vid.gid, map.size(), vid.app);
12461246

12471247
for (; it != map.end(); ++it) {
12481248
// this is a map by inode
@@ -1390,7 +1390,7 @@ Server::OpSet(const std::string& id,
13901390
std::string* response,
13911391
uint64_t* clock)
13921392
{
1393-
gOFS->MgmStats.Add("Eosxd::ext::SET", vid.uid, vid.gid, 1);
1393+
gOFS->MgmStats.Add("Eosxd::ext::SET", vid.uid, vid.gid, 1, vid.app);
13941394

13951395
if (!ValidateCAP(md, W_OK | SA_OK, vid)) {
13961396
std::string perm = "W";
@@ -1432,7 +1432,7 @@ Server::OpSetDirectory(const std::string& id,
14321432
std::string* response,
14331433
uint64_t* clock)
14341434
{
1435-
gOFS->MgmStats.Add("Eosxd::ext::SETDIR", vid.uid, vid.gid, 1);
1435+
gOFS->MgmStats.Add("Eosxd::ext::SETDIR", vid.uid, vid.gid, 1, vid.app);
14361436
EXEC_TIMING_BEGIN("Eosxd::ext::SETDIR");
14371437
uint64_t md_pino = md.md_pino();
14381438

@@ -1715,19 +1715,19 @@ Server::OpSetDirectory(const std::string& id,
17151715

17161716
switch (op) {
17171717
case MOVE:
1718-
gOFS->MgmStats.Add("Eosxd::ext::MV", vid.uid, vid.gid, 1);
1718+
gOFS->MgmStats.Add("Eosxd::ext::MV", vid.uid, vid.gid, 1, vid.app);
17191719
break;
17201720

17211721
case UPDATE:
1722-
gOFS->MgmStats.Add("Eosxd::ext::UPDATE", vid.uid, vid.gid, 1);
1722+
gOFS->MgmStats.Add("Eosxd::ext::UPDATE", vid.uid, vid.gid, 1, vid.app);
17231723
break;
17241724

17251725
case CREATE:
1726-
gOFS->MgmStats.Add("Eosxd::ext::MKDIR", vid.uid, vid.gid, 1);
1726+
gOFS->MgmStats.Add("Eosxd::ext::MKDIR", vid.uid, vid.gid, 1, vid.app);
17271727
break;
17281728

17291729
case RENAME:
1730-
gOFS->MgmStats.Add("Eosxd::ext::RENAME", vid.uid, vid.gid, 1);
1730+
gOFS->MgmStats.Add("Eosxd::ext::RENAME", vid.uid, vid.gid, 1, vid.app);
17311731
break;
17321732
}
17331733

@@ -1796,7 +1796,7 @@ Server::OpSetFile(const std::string& id,
17961796
std::string* response,
17971797
uint64_t* clock)
17981798
{
1799-
gOFS->MgmStats.Add("Eosxd::ext::SETFILE", vid.uid, vid.gid, 1);
1799+
gOFS->MgmStats.Add("Eosxd::ext::SETFILE", vid.uid, vid.gid, 1, vid.app);
18001800
EXEC_TIMING_BEGIN("Eosxd::ext::SETFILE");
18011801
enum set_type {
18021802
CREATE, UPDATE, RENAME, MOVE
@@ -2492,19 +2492,19 @@ Server::OpSetFile(const std::string& id,
24922492

24932493
switch (op) {
24942494
case MOVE:
2495-
gOFS->MgmStats.Add("Eosxd::ext::MV", vid.uid, vid.gid, 1);
2495+
gOFS->MgmStats.Add("Eosxd::ext::MV", vid.uid, vid.gid, 1, vid.app);
24962496
break;
24972497

24982498
case UPDATE:
2499-
gOFS->MgmStats.Add("Eosxd::ext::UPDATE", vid.uid, vid.gid, 1);
2499+
gOFS->MgmStats.Add("Eosxd::ext::UPDATE", vid.uid, vid.gid, 1, vid.app);
25002500
break;
25012501

25022502
case CREATE:
2503-
gOFS->MgmStats.Add("Eosxd::ext::CREATE", vid.uid, vid.gid, 1);
2503+
gOFS->MgmStats.Add("Eosxd::ext::CREATE", vid.uid, vid.gid, 1 , vid.app);
25042504
break;
25052505

25062506
case RENAME:
2507-
gOFS->MgmStats.Add("Eosxd::ext::RENAME", vid.uid, vid.gid, 1);
2507+
gOFS->MgmStats.Add("Eosxd::ext::RENAME", vid.uid, vid.gid, 1, vid.app);
25082508
break;
25092509
}
25102510

@@ -2575,7 +2575,7 @@ Server::OpSetLink(const std::string& id,
25752575
std::string* response,
25762576
uint64_t* clock)
25772577
{
2578-
gOFS->MgmStats.Add("Eosxd::ext::SETLNK", vid.uid, vid.gid, 1);
2578+
gOFS->MgmStats.Add("Eosxd::ext::SETLNK", vid.uid, vid.gid, 1, vid.app);
25792579
EXEC_TIMING_BEGIN("Eosxd::ext::SETLNK");
25802580
enum set_type {
25812581
CREATE, UPDATE, RENAME, MOVE
@@ -2716,22 +2716,22 @@ Server::OpSetLink(const std::string& id,
27162716
switch (op) {
27172717
case MOVE:
27182718
s += "M";
2719-
gOFS->MgmStats.Add("Eosxd::ext::MV", vid.uid, vid.gid, 1);
2719+
gOFS->MgmStats.Add("Eosxd::ext::MV", vid.uid, vid.gid, 1, vid.app);
27202720
break;
27212721

27222722
case UPDATE:
27232723
s += "U";
2724-
gOFS->MgmStats.Add("Eosxd::ext::UPDATE", vid.uid, vid.gid, 1);
2724+
gOFS->MgmStats.Add("Eosxd::ext::UPDATE", vid.uid, vid.gid, 1, vid.app);
27252725
break;
27262726

27272727
case CREATE:
27282728
s += "C";
2729-
gOFS->MgmStats.Add("Eosxd::ext::CREATELNK", vid.uid, vid.gid, 1);
2729+
gOFS->MgmStats.Add("Eosxd::ext::CREATELNK", vid.uid, vid.gid, 1, vid.app);
27302730
break;
27312731

27322732
case RENAME:
27332733
s += "R";
2734-
gOFS->MgmStats.Add("Eosxd::ext::RENAME", vid.uid, vid.gid, 1);
2734+
gOFS->MgmStats.Add("Eosxd::ext::RENAME", vid.uid, vid.gid, 1, vid.app);
27352735
break;
27362736

27372737
default:
@@ -2838,7 +2838,7 @@ Server::OpDelete(const std::string& id,
28382838
std::string* response,
28392839
uint64_t* clock)
28402840
{
2841-
gOFS->MgmStats.Add("Eosxd::ext::RM", vid.uid, vid.gid, 1);
2841+
gOFS->MgmStats.Add("Eosxd::ext::RM", vid.uid, vid.gid, 1, vid.app);
28422842

28432843
if (!ValidateCAP(md, D_OK, vid)) {
28442844
std::string perm = "D";
@@ -2877,7 +2877,7 @@ Server::OpDeleteDirectory(const std::string& id,
28772877
std::string* response,
28782878
uint64_t* clock)
28792879
{
2880-
gOFS->MgmStats.Add("Eosxd::ext::RMDIR", vid.uid, vid.gid, 1);
2880+
gOFS->MgmStats.Add("Eosxd::ext::RMDIR", vid.uid, vid.gid, 1, vid.app);
28812881
EXEC_TIMING_BEGIN("Eosxd::ext::RMDIR");
28822882
eos::fusex::response resp;
28832883
resp.set_type(resp.ACK);
@@ -2966,7 +2966,7 @@ Server::OpDeleteFile(const std::string& id,
29662966
std::string* response,
29672967
uint64_t* clock)
29682968
{
2969-
gOFS->MgmStats.Add("Eosxd::ext::DELETE", vid.uid, vid.gid, 1);
2969+
gOFS->MgmStats.Add("Eosxd::ext::DELETE", vid.uid, vid.gid, 1, vid.app);
29702970
EXEC_TIMING_BEGIN("Eosxd::ext::DELETE");
29712971

29722972
if (!ValidateCAP(md, D_OK, vid)) {
@@ -3193,7 +3193,7 @@ Server::OpDeleteLink(const std::string& id,
31933193
std::string* response,
31943194
uint64_t* clock)
31953195
{
3196-
gOFS->MgmStats.Add("Eosxd::ext::DELETELNK", vid.uid, vid.gid, 1);
3196+
gOFS->MgmStats.Add("Eosxd::ext::DELETELNK", vid.uid, vid.gid, 1, vid.app);
31973197
EXEC_TIMING_BEGIN("Eosxd::ext::DELETELNK");
31983198

31993199
if (!ValidateCAP(md, D_OK, vid)) {
@@ -3291,7 +3291,7 @@ Server::OpGetCap(const std::string& id,
32913291
std::string* response,
32923292
uint64_t* clock)
32933293
{
3294-
gOFS->MgmStats.Add("Eosxd::ext::GETCAP", vid.uid, vid.gid, 1);
3294+
gOFS->MgmStats.Add("Eosxd::ext::GETCAP", vid.uid, vid.gid, 1, vid.app);
32953295
EXEC_TIMING_BEGIN("Eosxd::ext::GETCAP");
32963296
eos::fusex::container cont;
32973297
cont.set_type(cont.CAP);
@@ -3341,7 +3341,7 @@ Server::OpGetLock(const std::string& id,
33413341
std::string* response,
33423342
uint64_t* clock)
33433343
{
3344-
gOFS->MgmStats.Add("Eosxd::ext::GETLK", vid.uid, vid.gid, 1);
3344+
gOFS->MgmStats.Add("Eosxd::ext::GETLK", vid.uid, vid.gid, 1, vid.app);
33453345
EXEC_TIMING_BEGIN("Eosxd::ext::GETLK");
33463346
eos::fusex::response resp;
33473347
resp.set_type(resp.LOCK);
@@ -3398,10 +3398,10 @@ Server::OpSetLock(const std::string& id,
33983398
bool xattr_lock = false;
33993399

34003400
if (md.operation() == md.SETLKW) {
3401-
gOFS->MgmStats.Add("Eosxd::ext::SETLKW", vid.uid, vid.gid, 1);
3401+
gOFS->MgmStats.Add("Eosxd::ext::SETLKW", vid.uid, vid.gid, 1, vid.app);
34023402
sleep = 1;
34033403
} else {
3404-
gOFS->MgmStats.Add("Eosxd::ext::SETLK", vid.uid, vid.gid, 1);
3404+
gOFS->MgmStats.Add("Eosxd::ext::SETLK", vid.uid, vid.gid, 1, vid.app);
34053405
}
34063406

34073407
struct flock lock;

mgm/XrdMgmOfs/Fsctl.cc

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -204,7 +204,6 @@ XrdMgmOfs::FSctl(const int cmd,
204204
if ((cmd == SFS_FSCTL_PLUGIN) && (args.Arg2Len > 5)) {
205205
std::string key;
206206
key.assign(args.Arg2, 6);
207-
208207
if (key == "fusex:") {
209208
fusexset = true;
210209
}

mgm/XrdMgmOfs/fsctl/Fusex.cc

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,17 +45,21 @@ XrdMgmOfs::Fusex(const char* path,
4545
{
4646
static const char* epname = "Fusex";
4747
ACCESSMODE_W;
48-
FUNCTIONMAYSTALL("Eosxd::prot::SET", vid, error);
4948
MAYREDIRECT;
5049
EXEC_TIMING_BEGIN("Eosxd::prot::SET");
51-
gOFS->MgmStats.Add("Eosxd::prot::SET", vid.uid, vid.gid, 1);
5250
eos_static_debug("protobuf-len=%d", protobuf.length());
5351
eos::fusex::md md;
5452

5553
if (!md.ParseFromString(protobuf)) {
5654
return Emsg(epname, error, EINVAL, "parse protocol buffer [EINVAL]", "");
5755
}
5856

57+
// extract the client ID and translate to the app name
58+
vid.app = gOFS->zMQ->gFuseServer.Client().client2app(md.clientid());
59+
60+
gOFS->MgmStats.Add("Eosxd::prot::SET", vid.uid, vid.gid, 1, vid.app);
61+
62+
FUNCTIONMAYSTALL("Eosxd::prot::SET", vid, error);
5963
std::string resultstream;
6064
std::string id = std::string("Fusex::sync:") + vid.tident.c_str();
6165
int rc = gOFS->zMQ->gFuseServer.HandleMD(id, md, vid, &resultstream, 0);

mgm/XrdMgmOfs/fsctl/GetFusex.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ XrdMgmOfs::GetFusex(const char* path,
4444
FUNCTIONMAYSTALL("Eosxd::prot::STAT", vid, error);
4545
MAYREDIRECT;
4646
EXEC_TIMING_BEGIN("Eosxd::prot::STAT");
47-
gOFS->MgmStats.Add("Eosxd::prot::STAT", vid.uid, vid.gid, 1);
47+
gOFS->MgmStats.Add("Eosxd::prot::STAT", vid.uid, vid.gid, 1, vid.app);
4848
ProcCommand procCommand;
4949
std::string spath = path;
5050

mgm/proc/admin/NsCmd.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -734,7 +734,7 @@ NsCmd::StatSubcmd(const eos::console::NsProto_StatProto& stat,
734734
if (!stat.summary()) {
735735
XrdOucString stats_out;
736736
gOFS->MgmStats.PrintOutTotal(stats_out, stat.groupids(), monitoring,
737-
stat.numericids());
737+
stat.numericids(), stat.apps());
738738
oss << stats_out.c_str();
739739
}
740740

mgm/proc/user/FuseX.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ ProcCommand::FuseX()
4848
{
4949
FUNCTIONMAYSTALL("Eosxd::ext::LS-Entry", *pVid, *mError);
5050
}
51-
gOFS->MgmStats.Add("Eosxd::prot::LS", pVid->uid, pVid->gid, 1);
51+
gOFS->MgmStats.Add("Eosxd::prot::LS", pVid->uid, pVid->gid, 1, pVid->app);
5252
EXEC_TIMING_BEGIN("Eosxd::prot::LS");
5353
// -------------------------------------------------------------------------------------------------------
5454
// This function returns meta data by inode or if provided first translates a path into an inode.

0 commit comments

Comments
 (0)