use of com.zimbra.cs.volume.Volume in project zm-mailbox by Zimbra.
the class DbVolumeBlobsTest method dumpsterBlobs.
@Test
public void dumpsterBlobs() throws Exception {
Mailbox mbox = MailboxManager.getInstance().getMailboxByAccountId(MockProvisioning.DEFAULT_ACCOUNT_ID);
DeliveryOptions opt = new DeliveryOptions();
opt.setFolderId(Mailbox.ID_FOLDER_INBOX);
Map<String, String> digestToPath = new HashMap<String, String>();
Volume vol = VolumeManager.getInstance().getCurrentMessageVolume();
for (int i = 0; i < 10; i++) {
Message msg = mbox.addMessage(null, new ParsedMessage(("From: from" + i + "@zimbra.com\r\nTo: to1@zimbra.com").getBytes(), false), opt, null);
digestToPath.put(msg.getDigest(), msg.getBlob().getLocalBlob().getFile().getPath());
mbox.delete(null, msg.getId(), msg.getType());
}
mbox.emptyFolder(null, Mailbox.ID_FOLDER_TRASH, false);
Iterable<MailboxBlobInfo> allBlobs = null;
allBlobs = DbMailItem.getAllBlobs(conn, mbox.getSchemaGroupId(), vol.getId(), -1, -1);
for (MailboxBlobInfo info : allBlobs) {
DbVolumeBlobs.addBlobReference(conn, info);
}
List<BlobReference> blobs = DbVolumeBlobs.getBlobReferences(conn, vol);
Assert.assertEquals(digestToPath.size(), blobs.size());
for (BlobReference blob : blobs) {
String path = digestToPath.remove(blob.getDigest());
Assert.assertNotNull(path);
Assert.assertEquals(path, getPath(blob));
}
Assert.assertTrue(digestToPath.isEmpty());
}
use of com.zimbra.cs.volume.Volume in project zm-mailbox by Zimbra.
the class DbVolumeBlobsTest method revisionDumpsterBlobs.
@Test
public void revisionDumpsterBlobs() throws Exception {
Mailbox mbox = MailboxManager.getInstance().getMailboxByAccountId(MockProvisioning.DEFAULT_ACCOUNT_ID);
Map<String, String> digestToPath = new HashMap<String, String>();
Volume vol = VolumeManager.getInstance().getCurrentMessageVolume();
InputStream in = new ByteArrayInputStream("testcontent".getBytes());
ParsedDocument pd = new ParsedDocument(in, "docname", "text/plain", System.currentTimeMillis(), null, null);
Document doc = mbox.createDocument(null, Mailbox.ID_FOLDER_BRIEFCASE, pd, MailItem.Type.DOCUMENT, 0);
digestToPath.put(doc.getDigest(), doc.getBlob().getLocalBlob().getFile().getPath());
int baseId = doc.getId();
for (int i = 0; i < 10; i++) {
in = new ByteArrayInputStream(("testcontent-new-" + i).getBytes());
pd = new ParsedDocument(in, "docname", "text/plain", System.currentTimeMillis(), null, null);
doc = mbox.addDocumentRevision(null, baseId, pd);
digestToPath.put(doc.getDigest(), doc.getBlob().getLocalBlob().getFile().getPath());
}
mbox.delete(null, baseId, MailItem.Type.DOCUMENT);
mbox.emptyFolder(null, Mailbox.ID_FOLDER_TRASH, false);
Iterable<MailboxBlobInfo> allBlobs = null;
allBlobs = DbMailItem.getAllBlobs(conn, mbox.getSchemaGroupId(), vol.getId(), -1, -1);
for (MailboxBlobInfo info : allBlobs) {
DbVolumeBlobs.addBlobReference(conn, info);
}
List<BlobReference> blobs = DbVolumeBlobs.getBlobReferences(conn, vol);
Assert.assertEquals(digestToPath.size(), blobs.size());
for (BlobReference blob : blobs) {
String path = digestToPath.remove(blob.getDigest());
Assert.assertNotNull(path);
Assert.assertEquals(path, getPath(blob));
}
Assert.assertTrue(digestToPath.isEmpty());
}
use of com.zimbra.cs.volume.Volume in project zm-mailbox by Zimbra.
the class DedupeBlobs method handle.
@Override
public Element handle(Element request, Map<String, Object> context) throws ServiceException {
ZimbraSoapContext zsc = getZimbraSoapContext(context);
checkRight(zsc, context, null, AdminRight.PR_SYSTEM_ADMIN_ONLY);
StoreManager sm = StoreManager.getInstance();
if (!(sm instanceof FileBlobStore)) {
throw ServiceException.INVALID_REQUEST(sm.getClass().getName() + " is not supported", null);
}
DedupeBlobsRequest req = JaxbUtil.elementToJaxb(request);
BlobDeduper deduper = BlobDeduper.getInstance();
DedupeBlobsResponse resp = new DedupeBlobsResponse();
// Assemble the list of volumes.
List<IntIdAttr> volumeList = req.getVolumes();
List<Short> volumeIds = new ArrayList<Short>();
if ((req.getAction() == DedupeBlobsRequest.DedupAction.start) || (req.getAction() == DedupeBlobsRequest.DedupAction.reset)) {
if (volumeList.isEmpty()) {
// Get all message volume id's.
for (Volume vol : VolumeManager.getInstance().getAllVolumes()) {
switch(vol.getType()) {
case Volume.TYPE_MESSAGE:
case Volume.TYPE_MESSAGE_SECONDARY:
volumeIds.add(vol.getId());
break;
}
}
} else {
// Read volume id's from the request.
for (IntIdAttr attr : volumeList) {
short volumeId = (short) attr.getId();
Volume vol = VolumeManager.getInstance().getVolume(volumeId);
if (vol.getType() == Volume.TYPE_INDEX) {
throw ServiceException.INVALID_REQUEST("Index volume " + volumeId + " is not supported", null);
} else {
volumeIds.add(volumeId);
}
}
}
}
if (req.getAction() == DedupeBlobsRequest.DedupAction.start) {
try {
deduper.process(volumeIds);
} catch (IOException e) {
throw ServiceException.FAILURE("error while deduping", e);
}
} else if (req.getAction() == DedupeBlobsRequest.DedupAction.stop) {
deduper.stopProcessing();
} else if (req.getAction() == DedupeBlobsRequest.DedupAction.reset) {
if (volumeList.isEmpty()) {
deduper.resetVolumeBlobs(new ArrayList<Short>());
} else {
deduper.resetVolumeBlobs(volumeIds);
}
}
// return the stats for all actions.
boolean isRunning = deduper.isRunning();
if (isRunning) {
resp.setStatus(DedupStatus.running);
} else {
resp.setStatus(DedupStatus.stopped);
}
Map<Short, String> volumeBlobsProgress = deduper.getVolumeBlobsProgress();
VolumeIdAndProgress[] blobProgress = new VolumeIdAndProgress[volumeBlobsProgress.size()];
int i = 0;
for (Map.Entry<Short, String> entry : volumeBlobsProgress.entrySet()) {
blobProgress[i++] = new VolumeIdAndProgress(String.valueOf(entry.getKey()), entry.getValue());
}
resp.setVolumeBlobsProgress(blobProgress);
Map<Short, String> blobDigestsProgress = deduper.getBlobDigestsProgress();
VolumeIdAndProgress[] digestProgress = new VolumeIdAndProgress[blobDigestsProgress.size()];
i = 0;
for (Map.Entry<Short, String> entry : blobDigestsProgress.entrySet()) {
digestProgress[i++] = new VolumeIdAndProgress(String.valueOf(entry.getKey()), entry.getValue());
}
resp.setBlobDigestsProgress(digestProgress);
Pair<Integer, Long> pair = deduper.getCountAndSize();
resp.setTotalCount(pair.getFirst());
resp.setTotalSize(pair.getSecond());
return JaxbUtil.jaxbToElement(resp);
}
use of com.zimbra.cs.volume.Volume in project zm-mailbox by Zimbra.
the class CheckBlobConsistency method handle.
@Override
public Element handle(Element request, Map<String, Object> context) throws ServiceException {
ZimbraSoapContext zsc = getZimbraSoapContext(context);
checkRight(zsc, context, null, AdminRight.PR_SYSTEM_ADMIN_ONLY);
// Assemble the list of mailboxes.
List<Integer> mailboxIds = new ArrayList<Integer>();
List<Element> mboxElementList = request.listElements(AdminConstants.E_MAILBOX);
if (mboxElementList.isEmpty()) {
// Get all mailbox id's.
for (int mboxId : MailboxManager.getInstance().getMailboxIds()) {
mailboxIds.add(mboxId);
}
} else {
// Read mailbox id's from the request.
for (Element mboxEl : mboxElementList) {
Mailbox mbox = MailboxManager.getInstance().getMailboxById((int) mboxEl.getAttributeLong(AdminConstants.A_ID));
mailboxIds.add(mbox.getId());
}
}
boolean checkSize = request.getAttributeBool(AdminConstants.A_CHECK_SIZE, true);
boolean reportUsedBlobs = request.getAttributeBool(AdminConstants.A_REPORT_USED_BLOBS, false);
// Check blobs and assemble response.
Element response = zsc.createElement(AdminConstants.CHECK_BLOB_CONSISTENCY_RESPONSE);
StoreManager sm = StoreManager.getInstance();
if (sm instanceof ExternalStoreManager) {
for (int mboxId : mailboxIds) {
ExternalBlobConsistencyChecker checker = new ExternalBlobConsistencyChecker();
BlobConsistencyChecker.Results results = checker.check(null, mboxId, checkSize, reportUsedBlobs);
if (results.hasInconsistency() || reportUsedBlobs) {
//or checking used blobs
Element mboxEl = response.addElement(AdminConstants.E_MAILBOX).addAttribute(AdminConstants.A_ID, mboxId);
results.toElement(mboxEl);
}
}
} else if (sm instanceof FileBlobStore) {
// Assemble the list of volumes.
List<Short> volumeIds = new ArrayList<Short>();
List<Element> volumeElementList = request.listElements(AdminConstants.E_VOLUME);
if (volumeElementList.isEmpty()) {
// Get all message volume id's.
for (Volume vol : VolumeManager.getInstance().getAllVolumes()) {
switch(vol.getType()) {
case Volume.TYPE_MESSAGE:
case Volume.TYPE_MESSAGE_SECONDARY:
volumeIds.add(vol.getId());
break;
}
}
} else {
// Read volume id's from the request.
for (Element volumeEl : volumeElementList) {
short volumeId = (short) volumeEl.getAttributeLong(AdminConstants.A_ID);
Volume vol = VolumeManager.getInstance().getVolume(volumeId);
if (vol.getType() == Volume.TYPE_INDEX) {
throw ServiceException.INVALID_REQUEST("Index volume " + volumeId + " is not supported", null);
} else {
volumeIds.add(volumeId);
}
}
}
for (int mboxId : mailboxIds) {
BlobConsistencyChecker checker = new BlobConsistencyChecker();
BlobConsistencyChecker.Results results = checker.check(volumeIds, mboxId, checkSize, reportUsedBlobs);
if (results.hasInconsistency() || reportUsedBlobs) {
Element mboxEl = response.addElement(AdminConstants.E_MAILBOX).addAttribute(AdminConstants.A_ID, mboxId);
results.toElement(mboxEl);
}
}
} else {
//neither ExternalStoreManager nor FileBlobStore..some third type we haven't coded for
throw ServiceException.INVALID_REQUEST(sm.getClass().getName() + " is not supported", null);
}
return response;
}
use of com.zimbra.cs.volume.Volume in project zm-mailbox by Zimbra.
the class ModifyVolume method handle.
private ModifyVolumeResponse handle(ModifyVolumeRequest req, Map<String, Object> ctx) throws ServiceException {
ZimbraSoapContext zsc = getZimbraSoapContext(ctx);
checkRight(zsc, ctx, Provisioning.getInstance().getLocalServer(), Admin.R_manageVolume);
VolumeManager mgr = VolumeManager.getInstance();
Volume.Builder builder = Volume.builder(mgr.getVolume(req.getId()));
VolumeInfo vol = req.getVolume();
if (vol == null) {
throw ServiceException.INVALID_REQUEST("must specify a volume Element", null);
}
if (vol.getType() > 0) {
builder.setType(vol.getType());
}
if (vol.getName() != null) {
builder.setName(vol.getName());
}
if (vol.getRootPath() != null) {
builder.setPath(vol.getRootPath(), true);
}
if (vol.getCompressBlobs() != null) {
builder.setCompressBlobs(vol.getCompressBlobs());
}
if (vol.getCompressionThreshold() > 0) {
builder.setCompressionThreshold(vol.getCompressionThreshold());
}
mgr.update(builder.build());
return new ModifyVolumeResponse();
}
Aggregations