Search in sources :

Example 31 with Volume

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());
}
Also used : BlobReference(com.zimbra.cs.store.file.BlobReference) Message(com.zimbra.cs.mailbox.Message) ParsedMessage(com.zimbra.cs.mime.ParsedMessage) HashMap(java.util.HashMap) ParsedMessage(com.zimbra.cs.mime.ParsedMessage) MailboxBlobInfo(com.zimbra.cs.store.MailboxBlob.MailboxBlobInfo) Mailbox(com.zimbra.cs.mailbox.Mailbox) Volume(com.zimbra.cs.volume.Volume) DeliveryOptions(com.zimbra.cs.mailbox.DeliveryOptions) Test(org.junit.Test)

Example 32 with Volume

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());
}
Also used : BlobReference(com.zimbra.cs.store.file.BlobReference) HashMap(java.util.HashMap) ByteArrayInputStream(java.io.ByteArrayInputStream) InputStream(java.io.InputStream) Document(com.zimbra.cs.mailbox.Document) ParsedDocument(com.zimbra.cs.mime.ParsedDocument) MailboxBlobInfo(com.zimbra.cs.store.MailboxBlob.MailboxBlobInfo) Mailbox(com.zimbra.cs.mailbox.Mailbox) ParsedDocument(com.zimbra.cs.mime.ParsedDocument) Volume(com.zimbra.cs.volume.Volume) ByteArrayInputStream(java.io.ByteArrayInputStream) Test(org.junit.Test)

Example 33 with Volume

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);
}
Also used : DedupeBlobsRequest(com.zimbra.soap.admin.message.DedupeBlobsRequest) BlobDeduper(com.zimbra.cs.store.file.BlobDeduper) ArrayList(java.util.ArrayList) StoreManager(com.zimbra.cs.store.StoreManager) IntIdAttr(com.zimbra.soap.admin.type.IntIdAttr) DedupeBlobsResponse(com.zimbra.soap.admin.message.DedupeBlobsResponse) FileBlobStore(com.zimbra.cs.store.file.FileBlobStore) VolumeIdAndProgress(com.zimbra.soap.admin.type.VolumeIdAndProgress) IOException(java.io.IOException) Volume(com.zimbra.cs.volume.Volume) ZimbraSoapContext(com.zimbra.soap.ZimbraSoapContext) Map(java.util.Map)

Example 34 with Volume

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;
}
Also used : Element(com.zimbra.common.soap.Element) ArrayList(java.util.ArrayList) ExternalBlobConsistencyChecker(com.zimbra.cs.store.external.ExternalBlobConsistencyChecker) BlobConsistencyChecker(com.zimbra.cs.store.file.BlobConsistencyChecker) ExternalBlobConsistencyChecker(com.zimbra.cs.store.external.ExternalBlobConsistencyChecker) ExternalStoreManager(com.zimbra.cs.store.external.ExternalStoreManager) StoreManager(com.zimbra.cs.store.StoreManager) Mailbox(com.zimbra.cs.mailbox.Mailbox) Volume(com.zimbra.cs.volume.Volume) ZimbraSoapContext(com.zimbra.soap.ZimbraSoapContext) FileBlobStore(com.zimbra.cs.store.file.FileBlobStore) ArrayList(java.util.ArrayList) List(java.util.List) ExternalStoreManager(com.zimbra.cs.store.external.ExternalStoreManager)

Example 35 with Volume

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();
}
Also used : VolumeManager(com.zimbra.cs.volume.VolumeManager) Volume(com.zimbra.cs.volume.Volume) ZimbraSoapContext(com.zimbra.soap.ZimbraSoapContext) VolumeInfo(com.zimbra.soap.admin.type.VolumeInfo) ModifyVolumeResponse(com.zimbra.soap.admin.message.ModifyVolumeResponse)

Aggregations

Volume (com.zimbra.cs.volume.Volume)36 Mailbox (com.zimbra.cs.mailbox.Mailbox)17 Test (org.junit.Test)14 DeliveryOptions (com.zimbra.cs.mailbox.DeliveryOptions)11 ParsedMessage (com.zimbra.cs.mime.ParsedMessage)11 Message (com.zimbra.cs.mailbox.Message)10 BlobReference (com.zimbra.cs.store.file.BlobReference)9 MailboxBlobInfo (com.zimbra.cs.store.MailboxBlob.MailboxBlobInfo)7 VolumeManager (com.zimbra.cs.volume.VolumeManager)7 ZimbraSoapContext (com.zimbra.soap.ZimbraSoapContext)7 File (java.io.File)5 HashMap (java.util.HashMap)5 StoreManager (com.zimbra.cs.store.StoreManager)3 FileBlobStore (com.zimbra.cs.store.file.FileBlobStore)3 ByteArrayInputStream (java.io.ByteArrayInputStream)3 IOException (java.io.IOException)3 ArrayList (java.util.ArrayList)3 DbConnection (com.zimbra.cs.db.DbPool.DbConnection)2 Document (com.zimbra.cs.mailbox.Document)2 ParsedDocument (com.zimbra.cs.mime.ParsedDocument)2