threaded-volserver-progress-20031114
authorDerrick Brashear <shadow@dementia.org>
Sat, 15 Nov 2003 04:59:08 +0000 (04:59 +0000)
committerDerrick Brashear <shadow@dementia.org>
Sat, 15 Nov 2003 04:59:08 +0000 (04:59 +0000)
not ready for primetime. not even close.

12 files changed:
Makefile.in
configure.in
src/tvolser/Makefile.in [new file with mode: 0644]
src/vol/fssync.c
src/vol/volume.c
src/vol/volume.h
src/vol/vutil.c
src/volser/common.c
src/volser/dumpstuff.c
src/volser/volmain.c
src/volser/volprocs.c
src/volser/volser.p.h

index 9acc7c5..1dd09ff 100644 (file)
@@ -230,6 +230,18 @@ tviced: cmd comerr viced vlserver libafsrpc libafsauthent
 volser: cmd comerr tviced usd kauth audit
        ${COMPILE_PART1} volser ${COMPILE_PART2}
 
+tvolser: project tviced usd libafsrpc libafsauthent
+       case ${SYS_NAME} in                                             \
+       alpha_dux*|sgi_*|sun*_5*|rs_aix*|*linux*|hp_ux11*|ia64_hpux*)   \
+               ${COMPILE_PART1} tvolser  ${COMPILE_PART2} ;;           \
+       *_darwin_[1-6][0-9])                                            \
+               echo Not building MT volser for ${SYS_NAME} ;;          \
+       *_darwin_*)                                                     \
+               ${COMPILE_PART1} tvolser ${COMPILE_PART2} ;;            \
+       *)                                                              \
+               echo Not building MT volser for ${SYS_NAME} ;;          \
+       esac
+
 venus: cmd comerr volser ptserver
        ${COMPILE_PART1} venus ${COMPILE_PART2}
        ${COMPILE_PART1} venus/test ${COMPILE_PART2}
index a200c7f..76956d1 100644 (file)
@@ -106,6 +106,7 @@ src/tests/run-tests \
 src/tests/OpenAFS/Dirpath.pm \
 src/tsm41/Makefile \
 src/tviced/Makefile \
+src/tvolser/Makefile \
 src/ubik/Makefile \
 src/update/Makefile \
 src/usd/test/Makefile \
diff --git a/src/tvolser/Makefile.in b/src/tvolser/Makefile.in
new file mode 100644 (file)
index 0000000..4331105
--- /dev/null
@@ -0,0 +1,206 @@
+# Copyright 2000, International Business Machines Corporation and others.
+# All Rights Reserved.
+# 
+# This software has been released under the terms of the IBM Public
+# License.  For details, see the LICENSE file in the top-level source
+# directory or online at http://www.openafs.org/dl/license10.html
+
+srcdir=@srcdir@
+include @TOP_OBJDIR@/src/config/Makefile.config
+HELPER_SPLINT=@HELPER_SPLINT@
+
+CC=${MT_CC}
+CFLAGS=${COMMON_CFLAGS} -I.. -DNINTERFACE ${MT_CFLAGS} -DRXDEBUG
+
+CCRULE=${CC} ${CFLAGS} -c $?
+
+VICED=../viced
+VLSERVER=../vlserver
+LWP=../lwp
+LIBACL=../libacl
+UTIL=../util
+DIR=../dir
+VOL=../vol
+FSINT=../fsint
+VOLSER=../volser
+
+VOLSEROBJS=volmain.o volprocs.o physio.o voltrans.o volerr.o volint.cs.o dumpstuff.o  volint.ss.o volint.xdr.o vscommon.o
+
+VLSERVEROBJS=#vldbint.cs.o vldbint.xdr.o
+
+LWPOBJS=lock.o fasttime.o threadname.o
+
+LIBACLOBJS=aclprocs.o netprocs.o
+
+UTILOBJS=assert.o uuid.o serverLog.o fileutil.o netutils.o dirpath.o volparse.o flipbase64.o softsig.o
+
+DIROBJS=buffer.o dir.o salvage.o
+
+VOLOBJS= vnode.o volume.o vutil.o partition.o fssync.o purge.o \
+        clone.o devname.o common.o ihandle.o listinodes.o namei_ops.o nuke.o
+
+FSINTOBJS=# afsaux.o afscbint.cs.o afsint.ss.o afsint.xdr.o
+
+objects= ${VOLSEROBJS} ${VLSERVEROBJS} ${LWPOBJS} ${LIBACLOBJS} \
+        ${UTILOBJS} ${DIROBJS} ${VOLOBJS} ${FSINTOBJS}
+
+LIBS=${TOP_LIBDIR}/libafsauthent.a ${TOP_LIBDIR}/libafsrpc.a ${TOP_LIBDIR}/util.a
+
+all: volserver
+
+COMPILE=${CC} ${CFLAGS} -c $?
+
+volmain.o: ${VOLSER}/volmain.c
+       ${COMPILE}
+volprocs.o: ${VOLSER}/volprocs.c
+       ${COMPILE}
+physio.o: ${VOLSER}/physio.c
+       ${COMPILE}
+voltrans.o: ${VOLSER}/voltrans.c
+       ${COMPILE}
+volerr.o: ${VOLSER}/volerr.c
+       ${COMPILE}
+volint.cs.o: ${VOLSER}/volint.cs.c
+       ${COMPILE}
+dumpstuff.o: ${VOLSER}/dumpstuff.c
+       ${COMPILE}
+volint.ss.o: ${VOLSER}/volint.ss.c
+       ${COMPILE}
+volint.xdr.o: ${VOLSER}/volint.xdr.c
+       ${COMPILE}
+
+assert.o: ${UTIL}/assert.c
+       ${COMPILE}
+
+uuid.o: ${UTIL}/uuid.c
+       ${COMPILE}
+
+serverLog.o: ${UTIL}/serverLog.c
+       ${COMPILE}
+
+fileutil.o: ${UTIL}/fileutil.c
+       ${COMPILE}
+
+volparse.o: ${UTIL}/volparse.c
+       ${COMPILE}
+
+flipbase64.o: ${UTIL}/flipbase64.c
+       ${COMPILE}
+
+netutils.o: ${UTIL}/netutils.c
+       ${COMPILE}
+
+dirpath.o: ${UTIL}/dirpath.c
+       ${COMPILE}
+
+softsig.o: ${UTIL}/softsig.c
+       ${COMPILE}
+
+lock.o: ${LWP}/lock.c
+       ${COMPILE}
+
+fasttime.o: ${LWP}/fasttime.c
+       ${COMPILE}
+
+threadname.o: ${LWP}/threadname.c
+       ${COMPILE}
+
+aclprocs.o: ${LIBACL}/aclprocs.c
+       ${COMPILE}
+
+netprocs.o: ${LIBACL}/netprocs.c
+       ${COMPILE}
+
+vldbint.cs.o: ${VLSERVER}/vldbint.cs.c
+       ${COMPILE}
+
+vldbint.xdr.o: ${VLSERVER}/vldbint.xdr.c
+       ${COMPILE}
+
+buffer.o: ${DIR}/buffer.c
+       ${COMPILE}
+
+dir.o: ${DIR}/dir.c
+       ${COMPILE}
+
+salvage.o: ${DIR}/salvage.c
+       ${COMPILE}
+
+vnode.o: ${VOL}/vnode.c
+       ${COMPILE}
+
+volume.o: ${VOL}/volume.c
+       ${COMPILE}
+
+vutil.o: ${VOL}/vutil.c
+       ${COMPILE}
+
+partition.o: ${VOL}/partition.c
+       ${COMPILE}
+
+nuke.o: ${VOL}/nuke.c
+       ${COMPILE}
+
+fssync.o: ${VOL}/fssync.c
+       ${COMPILE}
+
+purge.o: ${VOL}/purge.c
+       ${COMPILE}
+
+clone.o: ${VOL}/clone.c
+       ${COMPILE}
+
+devname.o: ${VOL}/devname.c
+       ${COMPILE}
+
+common.o: ${VOL}/common.c
+       ${COMPILE}
+
+vscommon.o: ${VOLSER}/common.c
+       ${COMPILE} -o vscommon.o
+
+listinodes.o: ${VOL}/listinodes.c
+       ${COMPILE}
+
+ihandle.o: ${VOL}/ihandle.c
+       ${COMPILE}
+
+namei_ops.o: ${VOL}/namei_ops.c
+       ${COMPILE}
+
+afsaux.o: ${FSINT}/afsaux.c
+       ${COMPILE}
+
+afscbint.cs.o: ${FSINT}/afscbint.cs.c
+       ${COMPILE}
+
+afscbint.ss.o: ${FSINT}/afscbint.ss.c
+       ${COMPILE}
+
+afsint.cs.o: ${FSINT}/afsint.cs.c
+       ${COMPILE}
+
+afsint.ss.o: ${FSINT}/afsint.ss.c
+       ${COMPILE}
+
+afsint.xdr.o: ${FSINT}/afsint.xdr.c
+       ${COMPILE}
+
+volserver: ${objects} ${LIBS}
+       ${CC} ${LDFLAGS} -o volserver ${objects} ${LIBS} ${MTLIBS} ${XLIBS}
+
+${DEST}/root.server/usr/afs/bin/volserver: volserver
+       ${INSTALL} -ns $? $@
+
+install: ${DESTDIR}${afssrvlibexecdir}/volserver
+
+clean:
+       $(RM) -f *.o volserver core AFS_component_version_number.c
+
+include ../config/Makefile.version
+
+${DESTDIR}${afssrvlibexecdir}/volserver: volserver
+       ${INSTALL} -ns $? $@
+
+dest: ${DEST}/root.server/usr/afs/bin/volserver
+
index 1494552..7e0c0ef 100644 (file)
@@ -204,26 +204,31 @@ FSYNC_askfs(VolumeId volume, char *partName, int com, int reason)
     else
        command.partName[0] = 0;
     assert(FS_sd != -1);
+    VFSYNC_LOCK
 #ifdef AFS_NT40_ENV
     if (send(FS_sd, (char *)&command, sizeof(command), 0) != sizeof(command)) {
        printf("FSYNC_askfs: write to file server failed\n");
-       return FSYNC_DENIED;
+       response = FSYNC_DENIED;
+       goto done;
     }
     while ((n = recv(FS_sd, &response, 1, 0)) != 1) {
        if (n == 0 || WSAEINTR != WSAGetLastError()) {
            printf("FSYNC_askfs: No response from file server\n");
-           return FSYNC_DENIED;
+           response = FSYNC_DENIED;
+           goto done;
        }
     }
 #else
     if (write(FS_sd, &command, sizeof(command)) != sizeof(command)) {
        printf("FSYNC_askfs: write to file server failed\n");
-       return FSYNC_DENIED;
+       response = FSYNC_DENIED;
+       goto done;
     }
     while ((n = read(FS_sd, &response, 1)) != 1) {
        if (n == 0 || errno != EINTR) {
            printf("FSYNC_askfs: No response from file server\n");
-           return FSYNC_DENIED;
+           response = FSYNC_DENIED;
+           goto done;
        }
     }
 #endif
@@ -232,6 +237,8 @@ FSYNC_askfs(VolumeId volume, char *partName, int com, int reason)
            ("FSYNC_askfs: negative response from file server; volume %u, command %d\n",
             command.volume, (int)command.command);
     }
+ done:
+    VFSYNC_UNLOCK
 
     return response;
 }
index e9b140f..1d53d06 100644 (file)
@@ -148,6 +148,7 @@ RCSID
 #ifdef AFS_PTHREAD_ENV
 pthread_mutex_t vol_glock_mutex;
 pthread_mutex_t vol_attach_mutex;
+pthread_mutex_t vol_fsync_mutex;
 pthread_cond_t vol_put_volume_cond;
 pthread_cond_t vol_sleep_cond;
 #endif /* AFS_PTHREAD_ENV */
index 63cd6ea..d01e5b5 100644 (file)
@@ -30,6 +30,7 @@ typedef bit32 FileOffset;     /* Offset in this file */
 #include <pthread.h>
 extern pthread_mutex_t vol_glock_mutex;
 extern pthread_mutex_t vol_attach_mutex;
+extern pthread_mutex_t vol_fsync_mutex;
 extern pthread_cond_t vol_put_volume_cond;
 extern pthread_cond_t vol_sleep_cond;
 #define VATTACH_LOCK \
@@ -40,11 +41,17 @@ extern pthread_cond_t vol_sleep_cond;
     assert(pthread_mutex_lock(&vol_glock_mutex) == 0);
 #define VOL_UNLOCK \
     assert(pthread_mutex_unlock(&vol_glock_mutex) == 0);
+#define VFSYNC_LOCK \
+    assert(pthread_mutex_lock(&vol_fsync_mutex) == 0);
+#define VFSYNC_UNLOCK \
+    assert(pthread_mutex_unlock(&vol_fsync_mutex) == 0);
 #else /* AFS_PTHREAD_ENV */
 #define VATTACH_LOCK
 #define VATTACH_UNLOCK
 #define VOL_LOCK
 #define VOL_UNLOCK
+#define VFSYNC_LOCK
+#define VFSYNC_UNLOCK
 #endif /* AFS_PTHREAD_ENV */
 
 typedef enum { fileServer, volumeUtility, salvager } ProgramType;
index ed551c1..4bd448a 100644 (file)
@@ -139,7 +139,7 @@ VCreateVolume_r(Error * ec, char *partname, VolId volumeId, VolId parentId)
     handle = NULL;
 
     /* Verify that the parition is valid before writing to it. */
-    if (!(partition = VGetPartition(partname, 0))) {
+    if (!(partition = VGetPartition_r(partname, 0))) {
        Log("VCreateVolume: partition %s is not in service.\n", partname);
        *ec = VNOVOL;
        return NULL;
@@ -148,7 +148,7 @@ VCreateVolume_r(Error * ec, char *partname, VolId volumeId, VolId parentId)
     nearInodeHash(volumeId, nearInode);
     nearInode %= partition->f_files;
 #endif
-    VLockPartition(partname);
+    VLockPartition_r(partname);
     memset(&tempHeader, 0, sizeof(tempHeader));
     tempHeader.stamp.magic = VOLUMEHEADERMAGIC;
     tempHeader.stamp.version = VOLUMEHEADERVERSION;
@@ -282,7 +282,7 @@ VCreateVolume_r(Error * ec, char *partname, VolId volumeId, VolId parentId)
     }
     fsync(fd);
     close(fd);
-    return (VAttachVolumeByName(ec, partname, headerName, V_SECRETLY));
+    return (VAttachVolumeByName_r(ec, partname, headerName, V_SECRETLY));
 }
 
 
index f623839..30b536a 100644 (file)
@@ -17,6 +17,7 @@ RCSID
 #include <afs/afsutil.h>
 #include <afs/com_err.h>
 
+#ifndef AFS_PTHREAD_ENV
 /*@printflike@*/ void
 Log(const char *format, ...)
 {
@@ -26,6 +27,7 @@ Log(const char *format, ...)
     vViceLog(0, (format, args));
     va_end(args);
 }
+#endif
 
 void
 LogError(afs_int32 errcode)
@@ -34,6 +36,7 @@ LogError(afs_int32 errcode)
            ("%s: %s\n", error_table_name(errcode), error_message(errcode)));
 }
 
+#ifndef AFS_PTHREAD_ENV
 /*@printflike@*/ void
 Abort(const char *format, ...)
 {
@@ -45,10 +48,12 @@ Abort(const char *format, ...)
     va_end(args);
     abort();
 }
+#endif
 
 void
 InitErrTabs(void)
 {
+#ifndef AFS_PTHREAD_ENV
     initialize_KA_error_table();
     initialize_RXK_error_table();
     initialize_KTC_error_table();
@@ -56,5 +61,6 @@ InitErrTabs(void)
     initialize_CMD_error_table();
     initialize_VL_error_table();
     initialize_VOLS_error_table();
+#endif
     return;
 }
index ac206f9..4a5217e 100644 (file)
@@ -34,7 +34,11 @@ RCSID
 #endif
 #endif
 #include <sys/stat.h>
+#ifdef AFS_PTHREAD_ENV
+#include <assert.h>
+#else /* AFS_PTHREAD_ENV */
 #include <afs/assert.h>
+#endif /* AFS_PTHREAD_ENV */
 #include <rx/xdr.h>
 #include <rx/rx.h>
 #include <afs/afsint.h>
@@ -609,7 +613,9 @@ DumpFile(struct iod *iodp, int vnode, FdHandle_t * handleP)
        /* Now write the data out */
        if (iod_Write(iodp, (char *)p, howMany) != howMany)
            error = VOLSERDUMPERROR;
+#ifndef AFS_PTHREAD_ENV
        IOMGR_Poll();
+#endif
     }
 
     if (pad) {                 /* Any padding we hadn't reported yet */
@@ -798,8 +804,10 @@ DumpVnodeIndex(register struct iod *iodp, Volume * vp, VnodeClass class,
            code =
                DumpVnode(iodp, vnode, V_id(vp),
                          bitNumberToVnodeNumber(vnodeIndex, class), flag);
+#ifndef AFS_PTHREAD_ENV
        if (!flag)
            IOMGR_Poll();       /* if we dont' xfr data, but scan instead, could lose conn */
+#endif
     }
     STREAM_CLOSE(file);
     FDH_CLOSE(fdP);
index f6e94b1..8fa9058 100644 (file)
@@ -35,7 +35,11 @@ RCSID
 #include <afs/afsint.h>
 #include <stdio.h>
 #include <signal.h>
+#ifdef AFS_PTHREAD_ENV
+#include <assert.h>
+#else /* AFS_PTHREAD_ENV */
 #include <afs/assert.h>
+#endif /* AFS_PTHREAD_ENV */
 #include <afs/prs_fs.h>
 #include <afs/nfs.h>
 #include <lwp.h>
@@ -69,7 +73,9 @@ RCSID
 
 extern int (*vol_PollProc) ();
 extern struct volser_trans *TransList();
+#ifndef AFS_PTHREAD_ENV
 extern int IOMGR_Poll();
+#endif
 char *GlobalNameHack = NULL;
 int hackIsIn = 0;
 afs_int32 GlobalVolCloneId, GlobalVolParentId;
@@ -135,7 +141,11 @@ BKGLoop()
     while (1) {
        tv.tv_sec = GCWAKEUP;
        tv.tv_usec = 0;
+#ifdef AFS_PTHREAD_ENV
+        select(0, 0, 0, 0, &tv);
+#else
        (void)IOMGR_Select(0, 0, 0, 0, &tv);
+#endif
        GCTrans();
        TryUnlock();
        loop++;
@@ -155,7 +165,11 @@ BKGSleep()
 
     if (TTsleep) {
        while (1) {
+#ifdef AFS_PTHREAD_ENV
+           sleep(TTrun);
+#else /* AFS_PTHREAD_ENV */
            IOMGR_Sleep(TTrun);
+#endif
            for (tt = TransList(); tt; tt = tt->next) {
                if ((strcmp(tt->lastProcName, "DeleteVolume") == 0)
                    || (strcmp(tt->lastProcName, "Clone") == 0)
@@ -209,7 +223,6 @@ main(argc, argv)
      int argc;
      char **argv;
 {
-    char *pid;
     register afs_int32 code;
     struct rx_securityClass *(securityObjects[3]);
     struct rx_service *service;
@@ -340,7 +353,9 @@ main(argc, argv)
 #endif
     VInitVolumePackage(volumeUtility, 0, 0, CONNECT_FS, 0);
     DInit(40);
+#ifndef AFS_PTHREAD_ENV
     vol_PollProc = IOMGR_Poll; /* tell vol pkg to poll io system periodically */
+#endif
 #ifndef AFS_NT40_ENV
     rxi_syscallp = volser_syscall;
 #endif
@@ -365,11 +380,21 @@ main(argc, argv)
     OpenLog(AFSDIR_SERVER_VOLSERLOG_FILEPATH);
     SetupLogSignals();
 
-    /* create the lwp to garbage-collect old transactions and sleep periodically */
-    LWP_CreateProcess(BKGLoop, 16 * 1024, 3, (void *)0, "vol bkg daemon",
-                     &pid);
-    LWP_CreateProcess(BKGSleep, 16 * 1024, 3, (void *)0, "vol slp daemon",
-                     &pid);
+    {
+#ifdef AFS_PTHREAD_ENV
+       pthread_t tid;
+       pthread_attr_t tattr;
+       assert(pthread_attr_init(&tattr) == 0);
+       assert(pthread_attr_setdetachstate(&tattr, PTHREAD_CREATE_DETACHED) == 0);
+
+       assert(pthread_create(&tid, &tattr, BKGLoop, NULL) == 0);
+       assert(pthread_create(&tid, &tattr, BKGSleep, NULL) == 0);
+#else
+       PROCESS pid;
+       LWP_CreateProcess(BKGLoop, 16*1024, 3, 0, "vol bkg daemon", &pid);
+       LWP_CreateProcess(BKGSleep,16*1024, 3, 0, "vol slp daemon", &pid);
+#endif
+    }
 
     /* Create a single security object, in this case the null security object, for unauthenticated connections, which will be used to control security on connections made to this server */
 
index a390e0d..a75576b 100644 (file)
@@ -40,7 +40,11 @@ RCSID
 #include <rx/rxkad.h>
 #include <afs/afsint.h>
 #include <signal.h>
+#ifdef AFS_PTHREAD_ENV
+#include <assert.h>
+#else /* AFS_PTHREAD_ENV */
 #include <afs/assert.h>
+#endif /* AFS_PTHREAD_ENV */
 #include <afs/prs_fs.h>
 #include <afs/nfs.h>
 #include <lwp.h>
@@ -1916,7 +1920,9 @@ VolListOneVolume(acid, partid, volumeId, volumeInfo)
 
        if (volid == volumeId) {        /*copy other things too */
            found = 1;
+#ifndef AFS_PTHREAD_ENV
            IOMGR_Poll();       /*make sure that the client doesnot time out */
+#endif
            ttc = NewTrans(volid, partid);
            if (!ttc) {
                pntr->status = VBUSY;
@@ -2127,7 +2133,9 @@ VolXListOneVolume(a_rxCidP, a_partID, a_volID, a_volumeXInfoP)
             * doesn't time out) and to set up a transaction on the volume.
             */
            found = 1;
+#ifndef AFS_PTHREAD_ENV
            IOMGR_Poll();
+#endif
            ttc = NewTrans(currVolID, a_partID);
            if (!ttc) {
                /*
@@ -2304,7 +2312,9 @@ VolListVolumes(acid, partid, flags, volumeInfo)
        }
 
        if (flags) {            /*copy other things too */
+#ifndef AFS_PTHREAD_ENV
            IOMGR_Poll();       /*make sure that the client doesnot time out */
+#endif
            ttc = NewTrans(volid, partid);
            if (!ttc) {
                pntr->status = VBUSY;
@@ -2543,7 +2553,9 @@ VolXListVolumes(a_rxCidP, a_partID, a_flags, a_volumeXInfoP)
             * Full info about the volume desired.  Poll to make sure the
             * client doesn't time out, then start up a new transaction.
             */
+#ifndef AFS_PTHREAD_ENV
            IOMGR_Poll();
+#endif
            ttc = NewTrans(volid, a_partID);
            if (!ttc) {
                /*
index be9801c..6cea79e 100644 (file)
@@ -9,6 +9,12 @@
 
 #ifndef _VOLSER_
 #define _VOLSER_ 1
+
+#ifdef AFS_PTHREAD_ENV
+#include <assert.h>
+#include <pthread.h>
+#endif
+
 /* vflags, representing state of the volume */
 #define        VTDeleteOnSalvage       1       /* delete on next salvage */
 #define        VTOutOfService          2       /* never put this volume online */