Writing A Stager Script
When testing a dcache stager script it is useful to be able to triggor a stage to and from dcache.
Its useful to limit the number of available pools as each pool can stage. We do this first to reduce the complexity on our test node.
[root@hal9000 ~]# grep "psu create pool" /opt/d-cache/config/PoolManager.conf psu create pool hal9000_4 -disabled psu create pool hal9000_1 -disabled psu create pool hal9000_3 -disabled psu create pool hal9000_2
Changing into a Pool via the admin interface.
[hal9000.dcache.org] (local) admin > cd hal9000_2 [hal9000.dcache.org] (hal9000_2) admin >
Seeing the state of files within a pool.
[hal9000.dcache.org] (hal9000_2) admin > rep ls
000063FB04A30ECD4B3DAD1946789AB2DA34 <C----------(0)[0]> 1467 si={sql:chimera}
0000DFEF57D0328D43DE89910CB75E170610 <C----------(0)[0]> 1467 si={sql:chimera}
000009FF46C3164941728606D169C67E6E2A <C----------(0)[0]> 1467 si={sql:chimera}
00007ECBAC45B58A48FFB54AEF54759E89BE <C----------(0)[0]> 1467 si={sql:chimera}
Please note the "C" indicates Cached, ie the file has been staged to tape. "P" indicates Precious (the file cant be deleted as not on tape).
The Poolmanager defines the caching policy.
[root@hal9000 ~]# cat /opt/d-cache/config/hal9000.poollist hal9000_1 /pools/1/pool sticky=allowed recover-space recover-control recover-anyway lfs=precious tag.hostname=hal9000 hal9000_2 /pools/2/pool sticky=allowed recover-space recover-control recover-anyway tag.hostname=hal9000 hal9000_3 /pools/3/pool sticky=allowed recover-space recover-control recover-anyway lfs=precious tag.hostname=hal9000 hal9000_4 /pools/4/pool sticky=allowed recover-space recover-control recover-anyway lfs=precious tag.hostname=hal9000
Flushing a file from a pool to your stager script.
[hal9000.dcache.org] (hal9000_2) admin > flush pnfsid 00007ECBAC45B58A48FFB54AEF54759E89BE Flush Initiated
Removing a cached file once it has been staged (so it will be staged back when requested.)
[hal9000.dcache.org] (hal9000_2) admin > rep rm 000009FF46C3164941728606D169C67E6E2A Removed 000009FF46C3164941728606D169C67E6E2A
Finding the path of a file in the pool form the pools admin interface.
[hal9000.dcache.org] (hal9000_2) admin > pf 0000617949EF0C7D462FAF9547B107964CA4 /pnfs/dcache.org/data/martin02
How to get the flushing policy on the pool
[hal9000.dcache.org] (hal9000_2) admin > info
Base directory : /pools/2/pool
Revision : [$Revision: 8763 $]
Version : production-1-8-0-14(8763) (Sub=4)
StickyFiles : allowed
Gap : 52428800
Report remove : on
Recovery : CONTROL SPACE ANYWAY
Pool Mode : enabled
Clean prec. files : off
Hsm Load Suppr. : off
Ping Heartbeat : 30 seconds
Storage Mode : Dynamic
ReplicationMgr : Disabled
Check Repository : true
LargeFileStore : None
DuplicateRequests : None
P2P Mode : Separated
P2P File Mode : Cached
Diskspace usage :
Total : 500M
Used : 4401 [8.394241E-6]
Free : 524283599
Precious : 0 [0.0]
Removable: 4401 [8.394241E-6]
Reserved : 0
Flushing Thread
Flushing Interval /seconds : 5
Maximum classes flushing : 1000
Minimum flush delay on error : 60
Remote controlled (hold until) : Locally Controlled
Storage Queue :
Classes : 0
Requests : 0
Mover Queue Manager : Not Configured
Mover Queue (regular) 0(100)/0
P2P Queue 0(10)/0
StorageHandler [diskCacheV111.pools.HsmStorageHandler2]
Version : [$Id: HsmStorageHandler2.java,v 1.47 2007-10-26 11:17:06 behrmann Exp $]
Sticky allowed : true
Restore Timeout : 14400
Store Timeout : 14400
Remove Timeout : 14400
Job Queues
to store 0(5)/0
from store 0(5)/0
delete (1)/
Pool to Pool (P2P) [$Id: P2PClient.java,v 1.21 2007-10-31 17:27:11 radicke Exp $]
Listener : Listen port (recommended=0) Inactive
Max Active : 10
Pnfs Timeout : 300 seconds
Job Timeout Manager
regular (lastAccess=0;total=0)
p2p (lastAccess=0;total=0)
io (lastAccess=0;total=0)
ChecksumModuleV1 : $Id: ChecksumModuleV1.java,v 1.11 2007-08-30 21:11:02 abaranov Exp $
Checksum type : ADLER32
Fake : ftp=false error=false
Checkum calculation on : write enforceCRC
FullScan Idle 0 checked; 0 errors detected
An example script which does fake staging
#!/usr/bin/python
import sys
from xml.dom import minidom
from xml.dom import Node
import urllib
import getopt
import os
import commands
def usage():
print "Usage : put <pnfsId> <filePath> -si=<storageInfo> [-key[=value] ...]"
print " get <pnfsId> <filePath> -uri=<uri> [-key[=value] ...]"
print " remove -uri=<uri> [-key[=value] ...]"
def logout(fileName,commands):
fp = open(fileName,'a')
for i in commands:
fp.write(i + '
')
def hsmPut(commands):
pnfsId = commands[0]
path = commands[1]
miscStuff = commands[2]
#command = commands[3]
#print commands
pass
#logout('/tmp/stagein',commands)
miskdic = {}
for i in miscStuff.split(";"):
fred = i.split('=')
if len(fred) == 2:
miskdic[fred[0]] = fred[1]
#logout('/tmp/stagein',['Extra details=%s
' % (os.path.getsize(path) )])
retinfo = "osm://osm?store=%s;group=%s&bfid=%s" % (miskdic['store'], miskdic['group'],os.path.getsize(path))
print retinfo
#logout('/tmp/stagein',[retinfo])
def hsmGet(commands):
#print commands
#logout('/tmp/stageout',commands)
path=commands[1]
misk=commands[2]
size = 0
for i in misk.split(";"):
fred = i.split('=')
if len(fred) == 3:
if '-si' == fred[0]:
if 'size' == fred[1]:
size = int(fred[2])
#logout('/tmp/stageoutcode',["size=%i" % size, "path=%s" % path])
fp = open(path,'w')
i = 0
while i < size:
fp.write('a')
i = i +1
#logout('/tmp/stageoutcode',["done=%i"])
def hsmRemove(commands):
#print commands
pass
if __name__ == "__main__":
commandline = sys.argv[1:]
if not commandline[0] in ['put', 'get', 'remove']:
usage()
sys.exit(1)
if commandline[0] == "put":
hsmPut(commandline[1:])
if commandline[0] == "get":
hsmGet(commandline[1:])
if commandline[0] == "remove":
hsmRemove(commandline[1:])
