Print this page
Revert "NEX-5801 Snapshots left over after failed backups"
This reverts commit f182fb95f09036db71fbfc6f0a6b90469b761f21.
NEX-5801 Snapshots left over after failed backups
Reviewed by: Rick Mesta <rick.mesta@nexenta.com>
Reviewed by: Evan Layton <evan.layton@nexenta.com>
Reviewed by: Sanjay Nadkarni <sanjay.nadkarni@nexenta.com>
NEX-2911 NDMP logging should use syslog and is too chatty

Split Close
Expand all
Collapse all
          --- old/usr/src/cmd/ndmpd/ndmp/ndmpd_dtime.c
          +++ new/usr/src/cmd/ndmpd/ndmp/ndmpd_dtime.c
↓ open down ↓ 31 lines elided ↑ open up ↑
  32   32   * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  33   33   * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  34   34   * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  35   35   * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  36   36   * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  37   37   * POSSIBILITY OF SUCH DAMAGE.
  38   38   */
  39   39  
  40   40  #include <sys/param.h>
  41   41  #include <sys/types.h>
       42 +#include <syslog.h>
  42   43  #include <ctype.h>
  43   44  #include <errno.h>
  44   45  #include <fcntl.h>
  45   46  #include <limits.h>
  46   47  #include <stdarg.h>
  47   48  #include <stdio.h>
  48   49  #include <stdlib.h>
  49   50  #include <string.h>
  50   51  #include <time.h>
  51   52  #include <unistd.h>
  52   53  #include <libnvpair.h>
  53      -#include "ndmpd_log.h"
  54   54  #include "ndmpd.h"
  55   55  
  56   56  /*
  57   57   * The dumpdates file on file system.
  58   58   */
  59   59  #define NDMP_DUMPDATES  "dumpdates"
  60   60  
  61   61  
  62   62  /*
  63   63   * Offsets into the ctime string to various parts.
↓ open down ↓ 90 lines elided ↑ open up ↑
 154  154          if ((then.tm_mon = lookup(&dbuf[E_MONTH])) < 0)
 155  155                  return (-1);
 156  156  
 157  157          then.tm_mday = atoi(&dbuf[E_DAY]);
 158  158          then.tm_hour = atoi(&dbuf[E_HOUR]);
 159  159          then.tm_min = atoi(&dbuf[E_MINUTE]);
 160  160          then.tm_sec = atoi(&dbuf[E_SECOND]);
 161  161          then.tm_year = atoi(&dbuf[E_YEAR]) - 1900;
 162  162          then.tm_isdst = ndmp_isdst;
 163  163  
 164      -        NDMP_LOG(LOG_DEBUG,
      164 +        syslog(LOG_DEBUG,
 165  165              "yday %d wday %d %d/%d/%d %02d:%02d:%02d",
 166  166              then.tm_yday, then.tm_wday, then.tm_year, then.tm_mon,
 167  167              then.tm_mday, then.tm_hour, then.tm_min, then.tm_sec);
 168  168  
 169  169          *t = mktime(&then);
 170  170  
 171  171          return (0);
 172  172  }
 173  173  
 174  174  
↓ open down ↓ 116 lines elided ↑ open up ↑
 291  291          if (!bpp || !*bpp)
 292  292                  return (-1);
 293  293  
 294  294          *bpp += strspn(*bpp, "\t ");
 295  295          save = t = *bpp;
 296  296  
 297  297          /*
 298  298           * For 'F', 'A', 'I', and 'D' return the character itself.
 299  299           */
 300  300          if (IS_LBR_BKTYPE(*t)) {
 301      -                NDMP_LOG(LOG_DEBUG, "Lbr bk type %c", *t);
      301 +                syslog(LOG_DEBUG, "Lbr bk type %c", *t);
 302  302                  /*
 303  303                   * Skip the backup type character and null terminate the
 304  304                   * string.
 305  305                   */
 306  306                  *++t = '\0';
 307  307                  *bpp = ++t;
 308  308                  return (toupper(*save));
 309  309          }
 310  310  
 311  311          while (isdigit(*t))
↓ open down ↓ 75 lines elided ↑ open up ↑
 387  387   * Print the dump date into the dumpdates file.
 388  388   */
 389  389  static void put_ddate(FILE *fp,
 390  390          time_t t)
 391  391  {
 392  392          char tbuf[64];
 393  393  
 394  394          if (!fp)
 395  395                  return;
 396  396  
 397      -        NDMP_LOG(LOG_DEBUG, "[%u]", t);
 398      -
 399  397          (void) ctime_r(&t, tbuf, sizeof (tbuf));
 400  398          /* LINTED variable format specifier */
 401  399          (void) fprintf(fp, tbuf);
 402  400  }
 403  401  
 404  402  
 405  403  /*
 406  404   * dd_free
 407  405   *
 408  406   * Free the linked list of dumpdates entries.
↓ open down ↓ 30 lines elided ↑ open up ↑
 439  437           * While parsing each line, if a line contains one of the
 440  438           * LBR-type levels, then checking the return value of
 441  439           * get_ddlevel() against negative values, it OK.  Because
 442  440           * neither of the 'F', 'A', 'I' nor 'D' have negative
 443  441           * ASCII value.
 444  442           */
 445  443          if (!ddp || !tbuf)
 446  444                  rv = -1;
 447  445          else if (!(nmp = get_ddname(&tbuf))) {
 448  446                  rv = -1;
 449      -                NDMP_LOG(LOG_DEBUG, "get_ddname failed 0x%p", nmp);
      447 +                syslog(LOG_ERR, "get_ddname failed 0x%p", nmp);
 450  448          } else if ((ddp->dd_level = get_ddlevel(&tbuf)) < 0) {
 451  449                  rv = -1;
 452      -                NDMP_LOG(LOG_DEBUG, "dd_level < 0 %d", ddp->dd_level);
      450 +                syslog(LOG_ERR, "dd_level < 0 %d", ddp->dd_level);
 453  451          } else if (!(un_buf = get_ddate(&tbuf))) {
 454  452                  rv = -1;
 455      -                NDMP_LOG(LOG_DEBUG, "get_ddate failed 0x%p", un_buf);
      453 +                syslog(LOG_ERR, "get_ddate failed 0x%p", un_buf);
 456  454          } else if (unctime(un_buf, &ddp->dd_ddate) < 0) {
 457  455                  rv = -1;
 458      -                NDMP_LOG(LOG_DEBUG, "unctime failed \"%s\"", un_buf);
      456 +                syslog(LOG_ERR, "unctime failed \"%s\"", un_buf);
 459  457          } else {
 460  458                  (void) strlcpy(ddp->dd_name, nmp, TLM_MAX_PATH_NAME);
 461  459                  rv = 0;
 462  460          }
 463  461  
 464  462          return (rv);
 465  463  }
 466  464  
 467  465  
 468  466  /*
↓ open down ↓ 13 lines elided ↑ open up ↑
 482  480  
 483  481          if (!fp || !ddatep || !recno)
 484  482                  return (-1);
 485  483  
 486  484          do {
 487  485                  if (getaline(fp, tbuf, sizeof (tbuf)) != tbuf)
 488  486                          return (-1);
 489  487          } while (!*tbuf);
 490  488  
 491  489          if (makedumpdate(ddatep, tbuf) < 0)
 492      -                NDMP_LOG(LOG_DEBUG,
      490 +                syslog(LOG_ERR,
 493  491                      "Unknown intermediate format in %s, line %d", tbuf, *recno);
 494  492  
 495  493          (*recno)++;
 496  494  
 497      -        if (IS_LBR_BKTYPE(ddatep->dd_level & 0xff)) {
 498      -                NDMP_LOG(LOG_DEBUG, "Lbr: [%s][%c][%u]",
 499      -                    ddatep->dd_name, ddatep->dd_level, ddatep->dd_ddate);
 500      -        } else
 501      -                NDMP_LOG(LOG_DEBUG, "[%s][%d][%u]",
 502      -                    ddatep->dd_name, ddatep->dd_level, ddatep->dd_ddate);
 503      -
 504  495          return (0);
 505  496  }
 506  497  
 507  498  
 508  499  /*
 509  500   * readdumptimes
 510  501   *
 511  502   * Read the dumpdates file and make a linked list of its entries.
 512  503   *
 513  504   * Returns:
↓ open down ↓ 34 lines elided ↑ open up ↑
 548  539   * dumprecout
 549  540   *
 550  541   * Print a record into the dumpdates file.
 551  542   */
 552  543  static void
 553  544  dumprecout(FILE *fp, dumpdates_t *ddp)
 554  545  {
 555  546          if (!ddp)
 556  547                  return;
 557  548  
 558      -        if (IS_LBR_BKTYPE(ddp->dd_level)) {
 559      -                NDMP_LOG(LOG_DEBUG, "Lbr: [%s][%c][%u]",
 560      -                    ddp->dd_name, ddp->dd_level, ddp->dd_ddate);
 561      -        } else
 562      -                NDMP_LOG(LOG_DEBUG, "[%s][%d][%u]",
 563      -                    ddp->dd_name, ddp->dd_level, ddp->dd_ddate);
 564      -
 565  549          put_ddname(fp, ddp->dd_name);
 566  550          (void) fputc('\t', fp);
 567  551          put_ddlevel(fp, ddp->dd_level);
 568  552          (void) fputc('\t', fp);
 569  553          put_ddate(fp, ddp->dd_ddate);
 570  554  }
 571  555  
 572  556  
 573  557  /*
 574  558   * initdumptimes
↓ open down ↓ 14 lines elided ↑ open up ↑
 589  573  
 590  574          if (!ddheadp)
 591  575                  return (-1);
 592  576  
 593  577          if (!ddates_pathname(fname))
 594  578                  return (-1);
 595  579  
 596  580          fp = fopen(fname, "r");
 597  581          if (!fp) {
 598  582                  if (errno != ENOENT) {
 599      -                        NDMP_LOG(LOG_ERR, "Cannot read %s: %m.", fname);
      583 +                        syslog(LOG_ERR, "Cannot read %s: %m.", fname);
 600  584                          return (-1);
 601  585                  }
 602  586                  /*
 603  587                   * Dumpdates does not exist, make an empty one.
 604  588                   */
 605      -                NDMP_LOG(LOG_DEBUG,
      589 +                syslog(LOG_DEBUG,
 606  590                      "No file `%s', making an empty one", fname);
 607  591  
 608  592                  fp = fopen(fname, "w");
 609  593                  if (!fp) {
 610      -                        NDMP_LOG(LOG_ERR, "Cannot create %s: %m.", fname);
      594 +                        syslog(LOG_ERR, "Cannot create %s: %m.", fname);
 611  595                          return (-1);
 612  596                  }
 613  597                  (void) fclose(fp);
 614  598  
 615  599                  fp = fopen(fname, "r");
 616  600                  if (!fp) {
 617      -                        NDMP_LOG(LOG_ERR,
      601 +                        syslog(LOG_ERR,
 618  602                              "Cannot read %s after creating it. %m.", fname);
 619  603                          return (-1);
 620  604                  }
 621  605          }
 622  606  
 623  607          rv = readdumptimes(fp, ddheadp);
 624  608          (void) fclose(fp);
 625  609  
 626  610          return (rv);
 627  611  }
↓ open down ↓ 16 lines elided ↑ open up ↑
 644  628          char fname[PATH_MAX], bakfname[PATH_MAX];
 645  629          FILE *rfp, *wfp;
 646  630          dumpdates_t ddhead, tmpdd;
 647  631          register dumpdates_t *ddp;
 648  632          int rv;
 649  633  
 650  634          if (!path)
 651  635                  return (-1);
 652  636  
 653  637          if (IS_LBR_BKTYPE(level)) {
 654      -                NDMP_LOG(LOG_DEBUG, "Lbr: [%s][%c][%u]", path, level, ddate);
      638 +                syslog(LOG_DEBUG, "Lbr: [%s][%c][%u]", path, level, ddate);
 655  639          } else {
 656      -                NDMP_LOG(LOG_DEBUG, "[%s][%d][%u]", path, level, ddate);
      640 +                syslog(LOG_DEBUG, "[%s][%d][%u]", path, level, ddate);
 657  641          }
 658  642  
 659  643          if (!ddates_pathname(fname)) {
 660      -                NDMP_LOG(LOG_ERR, "Cannot get dumpdate file path name.");
      644 +                syslog(LOG_ERR, "Cannot get dumpdate file path name.");
 661  645                  return (-1);
 662  646          }
 663  647  
 664  648          rfp = fopen(fname, "r");
 665  649          if (!rfp) {
 666      -                NDMP_LOG(LOG_DEBUG, "Creating %s.", fname);
      650 +                syslog(LOG_DEBUG, "Creating %s.", fname);
 667  651                  (void) memset((void *)&ddhead, 0, sizeof (ddhead));
 668  652                  if (initdumptimes(&ddhead) < 0) {
 669      -                        NDMP_LOG(LOG_ERR, "Could not initialize %s.",
      653 +                        syslog(LOG_ERR, "Could not initialize %s.",
 670  654                              NDMP_DUMPDATES);
 671  655                          dd_free(&ddhead);
 672  656                          return (-1);
 673  657                  }
 674  658          } else {
 675  659                  rv = readdumptimes(rfp, &ddhead);
 676  660  
 677  661                  if (rv < 0) {
 678      -                        NDMP_LOG(LOG_ERR, "Error reading dumpdates file.");
      662 +                        syslog(LOG_ERR, "Error reading dumpdates file.");
 679  663                          (void) fclose(rfp);
 680  664                          dd_free(&ddhead);
 681  665                          return (-1);
 682  666                  }
 683  667                  (void) fclose(rfp);
 684  668          }
 685  669  
 686  670          (void) snprintf(bakfname, PATH_MAX, "%s.bak", fname);
 687  671          wfp = fopen(bakfname, "w");
 688  672          if (!wfp) {
 689      -                NDMP_LOG(LOG_ERR, "Cannot open %s: %m.", bakfname);
      673 +                syslog(LOG_ERR, "Cannot open %s: %m.", bakfname);
 690  674                  dd_free(&ddhead);
 691  675                  return (-1);
 692  676          }
 693  677  
 694      -        NDMP_LOG(LOG_DEBUG, "[%s][%s]", fname, bakfname);
      678 +        syslog(LOG_DEBUG, "[%s][%s]", fname, bakfname);
 695  679  
 696  680          /* try to locate the entry in the file */
 697  681          found = 0;
 698  682          for (ddp = ddhead.dd_next; ddp; ddp = ddp->dd_next) {
 699  683                  if (ddp->dd_level != level)
 700  684                          continue;
 701  685                  if (strcmp(path, ddp->dd_name))
 702  686                          continue;
 703  687  
 704      -                NDMP_LOG(LOG_DEBUG, "Found: [%s][%d][%u]",
      688 +                syslog(LOG_DEBUG, "Found: [%s][%d][%u]",
 705  689                      ddp->dd_name, ddp->dd_level, ddp->dd_ddate);
 706  690  
 707  691                  /* update the record for the entry */
 708  692                  found = 1;
 709  693                  ddp->dd_ddate = ddate;
 710  694  
 711      -                NDMP_LOG(LOG_DEBUG,
      695 +                syslog(LOG_DEBUG,
 712  696                      "Updated to: [%s][%d][%u]",
 713  697                      ddp->dd_name, ddp->dd_level, ddp->dd_ddate);
 714  698          }
 715  699  
 716  700          /* dump all the read records */
 717  701          for (ddp = ddhead.dd_next; ddp; ddp = ddp->dd_next)
 718  702                  dumprecout(wfp, ddp);
 719  703  
 720  704          dd_free(&ddhead);
 721  705  
↓ open down ↓ 21 lines elided ↑ open up ↑
 743  727  append_dumptime(char *fname, char *path, int level, time_t ddate)
 744  728  {
 745  729          char fpath[PATH_MAX], bakfpath[PATH_MAX];
 746  730          FILE *fp;
 747  731          dumpdates_t tmpdd;
 748  732  
 749  733          if (!fname || !*fname || !path || !*path)
 750  734                  return (-1);
 751  735  
 752  736          if (IS_LBR_BKTYPE(level & 0xff)) {
 753      -                NDMP_LOG(LOG_DEBUG,
      737 +                syslog(LOG_DEBUG,
 754  738                      "Lbr: [%s][%s][%c][%u]",
 755  739                      fname, path, level, ddate);
 756  740          } else
 757      -                NDMP_LOG(LOG_DEBUG, "[%s][%s][%d][%u]",
      741 +                syslog(LOG_DEBUG, "[%s][%s][%d][%u]",
 758  742                      fname, path, level, ddate);
 759  743  
 760  744          if (!ndmpd_make_bk_dir_path(fpath, fname)) {
 761      -                NDMP_LOG(LOG_ERR, "Cannot get dumpdate file path name %s.",
      745 +                syslog(LOG_ERR, "Cannot get dumpdate file path name %s.",
 762  746                      fname);
 763  747                  return (-1);
 764  748          }
 765  749  
 766  750          (void) snprintf(bakfpath, PATH_MAX, "%s.bak", fpath);
 767  751  
 768  752          /*
 769  753           * If the file is there and can be opened then make a
 770  754           * backup copy it.
 771  755           */
 772  756          fp = fopen(fpath, "r");
 773  757          if (fp) {
 774  758                  (void) fclose(fp);
 775  759                  if (filecopy(bakfpath, fpath) != 0) {
 776      -                        NDMP_LOG(LOG_ERR, "Cannot copy %s to %s: %m.",
      760 +                        syslog(LOG_ERR, "Cannot copy %s to %s: %m.",
 777  761                              fpath, bakfpath);
 778  762                          return (-1);
 779  763                  }
 780  764          }
 781  765  
 782  766          /* open the new copy to append the record to it */
 783  767          fp = fopen(bakfpath, "a");
 784  768          if (!fp) {
 785      -                NDMP_LOG(LOG_ERR, "Cannot open %s: %m.", bakfpath);
      769 +                syslog(LOG_ERR, "Cannot open %s: %m.", bakfpath);
 786  770                  return (-1);
 787  771          }
 788  772  
 789      -        NDMP_LOG(LOG_DEBUG, "[%s][%s]", fpath, bakfpath);
      773 +        syslog(LOG_DEBUG, "[%s][%s]", fpath, bakfpath);
 790  774  
 791  775          /* append a new record */
 792  776          (void) strlcpy(tmpdd.dd_name, path, TLM_MAX_PATH_NAME);
 793  777          tmpdd.dd_level = level;
 794  778          tmpdd.dd_ddate = ddate;
 795  779          dumprecout(fp, &tmpdd);
 796  780  
 797  781          (void) fclose(fp);
 798  782          (void) rename(bakfpath, fpath);
 799  783  
↓ open down ↓ 35 lines elided ↑ open up ↑
 835  819          dumpdates_t ddhead, *ddp, *save;
 836  820          char vol[ZFS_MAX_DATASET_NAME_LEN];
 837  821          nvlist_t *userprops;
 838  822          zfs_handle_t *zhp;
 839  823          nvlist_t *propval = NULL;
 840  824          char *strval = NULL;
 841  825  
 842  826          if (!path || !level || !ddate)
 843  827                  return (-1);
 844  828  
 845      -        NDMP_LOG(LOG_DEBUG, "[%s] level %d",
      829 +        syslog(LOG_DEBUG, "[%s] level %d",
 846  830              path, *level);
 847  831  
 848  832          if (*level == 0) {
 849  833                  *ddate = (time_t)0;
 850  834                  return (0);
 851  835          }
 852  836  
 853  837          (void) mutex_lock(&zlib_mtx);
 854  838          /* Check if this is a ZFS dataset */
 855  839          if ((zlibh != NULL) &&
↓ open down ↓ 50 lines elided ↑ open up ↑
 906  890                  return (0);
 907  891          }
 908  892  
 909  893          /*
 910  894           * If it's not level backup, then find the exact record
 911  895           * type.
 912  896           */
 913  897          if (IS_LBR_BKTYPE(*level & 0xff)) {
 914  898                  save = find_date(ddp, path, *level, *ddate);
 915  899  
 916      -                NDMP_LOG(LOG_DEBUG,
      900 +                syslog(LOG_DEBUG,
 917  901                      "LBR_BKTYPE save 0x%p", save);
 918  902  
 919  903                  *ddate = save ? save->dd_ddate : (time_t)0;
 920  904          } else {
 921  905                  /*
 922  906                   * Go find the entry with the same name for a maximum of a
 923  907                   * lower increment and older date.
 924  908                   */
 925  909                  save = NULL;
 926  910                  for (i = *level - 1; i >= 0; i--) {
↓ open down ↓ 28 lines elided ↑ open up ↑
 955  939   *   < 0 on error
 956  940   */
 957  941  int
 958  942  ndmpd_put_dumptime(char *path, int level, time_t ddate)
 959  943  {
 960  944          char vol[ZFS_MAX_DATASET_NAME_LEN];
 961  945          zfs_handle_t *zhp;
 962  946          char tbuf[64];
 963  947          int rv;
 964  948  
 965      -        NDMP_LOG(LOG_DEBUG, "[%s][%d][%u]", path, level,
      949 +        syslog(LOG_DEBUG, "[%s][%d][%u]", path, level,
 966  950              ddate);
 967  951  
 968  952          /* Check if this is a ZFS dataset */
 969  953          (void) mutex_lock(&zlib_mtx);
 970  954          if ((zlibh != NULL) &&
 971  955              (get_zfsvolname(vol, sizeof (vol), path) == 0) &&
 972  956              ((zhp = zfs_open(zlibh, vol, ZFS_TYPE_DATASET)) != NULL)) {
 973  957  
 974  958                  (void) ctime_r(&ddate, tbuf, sizeof (tbuf));
 975  959                  rv = zfs_prop_set(zhp, zfs_dumpdate_props[level], tbuf);
↓ open down ↓ 16 lines elided ↑ open up ↑
 992  976   * Append a backup date record to the specified file.
 993  977   */
 994  978  int
 995  979  ndmpd_append_dumptime(char *fname, char *path, int level, time_t ddate)
 996  980  {
 997  981          char vol[ZFS_MAX_DATASET_NAME_LEN];
 998  982          zfs_handle_t *zhp;
 999  983          char tbuf[64];
1000  984          int rv;
1001  985  
1002      -        NDMP_LOG(LOG_DEBUG, "[%s][%s][%d][%u]", fname,
      986 +        syslog(LOG_DEBUG, "[%s][%s][%d][%u]", fname,
1003  987              path, level, ddate);
1004  988  
1005  989          /* Check if this is a ZFS dataset */
1006  990          (void) mutex_lock(&zlib_mtx);
1007  991          if ((zlibh != NULL) &&
1008  992              (get_zfsvolname(vol, sizeof (vol), path) == 0) &&
1009  993              ((zhp = zfs_open(zlibh, vol, ZFS_TYPE_DATASET)) != NULL)) {
1010  994  
1011  995                  (void) ctime_r(&ddate, tbuf, sizeof (tbuf));
1012  996                  rv = zfs_prop_set(zhp, zfs_dumpdate_props[level], tbuf);
↓ open down ↓ 13 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX