callback();
}
+bool
+AIODiskIOStrategy::unlinkdUseful() const
+{
+ return false;
+}
+
void
AIODiskIOStrategy::unlinkFile (char const *)
{}
virtual RefCount<DiskFile> newFile (char const *path);
/* flush all IO operations */
virtual void sync();
+ /** whether the IO Strategy can use unlinkd */
+ virtual bool unlinkdUseful() const;
/* unlink a file by path */
virtual void unlinkFile (char const *);
return new BlockingFile (path);
}
+bool
+BlockingIOStrategy::unlinkdUseful() const
+{
+ return true;
+}
+
void
BlockingIOStrategy::unlinkFile(char const *path)
{
virtual bool shedLoad();
virtual int load();
virtual RefCount<DiskFile> newFile(char const *path);
+ virtual bool unlinkdUseful() const;
virtual void unlinkFile (char const *);
};
DiskdIOStrategy::DiskdIOStrategy() : magic1(64), magic2(72), away(0) , smsgid(-1), rmsgid(-1), wfd(-1) , instanceID(newInstance())
{}
+bool
+DiskdIOStrategy::unlinkdUseful() const
+{
+ return true;
+}
+
void
DiskdIOStrategy::unlinkFile(char const *path)
{
virtual bool shedLoad();
virtual int load();
virtual RefCount<DiskFile> newFile(char const *path);
+ virtual bool unlinkdUseful() const;
virtual void unlinkFile (char const *);
virtual ConfigOption *getOptionTree() const;
virtual void init();
/** flush all IO operations */
virtual void sync() {}
+ /** whether the IO Strategy can use unlinkd */
+ virtual bool unlinkdUseful() const = 0;
+
/** unlink a file by path */
virtual void unlinkFile(char const *) = 0;
virtual void sync() { io->sync(); }
+ virtual bool unlinkdUseful() const { return io->unlinkdUseful(); }
+
virtual void unlinkFile (char const *path) { io->unlinkFile(path); }
virtual int callback() { return io->callback(); }
return new DiskThreadsDiskFile (path, this);
}
+bool
+DiskThreadsIOStrategy::unlinkdUseful() const
+{
+ return false;
+}
+
void
DiskThreadsIOStrategy::unlinkFile(char const *path)
{
virtual bool shedLoad();
virtual int load();
virtual RefCount<DiskFile> newFile(char const *path);
+ virtual bool unlinkdUseful() const;
virtual void unlinkFile (char const *);
virtual int callback();
virtual void sync();
return new IpcIoFile (path);
}
+bool
+IpcIoIOStrategy::unlinkdUseful() const
+{
+ return true;
+}
+
void
IpcIoIOStrategy::unlinkFile(char const *path)
{
virtual bool shedLoad();
virtual int load();
virtual RefCount<DiskFile> newFile(char const *path);
+ virtual bool unlinkdUseful() const;
virtual void unlinkFile (char const *);
};
return new MmappedFile (path);
}
+bool
+MmappedIOStrategy::unlinkdUseful() const
+{
+ return true;
+}
+
void
MmappedIOStrategy::unlinkFile(char const *path)
{
virtual bool shedLoad();
virtual int load();
virtual RefCount<DiskFile> newFile(char const *path);
+ virtual bool unlinkdUseful() const;
virtual void unlinkFile (char const *);
};
virtual bool active() const; ///< may be used in this strand
/// whether stat should be reported by this SwapDir
virtual bool doReportStat() const { return active(); }
+ /// whether SwapDir may benefit from unlinkd
+ virtual bool unlinkdUseful() const = 0;
/* official Store interface functions */
virtual void diskFull();
virtual void dump(StoreEntry &)const;
~CossSwapDir();
virtual StoreSearch *search(String const url, HttpRequest *);
+ virtual bool unlinkdUseful() const;
virtual void unlink (StoreEntry &);
virtual void statfs (StoreEntry &)const;
virtual bool canStore(const StoreEntry &e, int64_t diskSpaceNeeded, int &load) const;
}
}
+bool
+CossSwapDir::unlinkdUseful() const
+{
+ // no entry-specific files to unlink
+ return false;
+}
+
void
CossSwapDir::unlink(StoreEntry & e)
{
return false;
}
+bool
+Rock::SwapDir::unlinkdUseful() const
+{
+ // no entry-specific files to unlink
+ return false;
+}
+
void
Rock::SwapDir::unlink(StoreEntry &e)
{
virtual void diskFull();
virtual void reference(StoreEntry &e);
virtual bool dereference(StoreEntry &e);
+ virtual bool unlinkdUseful() const;
virtual void unlink(StoreEntry &e);
virtual void statfs(StoreEntry &e) const;
IO->unlinkFile(fullPath(f,NULL));
}
+bool
+UFSSwapDir::unlinkdUseful() const
+{
+ // unlinkd may be useful only in workers
+ return IamWorkerProcess() && IO->io->unlinkdUseful();
+}
+
void
UFSSwapDir::unlink(StoreEntry & e)
{
~UFSSwapDir();
virtual StoreSearch *search(String const url, HttpRequest *);
virtual bool doubleCheck(StoreEntry &);
+ virtual bool unlinkdUseful() const;
virtual void unlink(StoreEntry &);
virtual void statfs(StoreEntry &)const;
virtual void maintain();
mimeInit(Config.mimeTablePathname);
+#if USE_UNLINKD
+ if (unlinkdNeeded())
+ unlinkdInit();
+#endif
+
#if USE_DELAY_POOLS
Config.ClientDelay.finalize();
#endif
if (!configured_once) {
#if USE_UNLINKD
- unlinkdInit();
+ if (unlinkdNeeded())
+ unlinkdInit();
#endif
urlInitialize();
SQUIDCEXTERN void dumpMallocStats(void);
#if USE_UNLINKD
+SQUIDCEXTERN bool unlinkdNeeded(void);
SQUIDCEXTERN void unlinkdInit(void);
SQUIDCEXTERN void unlinkdClose(void);
SQUIDCEXTERN void unlinkdUnlink(const char *);
TestSwapDir::init()
{}
+bool
+TestSwapDir::unlinkdUseful() const
+{
+ return false;
+}
+
bool
TestSwapDir::canStore(const StoreEntry &, int64_t, int &load) const
{
virtual void reconfigure();
virtual void init();
+ virtual bool unlinkdUseful() const;
virtual bool canStore(const StoreEntry &e, int64_t diskSpaceNeeded, int &load) const;
virtual StoreIOState::Pointer createStoreIO(StoreEntry &, StoreIOState::STFNCB *, StoreIOState::STIOCB *, void *);
virtual StoreIOState::Pointer openStoreIO(StoreEntry &, StoreIOState::STFNCB *, StoreIOState::STIOCB *, void *);
#include "squid.h"
#include "SquidTime.h"
+#include "SwapDir.h"
#include "fde.h"
#include "xusleep.h"
unlinkd_wfd = -1;
unlinkd_rfd = -1;
- } else
- debugs(2, 0, "unlinkdClose: WARNING: unlinkd_wfd is " << unlinkd_wfd);
+ }
if (hIpc) {
if (WaitForSingleObject(hIpc, 5000) != WAIT_OBJECT_0) {
#endif
+bool
+unlinkdNeeded(void)
+{
+ // we should start unlinkd if there are any cache_dirs using it
+ for (int i = 0; i < Config.cacheSwap.n_configured; ++i) {
+ const RefCount<SwapDir> sd = Config.cacheSwap.swapDirs[i];
+ if (sd->unlinkdUseful())
+ return true;
+ }
+
+ return false;
+}
+
void
unlinkdInit(void)
{
+ if (unlinkd_wfd >= 0)
+ return; // unlinkd already started
+
const char *args[2];
Ip::Address localhost;