~xdavidwu/saf-cephfs

5c89a79f09ec983d293b163009174b6294abce3e — Pinghao Wu a month ago 6cad107 master
CephFSDocumentsProvider: reduce io need for thumbnails on dir listing
1 files changed, 35 insertions(+), 15 deletions(-)

M src/main/java/org/safcephfs/CephFSDocumentsProvider.java
M src/main/java/org/safcephfs/CephFSDocumentsProvider.java => src/main/java/org/safcephfs/CephFSDocumentsProvider.java +35 -15
@@ 307,7 307,7 @@ public class CephFSDocumentsProvider extends DocumentsProvider {
		}
	}

	private String getXDGThumbnailFilePath(String base, String name) {
	private String getXDGThumbnailFile(String name) {
		MessageDigest md5;
		try {
			md5 = MessageDigest.getInstance("MD5");


@@ 318,7 318,7 @@ public class CephFSDocumentsProvider extends DocumentsProvider {
		byte[] digest = md5.digest();
		String hex = String.format("%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x", digest[0], digest[1], digest[2], digest[3], digest[4], digest[5], digest[6], digest[7], digest[8], digest[9], digest[10], digest[11], digest[12], digest[13], digest[14], digest[15]);

		return base + ".sh_thumbnails/normal/" + hex + ".png";
		return hex + ".png";
	}

	@Override


@@ 328,13 328,14 @@ public class CephFSDocumentsProvider extends DocumentsProvider {
		int dirIndex = documentId.lastIndexOf("/");
		String filename = documentId.substring(dirIndex + 1);
		String dir = documentId.substring(0, dirIndex + 1);
		String id = getXDGThumbnailFilePath(dir, filename);
		String id = dir + ".sh_thumbnails/normal/" + getXDGThumbnailFile(filename);
		ParcelFileDescriptor fd = openDocument(id, "r", signal);
		return new AssetFileDescriptor(fd, 0, fd.getStatSize());
	}

	// TODO bsearch thumbnails
	private void lstatBuildDocumentRow(String dir, String displayName,
			String documentId, MatrixCursor result)
			String documentId, String[] thumbnails, MatrixCursor result)
			throws FileNotFoundException {
		CephStat cs = new CephStat();
		doCephOperation(() -> {


@@ 383,16 384,28 @@ public class CephFSDocumentsProvider extends DocumentsProvider {
				flags |= Document.FLAG_SUPPORTS_WRITE;
			}

			String thubmailPath = getXDGThumbnailFilePath(dir, displayName);
			boolean thumnailFound = doCephOperation(() -> {
				try {
					cm.stat(thubmailPath, cs);
					return true;
				} catch (FileNotFoundException|CephNotDirectoryException e) {
					return false;
			String thumbnail = getXDGThumbnailFile(displayName);
			boolean thumbnailFound = false;
			if (thumbnails != null) {
				for (String c : thumbnails) {
					if (c.equals(thumbnail)) {
						thumbnailFound = true;
						break;
					}
				}
			});
			if (thumnailFound) {
			} else {
				String thubmailPath = dir + ".sh_thumbnails/normal/" + getXDGThumbnailFile(displayName);
				thumbnailFound = doCephOperation(() -> {
					try {
						cm.stat(thubmailPath, cs);
						return true;
					} catch (FileNotFoundException|CephNotDirectoryException e) {
						return false;
					}
				});
			}

			if (thumbnailFound) {
				flags |= Document.FLAG_SUPPORTS_THUMBNAIL;
			}
			row.add(Document.COLUMN_FLAGS, flags);


@@ 420,9 433,16 @@ public class CephFSDocumentsProvider extends DocumentsProvider {
		if (res == null) {
			return result;
		}
		String[] thumbnails = doCephOperation(() -> {
			try {
				return cm.listdir(filename + "/.sh_thumbnails/normal");
			} catch (FileNotFoundException e) {
				return new String[0];
			}
		}, result);
		for (String entry : res) {
			lstatBuildDocumentRow(filename + "/", entry,
					parentDocumentId + "/" + entry, result);
					parentDocumentId + "/" + entry, thumbnails, result);
		}
		return result;
	}


@@ 435,7 455,7 @@ public class CephFSDocumentsProvider extends DocumentsProvider {
		String filename = documentId.substring(dirIndex + 1);
		String dir = documentId.substring(0, dirIndex + 1);
		lstatBuildDocumentRow(dir.substring(dir.indexOf("/") + 1), filename,
				documentId, result);
				documentId, null, result);
		return result;
	}