Amanda-Users

Re: tapetype problem

2007-06-03 15:11:43
Subject: Re: tapetype problem
From: abrantes <abrantes.filho AT hospitalsantamonica DOT org>
To: amanda-users AT amanda DOT org
Date: Sun, 3 Jun 2007 12:06:18 -0700 (PDT)
Thank you very much!

After the patch, amtapetype is perfectly runing. Now I can realy test Amanda
in order to replace our ARCServe servers here in Hospital Santa Mônica
(Brazil).

Thanks again!

Abrantes


amanda-3 wrote:
> 
> abrantes's Mail:
>> 
>> The tape drive is OK. Some tests:
>> 
>> [... deleted ...]
>> 
>> # amtapetype -o -b 10240 -e 40g -f /dev/nst0 -t
>> "DELL_POWERVAULT_110T_DLT_VS_80"
>> Estimate phase 1...amtapetype: could not write any data in this pass:
>> Success
> I had a similar problem with with a DDS3 tape drive (HP-C1537A) connected
> to
> my alpha running (at that time) DU 4.0d.  It seemed to me that the drive /
> driver returns immediately after a rewind operation, but a following write
> on the same (kept-open) filedescriptor returns unsuccessfully if the
> rewind
> did not complete yet.  Amtapetype exactly does this.
> 
> The situation was not reproducible in my setup by a sequence of shell
> commands (like ``mt rewind; tar -c ...''), as each shell command is an own
> process and opens its own filedescriptor for accessing the tape.
> 
> For me, the attached patch fixed the problem.
> 
> Bye
>       \franz
> 
> --- amanda-2.5.2-20070523/tape-src/tapetype.c.orig    Fri May  4 13:39:08
> 2007
> +++ amanda-2.5.2-20070523/tape-src/tapetype.c Wed May 30 09:30:24 2007
> @@ -59,8 +59,9 @@
>  static int writeblock(int fd);
>  static off_t writeblocks(int fd, off_t nblks);
>  static void allocrandombytes(void);
> -static void do_pass0(off_t size, time_t *seconds, int dorewind);
> -static void do_pass(off_t size, off_t *blocks, off_t *files, time_t
> *seconds);
> +static void do_pass0(off_t size, time_t *seconds, int dorewind, char
> *tapedev);
> +static void do_pass(off_t size, off_t *blocks, off_t *files, time_t
> *seconds,
> +             char *tapedev);
>  static void help(void);
>  static void initnotrandombytes(void);
>  static void initrandombytes(void);
> @@ -143,7 +144,10 @@
>    if ((w = tapefd_write(fd, getrandombytes(), blocksize)) ==
> (ssize_t)blocksize) {
>      return 1;
>    }
> -  if (w >= 0) {
> +  /*
> +  fprintf(stderr, "\nwriteblock(): w=%d, errno=%d\n", w, errno);
> +  */
> +  if (w != (size_t) -1) {
>      short_write = 1;
>    } else {
>      short_write = 0;
> @@ -222,7 +226,8 @@
>      off_t    size,
>      off_t *  blocks,
>      off_t *  files,
> -    time_t * seconds)
> +    time_t * seconds,
> +    char *   tapedev)
>  {
>    off_t blks;
>    time_t start, end;
> @@ -233,6 +238,12 @@
>           sProgName, tapedev, strerror(errno));
>      exit(1);
>    }
> +  if (((-1 == tapefd_close(fd)) ||
> +       (-1 == (fd = tape_open(tapedev, O_RDWR))))) {
> +    fprintf(stderr, "%s: could not re-open %s: %s\n",
> +         sProgName, tapedev, strerror(errno));
> +    exit(1);
> +  }
>  
>    time(&start);
>  
> @@ -280,7 +291,8 @@
>  do_pass0(
>      off_t    size,
>      time_t * seconds,
> -    int              dorewind)
> +    int              dorewind,
> +    char *   tapedev)
>  {
>    off_t blks;
>    time_t start, end;
> @@ -291,6 +303,13 @@
>           sProgName, tapedev, strerror(errno));
>      exit(1);
>    }
> +  if (dorewind &&
> +      ((-1 == tapefd_close(fd)) ||
> +       (-1 == (fd = tape_open(tapedev, O_RDWR))))) {
> +    fprintf(stderr, "%s: could not re-open %s: %s\n",
> +         sProgName, tapedev, strerror(errno));
> +    exit(1);
> +  }
>  
>    time(&start);
>  
> @@ -530,8 +549,8 @@
>       * first a dummy pass to rewind, stop, start and
>       * get drive streaming, then do the real timing
>       */
> -    do_pass0(pass0size, &pass2time, 1);
> -    do_pass0(pass0size, &pass1time, 0);
> +    do_pass0(pass0size, &pass2time, 1, tapedev);
> +    do_pass0(pass0size, &pass1time, 0, tapedev);
>      if (pass0size >= (off_t)(10 * 1024 * 1024)) {
>        fprintf(stderr,
>       "\rTape device is too fast to detect hardware compression...\n");
> @@ -552,8 +571,8 @@
>    initrandombytes();
>  
>    fprintf(stderr, "Estimate phase 2...");
> -  do_pass0(pass0size, &pass2time, 1);        /* rewind and get drive 
> streaming
> */
> -  do_pass0(pass0size, &pass2time, 0);
> +  do_pass0(pass0size, &pass2time, 1, tapedev);       /* rewind and get drive
> streaming */
> +  do_pass0(pass0size, &pass2time, 0, tapedev);
>    fprintf(stderr, "\rWriting " OFF_T_FMT
>       " Mbyte uncompresseable data:  " TIME_T_FMT " sec\n",
>       (OFF_T_FMT_TYPE)((off_t)blockkb * pass0size / (off_t)1024),
> @@ -603,13 +622,13 @@
>    if(pass1size <= (off_t)0) {
>      pass1size = (off_t)2;                            /* strange end case */
>    }
> -  do_pass(pass1size, &pass1blocks, &pass1files, &pass1time);
> +  do_pass(pass1size, &pass1blocks, &pass1files, &pass1time, tapedev);
>  
>    /*
>     * Do pass 2 -- write smaller files until error.
>     */
>    pass2size = pass1size / (off_t)2;
> -  do_pass(pass2size, &pass2blocks, &pass2files, &pass2time);
> +  do_pass(pass2size, &pass2blocks, &pass2files, &pass2time, tapedev);
>  
>    /*
>     * Compute the size of a filemark as the difference in data written
> 
> 

-- 
View this message in context: 
http://www.nabble.com/tapetype-problem-tf3834022.html#a10939645
Sent from the Amanda - Users mailing list archive at Nabble.com.



<Prev in Thread] Current Thread [Next in Thread>
  • Re: tapetype problem, abrantes <=