use of com.zimbra.cs.volume.Volume in project zm-mailbox by Zimbra.
the class FileBlobStore method renameTo.
@Override
public VolumeMailboxBlob renameTo(StagedBlob src, Mailbox destMbox, int destItemId, int destRevision) throws IOException, ServiceException {
Volume volume = MANAGER.getCurrentMessageVolume();
VolumeBlob blob = ((VolumeStagedBlob) src).getLocalBlob();
File srcFile = blob.getFile();
String srcPath = srcFile.getAbsolutePath();
if (!srcFile.exists()) {
throw new IOException(srcFile.getPath() + " does not exist.");
}
File destFile = getMailboxBlobFile(destMbox, destItemId, destRevision, volume.getId(), false);
String destPath = destFile.getAbsolutePath();
// Prevent stale cache read.
BlobInputStream.getFileDescriptorCache().remove(destPath);
ensureParentDirExists(destFile);
if (ZimbraLog.store.isDebugEnabled()) {
long srcSize = srcFile.length();
long srcRawSize = blob.getRawSize();
ZimbraLog.store.debug("Renaming %s (size=%d, raw size=%d) to %s for mailbox %d, id %d.", srcPath, srcSize, srcRawSize, destPath, destMbox.getId(), destItemId);
}
short srcVolumeId = blob.getVolumeId();
if (srcVolumeId == volume.getId()) {
boolean renamed = srcFile.renameTo(destFile);
if (SystemUtil.ON_WINDOWS) {
// the destination and try the rename again
if (!renamed && destFile.exists()) {
destFile.delete();
renamed = srcFile.renameTo(destFile);
}
}
if (!renamed)
throw new IOException("Unable to rename " + srcPath + " to " + destPath);
} else {
// Can't rename across volumes. Copy then delete instead.
FileUtil.copy(srcFile, destFile, !DebugConfig.disableMessageStoreFsync);
srcFile.delete();
}
VolumeBlob vblob = (VolumeBlob) new VolumeBlob(destFile, volume.getId()).copyCachedDataFrom(blob);
return new VolumeMailboxBlob(destMbox, destItemId, destRevision, volume.getLocator(), vblob);
}
use of com.zimbra.cs.volume.Volume in project zm-mailbox by Zimbra.
the class CreateVolume method redo.
@Override
public void redo() throws Exception {
VolumeManager mgr = VolumeManager.getInstance();
try {
Volume vol = mgr.getVolume(id);
if (vol != null) {
mLog.info("Volume already exists id=%d", id);
return;
}
} catch (VolumeServiceException e) {
if (e.getCode() != VolumeServiceException.NO_SUCH_VOLUME) {
throw e;
}
}
try {
Volume volume = Volume.builder().setId(id).setType(type).setName(name).setPath(rootPath, false).setMboxGroupBits(mboxGroupBits).setMboxBit(mboxBits).setFileGroupBits(fileGroupBits).setFileBits(fileBits).setCompressBlobs(compressBlobs).setCompressionThreshold(compressionThreshold).build();
mgr.create(volume, getUnloggedReplay());
} catch (VolumeServiceException e) {
if (e.getCode() == VolumeServiceException.ALREADY_EXISTS) {
mLog.info("Volume already exists id=%d", id);
} else {
throw e;
}
}
}
use of com.zimbra.cs.volume.Volume in project zm-mailbox by Zimbra.
the class CreateVolume method handle.
private CreateVolumeResponse handle(CreateVolumeRequest req, Map<String, Object> ctx) throws ServiceException {
ZimbraSoapContext zsc = getZimbraSoapContext(ctx);
checkRight(zsc, ctx, Provisioning.getInstance().getLocalServer(), Admin.R_manageVolume);
Volume vol = VolumeManager.getInstance().create(toVolume(req.getVolume()));
return new CreateVolumeResponse(vol.toJAXB());
}
use of com.zimbra.cs.volume.Volume in project zm-mailbox by Zimbra.
the class DbVolumeBlobsTest method testUniqueBlobDigests.
@Test
public void testUniqueBlobDigests() throws Exception {
Mailbox mbox = MailboxManager.getInstance().getMailboxByAccountId(MockProvisioning.DEFAULT_ACCOUNT_ID);
DeliveryOptions opt = new DeliveryOptions();
opt.setFolderId(Mailbox.ID_FOLDER_INBOX);
Volume vol = VolumeManager.getInstance().getCurrentMessageVolume();
for (int i = 0; i < 5; i++) {
mbox.addMessage(null, new ParsedMessage(("From: from" + i + "@zimbra.com\r\nTo: to1@zimbra.com").getBytes(), false), opt, null);
mbox.addMessage(null, new ParsedMessage(("From: from" + i + "@zimbra.com\r\nTo: to1@zimbra.com").getBytes(), false), opt, null);
}
Iterable<MailboxBlobInfo> allBlobs = null;
allBlobs = DbMailItem.getAllBlobs(conn, mbox.getSchemaGroupId(), vol.getId(), -1, -1);
for (MailboxBlobInfo info : allBlobs) {
DbVolumeBlobs.addBlobReference(conn, info);
}
SpoolingCache<String> digests = DbVolumeBlobs.getUniqueDigests(conn, vol);
Assert.assertEquals(5, digests.size());
}
use of com.zimbra.cs.volume.Volume in project zm-mailbox by Zimbra.
the class DbVolumeBlobsTest method testDuplicateRow.
@Test
public void testDuplicateRow() throws Exception {
Mailbox mbox = MailboxManager.getInstance().getMailboxByAccountId(MockProvisioning.DEFAULT_ACCOUNT_ID);
DeliveryOptions opt = new DeliveryOptions();
opt.setFolderId(Mailbox.ID_FOLDER_INBOX);
Message msg = mbox.addMessage(null, new ParsedMessage("From: from1@zimbra.com\r\nTo: to1@zimbra.com".getBytes(), false), opt, null);
Volume vol = VolumeManager.getInstance().getCurrentMessageVolume();
MailboxBlobInfo blobInfo = new MailboxBlobInfo(null, mbox.getId(), msg.getId(), msg.getSavedSequence(), String.valueOf(vol.getId()), null);
DbVolumeBlobs.addBlobReference(conn, blobInfo);
try {
DbVolumeBlobs.addBlobReference(conn, blobInfo);
Assert.fail("expected exception");
} catch (ServiceException e) {
// expected
}
}
Aggregations