Index: trunk/Nebulous-Server/lib/Nebulous/Server.pm
===================================================================
--- trunk/Nebulous-Server/lib/Nebulous/Server.pm	(revision 19473)
+++ trunk/Nebulous-Server/lib/Nebulous/Server.pm	(revision 19493)
@@ -1,5 +1,5 @@
 # Copyright (c) 2004-2008  Joshua Hoblitt
 #
-# $Id: Server.pm,v 1.85 2008-09-10 23:55:54 bills Exp $
+# $Id: Server.pm,v 1.86 2008-09-11 22:35:52 jhoblitt Exp $
 
 package Nebulous::Server;
@@ -169,21 +169,20 @@
     # vol_name overrides the key implied volume
     $key = parse_neb_key($key, $vol_name);
-
-    if ($vol_name eq "99") {
-        use Data::Dumper;
-        print Dumper($key);
-    }
+    $vol_name = $key->volume;
 
     # the key's volume can't be validiated on input for this method so we have
     # to check it after parsing the key
-    if (defined $key->volume
-        and not $key->soft_volume
-        and not $self->_is_valid_volume_name($key->volume)
-    ) {
-        $log->logdie("$vol_name is not a valid volume name");
+    if (defined $vol_name
+        and not $self->_is_valid_volume_name($key->volume)) {
+        if ($key->soft_volume) {
+            $log->warn( "$vol_name is not a known volume name" );
+            $vol_name = undef;
+        } else {
+            die "$vol_name is not a valid volume name"
+        }
     }
         
     my ($vol_id, $vol_host, $vol_path, $vol_xattr)
-        = $self->_get_storage_volume($key->volume, $key->soft_volume);
+        = $self->_get_storage_volume($vol_name, $key->soft_volume);
 
     my $uri;
@@ -252,4 +251,5 @@
     };
     if ($@) {
+#        and not $key->soft_volume
         $db->rollback;
         $log->debug("rollback");
@@ -358,14 +358,16 @@
     $log->debug("entered - @_");
 
+    # vol_name overrides the key implied volume
     $key = parse_neb_key($key, $vol_name);
-    # vol_name overrides the key implied volume
     $vol_name = $key->volume;
 
-    if (defined $key->soft_volume) {
-        $vol_name = undef;
-    }
-
-    if (defined $vol_name and !$self->_is_valid_volume_name($vol_name)) {
-        die "$vol_name is not a valid volume name"
+    if (defined $vol_name
+        and not $self->_is_valid_volume_name($key->volume)) {
+        if ($key->soft_volume) {
+            $log->warn( "$vol_name is not a known volume name" );
+            $vol_name = undef;
+        } else {
+            die "$vol_name is not a valid volume name"
+        }
     }
         
@@ -430,4 +432,9 @@
     if ($@) {
         $db->rollback;
+        # handle soft volumes
+        if (defined $vol_name and defined $key->soft_volume) {
+            $log->debug("retrying with 'any' volume");
+            return $self->replicate_object($key->path, 'any');
+        }
         $log->debug("rollback");
         $log->logdie("error: $@");
@@ -928,11 +935,11 @@
         {
             type        => SCALAR|UNDEF,
-            callbacks   => {
-                # check that the volume name requested is valid
-                'is valid volume name' => sub {
-                    return 1 if not defined $_[0];
-                    $self->_is_valid_volume_name($_[0])
-                },
-            },
+#            callbacks   => {
+#                # check that the volume name requested is valid
+#                'is valid volume name' => sub {
+#                    return 1 if not defined $_[0];
+#                    $self->_is_valid_volume_name($_[0])
+#                },
+#            },
             optional    => 1,
         },
@@ -945,11 +952,18 @@
     $log->debug("entered - @_");
 
+    # vol_name overrides the key implied volume
     $key = parse_neb_key($key, $vol_name);
-    # vol_name overrides the key implied volume
     $vol_name = $key->volume;
 
-    # handle soft volumes
-    if (defined $key->soft_volume) {
-        $vol_name = undef;
+    # the key's volume can't be validiated on input for this method so we have
+    # to check it after parsing the key
+    if (defined $vol_name
+        and not $self->_is_valid_volume_name($key->volume)) {
+        if ($key->soft_volume) {
+            $log->warn( "$vol_name is not a known volume name" );
+            $vol_name = undef;
+        } else {
+            die "$vol_name is not a valid volume name"
+        }
     }
 
@@ -980,5 +994,13 @@
         }
     };
-    $log->logdie("database error: $@") if $@;
+    if ($@) {
+        $db->rollback;
+        # handle soft volumes
+        if (defined $vol_name and defined $key->soft_volume) {
+            $log->debug("retrying with 'any' volume");
+            return $self->find_instances($key->path, 'any');
+        }
+        $log->logdie("database error: $@");
+    }
 
     # XXX remove this?
@@ -1171,5 +1193,4 @@
     my ($vol_id, $vol_host, $vol_path, $xattr);
     eval {
-        # TODO cache this?
         my $query;
         my $rows;
