X-Git-Url: http://git.indexdata.com/?p=idzebra-moved-to-github.git;a=blobdiff_plain;f=bfile%2Fmfile.c;h=1b6d907234bd5787e642ea3133b0203472de3214;hp=b55dc2e5fdc0b0cd023df3004ed4f8000b42d71b;hb=89d16cf15eda0e4802d18b8ad09bd3653508ebfc;hpb=0f78f3fe78e859d9f0d3f0d3e13fcd28085dd427 diff --git a/bfile/mfile.c b/bfile/mfile.c index b55dc2e..1b6d907 100644 --- a/bfile/mfile.c +++ b/bfile/mfile.c @@ -1,8 +1,5 @@ -/* $Id: mfile.c,v 1.71 2006-11-14 08:12:06 adam Exp $ - Copyright (C) 1995-2006 - Index Data ApS - -This file is part of the Zebra server. +/* This file is part of the Zebra server. + Copyright (C) 1994-2009 Index Data Zebra is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free @@ -192,7 +189,8 @@ static int cmp_part_file(const void *p1, const void *p2) return 0; } -MFile_area mf_init(const char *name, const char *spec, const char *base) +MFile_area mf_init(const char *name, const char *spec, const char *base, + int only_shadow_files) { MFile_area ma = (MFile_area) xmalloc(sizeof(*ma)); mf_dir *dirp; @@ -236,6 +234,11 @@ MFile_area mf_init(const char *name, const char *spec, const char *base) memcpy(metaname, dent->d_name, cp - dent->d_name); metaname[ cp - dent->d_name] = '\0'; + /* only files such as file-i-0.mf and file-i-b-0.mf, bug #739 */ + if (only_shadow_files && cp[-2] != '-') + continue; + if (!only_shadow_files && cp[-2] == '-') + continue; for (meta_f = ma->mfiles; meta_f; meta_f = meta_f->next) { /* known metafile */ @@ -282,9 +285,6 @@ MFile_area mf_init(const char *name, const char *spec, const char *base) mf_destroy(ma); return 0; } -#ifndef WIN32 - fsync(fd); -#endif close(fd); if (dirp->max_bytes >= 0) dirp->avail_bytes -= part_f->bytes; @@ -363,6 +363,7 @@ MFile mf_open(MFile_area ma, const char *name, int block_size, int wflag) yaz_log(YLOG_WARN, "metafile %s already open", name); return 0; } + break; } if (!mnew) { @@ -433,7 +434,8 @@ int mf_close(MFile mf) if (mf->files[i].fd >= 0) { #ifndef WIN32 - fsync(mf->files[i].fd); + if (mf->wr) + fsync(mf->files[i].fd); #endif close(mf->files[i].fd); mf->files[i].fd = -1; @@ -538,6 +540,13 @@ int mf_write(MFile mf, zint no, int offset, int nbytes, const void *buf) { yaz_log(YLOG_FATAL, "mf_write: %s error (4) no more space", mf->name); + for (dp = mf->ma->dirs; dp ; dp = dp->next) { + yaz_log(YLOG_FATAL,"%s: max=" ZINT_FORMAT + " used=" ZINT_FORMAT " available=" ZINT_FORMAT, + dp->name, (zint)dp->max_bytes, + (zint)(dp->max_bytes - dp->avail_bytes), (zint)dp->avail_bytes ); + } + yaz_log(YLOG_FATAL,"Adjust the limits in your zebra.cfg"); ret = -1; goto out; }