From 35eaaee627f2eb98065fe938542bc65434a9beca Mon Sep 17 00:00:00 2001 From: aum <aum> Date: Tue, 17 Aug 2004 16:57:21 +0000 Subject: [PATCH] added -l flag for local-only put/get --- apps/stasher/python/src/code.leo | 75 +++++++++++++++++++++++------- apps/stasher/python/src/stasher.py | 69 +++++++++++++++++++++------ 2 files changed, 115 insertions(+), 29 deletions(-) diff --git a/apps/stasher/python/src/code.leo b/apps/stasher/python/src/code.leo index 19ba423c8e..4ae647bd20 100644 --- a/apps/stasher/python/src/code.leo +++ b/apps/stasher/python/src/code.leo @@ -2,7 +2,7 @@ <leo_file> <leo_header file_format="2" tnodes="0" max_tnode_index="35" clone_windows="0"/> <globals body_outline_ratio="0.34387755102"> - <global_window_position top="146" left="194" height="709" width="980"/> + <global_window_position top="157" left="189" height="709" width="980"/> <global_log_window_position top="0" left="0" height="0" width="0"/> </globals> <preferences> @@ -291,9 +291,9 @@ <v t="aum.20040814112703"><vh>spawnproc</vh></v> <v t="aum.20040814112703.1"><vh>killproc</vh></v> <v t="aum.20040814120624"><vh>i2psocket</vh></v> -<v t="aum.20040813212609" a="TV"><vh>usage</vh></v> +<v t="aum.20040813212609"><vh>usage</vh></v> <v t="aum.20040814015747"><vh>err</vh></v> -<v t="aum.20040813211551"><vh>main</vh></v> +<v t="aum.20040813211551" a="TV"><vh>main</vh></v> </v> <v t="aum.20040803141131" a="E"><vh>MAINLINE</vh> <v t="aum.20040812110124"><vh>mainline</vh></v> @@ -767,6 +767,10 @@ except: - a raw string which will be hashed into a KHash object - val - a string, the value associated with the key + Keywords: + - local - default False - if True, limits the insert to the + local node + If the value is larger than L{maxValueSize}, a L{KValueTooLarge} exception will occur. """ @@ -4976,10 +4980,10 @@ stasher.logToSocket = 19199 try: opts, args = getopt.getopt(sys.argv[1:], - "h?vV:S:C:sd:f", + "h?vV:S:C:sd:fl", ['help', 'version', 'samaddr=', 'clientaddr=', 'verbosity=', 'status', 'datadir=', 'foreground', - 'shortversion', + 'shortversion', 'localonly', ]) except: traceback.print_exc(file=sys.stdout) @@ -4989,6 +4993,7 @@ stasher.logToSocket = 19199 verbosity = 2 debug = False foreground = False + localOnly = False for opt, val in opts: @@ -5022,6 +5027,9 @@ stasher.logToSocket = 19199 sys.stdout.flush() sys.exit(0) + elif opt in ['-l', '--localonly']: + localOnly = True + #print "Debug - bailing" #print repr(opts) #print repr(args) @@ -5147,7 +5155,10 @@ stasher.logToSocket = 19199 else: outfile = sys.stdout - res = client.get(key) + if logVerbosity >= 3: + sys.stderr.write("Searching for key - may take up to %s seconds or more\n" % ( + timeout['findData'])) + res = client.get(key, local=localOnly) if res == None: err("Failed to retrieve '%s'" % key) sys.exit(1) @@ -5179,7 +5190,10 @@ stasher.logToSocket = 19199 if len(val) > maxValueSize: err("File is too big - please trim to %s" % maxValueSize) - res = client.put(key, val) + if logVerbosity >= 3: + sys.stderr.write("Inserting key - may take up to %s seconds\n" % ( + timeout['findNode'] + timeout['store'])) + res = client.put(key, val, local=localOnly) if res == None: err("Failed to insert '%s'" % key) sys.exit(1) @@ -5274,6 +5288,8 @@ stasher.logToSocket = 19199 print " default is ~/.stasher" print " -f, --foreground - only valid for 'start' cmd - runs the node" print " in foreground without spawning - for debugging" + print " -l, --localonly - only valid for get/put - restricts the get/put" + print " operation to the local node only" print print "Commands:" print " start [<nodename>]" @@ -5306,7 +5322,6 @@ stasher.logToSocket = 19199 sys.exit(0) - </t> <t tx="aum.20040813232532"></t> <t tx="aum.20040813232532.1">class KNodeServer(KBase, SocketServer.ThreadingMixIn, SocketServer.TCPServer): @@ -5351,8 +5366,9 @@ stasher.logToSocket = 19199 self.log(3, "cmd=%s args=%s" % (repr(cmd), repr(args))) - if cmd == "get": - value = node.get(args) + if cmd in ["get", "getlocal"]: + isLocal = cmd == "getlocal" + value = node.get(args, local=isLocal) if value == None: write("notfound\n") else: @@ -5362,11 +5378,12 @@ stasher.logToSocket = 19199 finish() return - elif cmd == "put": + elif cmd in ["put", "putlocal"]: + isLocal = cmd == "putlocal" try: size = int(readline()) value = read(size) - res = node.put(args, value) + res = node.put(args, value, local=isLocal) if res: write("ok\n") else: @@ -5490,14 +5507,27 @@ stasher.logToSocket = 19199 raise Exception("Not connected to valid stasher interface") </t> -<t tx="aum.20040814001456.2">def get(self, key): +<t tx="aum.20040814001456.2">def get(self, key, **kw): """ sends a get command to stasher socket, and retrieves and interprets result + + Arguments: + - key - key to retrieve + + Keywords: + - local - default False - if True, only looks in local storage + + Returns key's value if found, or None if key not found """ + if kw.get('local', False): + cmd = 'getlocal' + else: + cmd = 'get' + self.connect() - self.write("get %s\n" % key) + self.write("%s %s\n" % (cmd, key)) self.flush() #print "waiting for resp line" @@ -5525,12 +5555,25 @@ stasher.logToSocket = 19199 self.connect() self.close() </t> -<t tx="aum.20040814002236">def put(self, key, val): +<t tx="aum.20040814002236">def put(self, key, val, **kw): """ Tells remote stasher port to insert a file into the network + + Arguments: + - key - key to insert under + - val - value to insert under this key + + Keywords: + - local - default False - if True, only looks in local storage + """ + if kw.get('local', False): + cmd = 'putlocal' + else: + cmd = 'put' + self.connect() - self.write("put %s\n" % key) + self.write("%s %s\n" % (cmd, key)) self.write("%s\n" % len(val)) self.write(val) self.flush() diff --git a/apps/stasher/python/src/stasher.py b/apps/stasher/python/src/stasher.py index bfed652463..d007282a29 100644 --- a/apps/stasher/python/src/stasher.py +++ b/apps/stasher/python/src/stasher.py @@ -2753,8 +2753,9 @@ class KNodeReqHandler(KBase, SocketServer.StreamRequestHandler): self.log(3, "cmd=%s args=%s" % (repr(cmd), repr(args))) - if cmd == "get": - value = node.get(args) + if cmd in ["get", "getlocal"]: + isLocal = cmd == "getlocal" + value = node.get(args, local=isLocal) if value == None: write("notfound\n") else: @@ -2764,11 +2765,12 @@ class KNodeReqHandler(KBase, SocketServer.StreamRequestHandler): finish() return - elif cmd == "put": + elif cmd in ["put", "putlocal"]: + isLocal = cmd == "putlocal" try: size = int(readline()) value = read(size) - res = node.put(args, value) + res = node.put(args, value, local=isLocal) if res: write("ok\n") else: @@ -2884,14 +2886,27 @@ class KNodeClient(KBase): #@-node:close #@+node:get - def get(self, key): + def get(self, key, **kw): """ sends a get command to stasher socket, and retrieves and interprets result + + Arguments: + - key - key to retrieve + + Keywords: + - local - default False - if True, only looks in local storage + + Returns key's value if found, or None if key not found """ + if kw.get('local', False): + cmd = 'getlocal' + else: + cmd = 'get' + self.connect() - self.write("get %s\n" % key) + self.write("%s %s\n" % (cmd, key)) self.flush() #print "waiting for resp line" @@ -2908,12 +2923,25 @@ class KNodeClient(KBase): #@-node:get #@+node:put - def put(self, key, val): + def put(self, key, val, **kw): """ Tells remote stasher port to insert a file into the network + + Arguments: + - key - key to insert under + - val - value to insert under this key + + Keywords: + - local - default False - if True, only looks in local storage + """ + if kw.get('local', False): + cmd = 'putlocal' + else: + cmd = 'put' + self.connect() - self.write("put %s\n" % key) + self.write("%s %s\n" % (cmd, key)) self.write("%s\n" % len(val)) self.write(val) self.flush() @@ -3220,6 +3248,10 @@ class KNode(KBase): - a raw string which will be hashed into a KHash object - val - a string, the value associated with the key + Keywords: + - local - default False - if True, limits the insert to the + local node + If the value is larger than L{maxValueSize}, a L{KValueTooLarge} exception will occur. """ @@ -4035,6 +4067,8 @@ def usage(detailed=False, ret=0): print " default is ~/.stasher" print " -f, --foreground - only valid for 'start' cmd - runs the node" print " in foreground without spawning - for debugging" + print " -l, --localonly - only valid for get/put - restricts the get/put" + print " operation to the local node only" print print "Commands:" print " start [<nodename>]" @@ -4067,7 +4101,6 @@ def usage(detailed=False, ret=0): sys.exit(0) - #@-node:usage #@+node:err def err(msg): @@ -4085,10 +4118,10 @@ def main(): try: opts, args = getopt.getopt(sys.argv[1:], - "h?vV:S:C:sd:f", + "h?vV:S:C:sd:fl", ['help', 'version', 'samaddr=', 'clientaddr=', 'verbosity=', 'status', 'datadir=', 'foreground', - 'shortversion', + 'shortversion', 'localonly', ]) except: traceback.print_exc(file=sys.stdout) @@ -4098,6 +4131,7 @@ def main(): verbosity = 2 debug = False foreground = False + localOnly = False for opt, val in opts: @@ -4131,6 +4165,9 @@ def main(): sys.stdout.flush() sys.exit(0) + elif opt in ['-l', '--localonly']: + localOnly = True + #print "Debug - bailing" #print repr(opts) #print repr(args) @@ -4256,7 +4293,10 @@ def main(): else: outfile = sys.stdout - res = client.get(key) + if logVerbosity >= 3: + sys.stderr.write("Searching for key - may take up to %s seconds or more\n" % ( + timeout['findData'])) + res = client.get(key, local=localOnly) if res == None: err("Failed to retrieve '%s'" % key) sys.exit(1) @@ -4288,7 +4328,10 @@ def main(): if len(val) > maxValueSize: err("File is too big - please trim to %s" % maxValueSize) - res = client.put(key, val) + if logVerbosity >= 3: + sys.stderr.write("Inserting key - may take up to %s seconds\n" % ( + timeout['findNode'] + timeout['store'])) + res = client.put(key, val, local=localOnly) if res == None: err("Failed to insert '%s'" % key) sys.exit(1) -- GitLab