On Fri, May 03, 2002 at 04:56:51PM -0400, Jan Harkes wrote:
> I normally don't ever see that message. It looks like an RVM transaction
> is started while there is already one active. My guess is that the
> ongoing transaction is where the "reinstalling" message is displayed.
> Now I just have to figure out where the second Recov_BeginTrans is
> called.
And the fix is...
Index: venusvol.cc
===================================================================
RCS file: /afs/cs/project/coda-src/cvs/coda/coda-src/venus/venusvol.cc,v
retrieving revision 4.71
diff -u -u -r4.71 venusvol.cc
--- venusvol.cc 2002/01/30 17:07:50 4.71
+++ venusvol.cc 2002/05/03 20:59:45
@@ -406,6 +406,7 @@
return(0);
}
+/* must NOT be called from within a transaction */
static int GetVolReps(VolumeInfo *volinfo, volrep *volreps[VSG_MEMBERS])
{
int i, err = 0;
@@ -449,12 +450,15 @@
/* Check whether the key is already in the database. */
if ((v = Find(volinfo->Vid))) {
- Recov_BeginTrans();
if (strncmp(v->name, volname, V_MAXVOLNAMELEN) != 0) {
eprint("reinstalling volume %s (%s)", v->GetName(), volname);
+ Recov_BeginTrans();
+
rvmlib_set_range(v->name, V_MAXVOLNAMELEN);
strcpy(v->name, volname);
+
+ Recov_EndTrans(0);
}
/* add code to support growing/shrinking VSG's for replicated volumes
@@ -464,6 +468,8 @@
vp = (repvol *)v;
err = GetVolReps(volinfo, volreps);
if (!err) {
+ Recov_BeginTrans();
+
for (i = 0; i < VSG_MEMBERS; i++) {
/* did the volume replica change? */
if (vp->volreps[i] != volreps[i]) {
@@ -479,13 +485,12 @@
vp->Reconfigure();
}
}
+ Recov_EndTrans(0);
}
/* put whatever volumes were unchanged */
for (i = 0; i < VSG_MEMBERS; i++)
VDB->Put((volent **)&volreps[i]);
}
-
- Recov_EndTrans(0);
return(v);
}