digraph {
	subgraph  {
		rank=same;
		ordering=in;

		wcfs		[label="wcfs"]
		invProto	[label="open/invalidation\nprotocol", style=filled fillcolor=grey95]
		client		[label="client"]

		wcfs	-> invProto;
		invProto -> client [dir=back];	// XXX = invProto <- client
	}

//	wcfs		-> wcfs_simple;
//	wcfs		-> Sinvtree;
//	wcfs		-> δR;
	wcfs		-> liveCacheControl;
	wcfs		-> autoexit [color=grey];

	wcfs		-> wcfsInvProcess;
	wcfs		-> wcfsRead;
	wcfs		-> wcfsGC [color=grey];

	wcfsInvProcess	-> ZODB_go_inv;
	wcfsInvProcess	-> zconnCacheGet;
	wcfsInvProcess	-> zobj2file;
	wcfsInvProcess	-> δFtail;
	wcfsInvProcess	-> fuseRetrieveCache;
	wcfsInvProcess	-> _wcfs_zhead;

	ZODB_go_inv	-> fs1_go_inv;
	ZODB_go_inv	-> zeo_go_inv;
	ZODB_go_inv	-> neo_go_inv;
	ZODB_go_inv	-> zcache_go_inv [style=dashed, color=grey];	// wcfs works without raw cache now

	wcfsRead	-> blktabGet;
	wcfsRead	-> δFtail;
	wcfsRead	-> setupWatch;
	wcfsRead	-> headWatch;



	zobj2file	-> zblk2file;
	zobj2file	-> zbtree2file;
	zbtree2file	-> δBTree [color=grey];

//	wcfs_simple	-> Btree_read;
//	wcfs_simple	-> ZBlk_read;
//	wcfs_simple	-> autoexit;

	client		-> wcfsRead;
	client		-> setupWatch;
	client		-> clientInvHandle;

//	client		-> δR;
	client		-> nowcfs;
//	client		-> zodburl;
//	client		-> wcfs_spawn;


	clientInvHandle -> headWatch;

	headWatch	-> fileSock;
	_wcfs_zhead	-> fileSock;

//	Btree_read	-> ZODB_read;
//	ZBlk_read	-> ZODB_read;
//	ZODB_read	-> ogorek_persref;


//	wcfs_simple	[label="wcfs no\ninvalidations", style=filled fillcolor=grey95]
//	wcfs_spawn	[label="spawn wcfs", style=filled fillcolor=lightyellow]
	nowcfs		[label="!wcfs mode", style=filled fillcolor=grey95]

	wcfsInvProcess	[label="process\nZODB invalidations", style=filled fillcolor=grey95]
	zconnCacheGet	[label="zonn.\n.Cache.Get", style=filled fillcolor=lightyellow]
	zobj2file	[label="Z* → file/[]#blk", style=filled fillcolor=grey95]
	zblk2file	[label="ZBlk*\n↓\nfile/[]#blk", style=filled fillcolor=lightyellow]
	zbtree2file	[label="BTree/Bucket\n↓\nfile/[]#blk"]
	δBTree		[label="δ(BTree)"]

	fuseRetrieveCache [label="FUSE:\nretrieve cache", style=filled fillcolor=lightyellow]

	_wcfs_zhead	[label=".wcfs/\nzhead", style=filled fillcolor=lightyellow]

	wcfsRead	[label="read(#blk)", style=filled fillcolor=grey95]

	blktabGet	[label="blktab.Get(#blk):\nmanually + → ⌈rev(#blk)⌉", style=filled fillcolor=grey95]
	δFtail		[style=filled fillcolor=lightyellow]

	setupWatch	[label="watches:\nregister/maint", style=filled fillcolor=grey95]
	clientInvHandle	[label="process\n#blk invalidations", style=filled fillcolor=grey95]
	headWatch	[label="#blk ← head/watch", style=filled fillcolor=grey95]
	fileSock	[label="FileSock", style=filled fillcolor=lightyellow]

	ZODB_go_inv	[label="ZODB/go\ninvalidations", style=filled fillcolor=grey95]
	fs1_go_inv	[label="fs1/go\ninvalidations", style=filled fillcolor=lightyellow]
	zeo_go_inv	[label="zeo/go\ninvalidations"]
	neo_go_inv	[label="neo/go\ninvalidations"]
	zcache_go_inv	[label="ZCache/go\n←watchq", color=grey, fontcolor=grey]
//	Btree_read	[label="BTree read", style=filled fillcolor=lightyellow]
//	ZBlk_read	[label="ZBigFile / ZBlk* read", style=filled fillcolor=lightyellow]
//	ZODB_read	[label="ZODB deserialize object", style=filled fillcolor=lightyellow]
//	ogorek_persref	[label="ogórek:\npersistent references", style=filled fillcolor=lightyellow];

//	Sinvtree	[label="server: inv. tree"]
//	δR		[label="δR encoding"]

//	zodburl		[label="zstor -> zurl", style=filled fillcolor=grey95]

	wcfsGC		[label="GC\n@rev/"]
	liveCacheControl [label="ZODB/go\nLiveCache fix", style=filled fillcolor=grey95]
	autoexit	[label="autoexit\nif !activity"]
}
