jenkins-bot has submitted this change and it was merged.
Change subject: Elasticsearch 2.1.1 support
......................................................................
Elasticsearch 2.1.1 support
Change-Id: I30ce16391d74b970e221c631deaef3185e911586
---
A .gitreview
M README.md
M pom.xml
M src/main/assemblies/plugin.xml
M src/main/java/org/wikimedia/elasticsearch/swift/SwiftRepositoryPlugin.java
M
src/main/java/org/wikimedia/elasticsearch/swift/repositories/SwiftRepository.java
M src/main/java/org/wikimedia/elasticsearch/swift/repositories/SwiftService.java
M
src/main/java/org/wikimedia/elasticsearch/swift/repositories/blobstore/SwiftBlobContainer.java
M
src/main/java/org/wikimedia/elasticsearch/swift/repositories/blobstore/SwiftBlobStore.java
D src/main/resources/es-plugin.properties
A src/main/resources/plugin-descriptor.properties
11 files changed, 100 insertions(+), 68 deletions(-)
Approvals:
EBernhardson: Looks good to me, approved
jenkins-bot: Verified
diff --git a/.gitreview b/.gitreview
new file mode 100644
index 0000000..291fc3f
--- /dev/null
+++ b/.gitreview
@@ -0,0 +1,6 @@
+[gerrit]
+host=gerrit.wikimedia.org
+port=29418
+project=search/repository-swift
+defaultbranch=master
+defaultrebase=0
diff --git a/README.md b/README.md
index 2f90ae4..d33f025 100644
--- a/README.md
+++ b/README.md
@@ -10,6 +10,7 @@
| 0.7 | 1.4.0 | 2014-11-07 |
| 1.6.0 | 1.6.0 | 2015-06-09 |
| 1.7.0 | 1.7.0 | 2015-07-20 |
+| 2.1.1 | 2.1.1 | 2016-05-12 |
Only the versions in the table above should be used. The in-between releases
were buggy and are not recommended.
@@ -27,7 +28,7 @@
}'
```
-See [Snapshot And
Restore](http://www.elasticsearch.org/guide/en/elasticsearch/reference/1.x/modules-snapshots.html)
for more information
+See [Snapshot And
Restore](https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-snapshots.html)
for more information
## Settings
diff --git a/pom.xml b/pom.xml
index 3592a09..b168bb9 100644
--- a/pom.xml
+++ b/pom.xml
@@ -10,7 +10,7 @@
<groupId>org.wikimedia.elasticsearch.swift</groupId>
<artifactId>swift-repository-plugin</artifactId>
- <version>1.7.1-SNAPSHOT</version>
+ <version>2.1.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>SwiftRepositoryPlugin</name>
<description>Repository plugin for Elasticsearch backed by
Swift</description>
@@ -33,11 +33,19 @@
<email>[email protected]</email>
<timezone>America/Los Angeles</timezone>
</developer>
+ <developer>
+ <name>Avik Das</name>
+ <email>[email protected]</email>
+ <timezone>America/Los Angeles</timezone>
+ </developer>
</developers>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
- <elasticsearch.version>1.7.0</elasticsearch.version>
+ <elasticsearch.version>2.1.1</elasticsearch.version>
+ <elasticsearch.plugin.name>swift-repository</elasticsearch.plugin.name>
+ <maven.compiler.target>1.7</maven.compiler.target>
+ <maven.compiler.source>1.7</maven.compiler.source>
</properties>
<dependencies>
@@ -71,6 +79,12 @@
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.2</version>
<optional>true</optional>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>com.google.guava</groupId>
+ <artifactId>guava</artifactId>
+ <version>18.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
@@ -109,10 +123,6 @@
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
- <configuration>
- <source>1.7</source>
- <target>1.7</target>
- </configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
diff --git a/src/main/assemblies/plugin.xml b/src/main/assemblies/plugin.xml
index 9e3ccb3..358363f 100644
--- a/src/main/assemblies/plugin.xml
+++ b/src/main/assemblies/plugin.xml
@@ -5,6 +5,13 @@
<format>zip</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
+ <files>
+ <file>
+
<source>${project.basedir}/src/main/resources/plugin-descriptor.properties</source>
+ <outputDirectory>/</outputDirectory>
+ <filtered>true</filtered>
+ </file>
+ </files>
<dependencySets>
<dependencySet>
<outputDirectory>/</outputDirectory>
diff --git
a/src/main/java/org/wikimedia/elasticsearch/swift/SwiftRepositoryPlugin.java
b/src/main/java/org/wikimedia/elasticsearch/swift/SwiftRepositoryPlugin.java
index 0ad94de..236aa03 100644
--- a/src/main/java/org/wikimedia/elasticsearch/swift/SwiftRepositoryPlugin.java
+++ b/src/main/java/org/wikimedia/elasticsearch/swift/SwiftRepositoryPlugin.java
@@ -1,20 +1,20 @@
package org.wikimedia.elasticsearch.swift;
-import org.elasticsearch.common.collect.Lists;
import org.elasticsearch.common.component.LifecycleComponent;
import org.elasticsearch.common.settings.Settings;
-import org.elasticsearch.plugins.AbstractPlugin;
+import
org.elasticsearch.index.snapshots.blobstore.BlobStoreIndexShardRepository;
+import org.elasticsearch.plugins.Plugin;
import org.elasticsearch.repositories.RepositoriesModule;
import org.wikimedia.elasticsearch.swift.repositories.SwiftRepository;
-import org.wikimedia.elasticsearch.swift.repositories.SwiftRepositoryModule;
import org.wikimedia.elasticsearch.swift.repositories.SwiftService;
import java.util.Collection;
+import java.util.Collections;
/**
* Our base plugin stuff.
*/
-public class SwiftRepositoryPlugin extends AbstractPlugin {
+public class SwiftRepositoryPlugin extends Plugin {
// Elasticsearch settings
private final Settings settings;
@@ -45,14 +45,11 @@
/**
* Register our services, if needed.
*/
- @Override
+
@SuppressWarnings("rawtypes")
- public Collection<Class<? extends LifecycleComponent>> services() {
- Collection<Class<? extends LifecycleComponent>> services =
Lists.newArrayList();
- if (settings.getAsBoolean("swift.repository.enabled", true)) {
- services.add(SwiftService.class);
- }
- return services;
+ @Override
+ public Collection<Class<? extends LifecycleComponent>> nodeServices() {
+ return Collections.<Class<? extends
LifecycleComponent>>singleton(SwiftService.class);
}
/**
@@ -61,7 +58,7 @@
*/
public void onModule(RepositoriesModule repositoriesModule) {
if (settings.getAsBoolean("swift.repository.enabled", true)) {
- repositoriesModule.registerRepository(SwiftRepository.TYPE,
SwiftRepositoryModule.class);
+ repositoriesModule.registerRepository(SwiftRepository.TYPE,
SwiftRepository.class, BlobStoreIndexShardRepository.class);
}
}
}
diff --git
a/src/main/java/org/wikimedia/elasticsearch/swift/repositories/SwiftRepository.java
b/src/main/java/org/wikimedia/elasticsearch/swift/repositories/SwiftRepository.java
index 1d4ecd7..2e4c169 100644
---
a/src/main/java/org/wikimedia/elasticsearch/swift/repositories/SwiftRepository.java
+++
b/src/main/java/org/wikimedia/elasticsearch/swift/repositories/SwiftRepository.java
@@ -45,7 +45,7 @@
* an instance of SwiftService
*/
@Inject
- protected SwiftRepository(RepositoryName name, RepositorySettings
repositorySettings, IndexShardRepository indexShardRepository, SwiftService
swiftService) {
+ public SwiftRepository(RepositoryName name, RepositorySettings
repositorySettings, IndexShardRepository indexShardRepository, SwiftService
swiftService) {
super(name.getName(), repositorySettings, indexShardRepository);
String url = repositorySettings.settings().get("swift_url");
@@ -65,10 +65,10 @@
Account account = SwiftAccountFactory.createAccount(swiftService, url,
username, password, tenantName, authMethod);
blobStore = new SwiftBlobStore(settings, account, container);
-
this.chunkSize =
repositorySettings.settings().getAsBytesSize("chunk_size",
- componentSettings.getAsBytesSize("chunk_size", new
ByteSizeValue(5, ByteSizeUnit.GB)));
- this.compress = repositorySettings.settings().getAsBoolean("compress",
componentSettings.getAsBoolean("compress", false));
+ settings.getAsBytesSize("chunk_size", new ByteSizeValue(5,
ByteSizeUnit.GB)));
+ this.compress = repositorySettings.settings().getAsBoolean("compress",
+ settings.getAsBoolean("compress", false));
this.basePath = BlobPath.cleanPath();
}
diff --git
a/src/main/java/org/wikimedia/elasticsearch/swift/repositories/SwiftService.java
b/src/main/java/org/wikimedia/elasticsearch/swift/repositories/SwiftService.java
index cbcb90c..facd0d6 100644
---
a/src/main/java/org/wikimedia/elasticsearch/swift/repositories/SwiftService.java
+++
b/src/main/java/org/wikimedia/elasticsearch/swift/repositories/SwiftService.java
@@ -1,7 +1,6 @@
package org.wikimedia.elasticsearch.swift.repositories;
import org.elasticsearch.ElasticsearchException;
-import org.elasticsearch.ElasticsearchIllegalArgumentException;
import org.elasticsearch.common.component.AbstractLifecycleComponent;
import org.elasticsearch.common.inject.Inject;
import org.elasticsearch.common.settings.Settings;
@@ -35,6 +34,7 @@
* The username
* @param password
* The password
+ * @return swift Account
*/
public synchronized Account swiftBasic(String url, String username, String
password) {
if (swiftUser != null) {
@@ -45,7 +45,7 @@
AccountConfig conf = getStandardConfig(url, username, password,
AuthenticationMethod.BASIC);
swiftUser = new AccountFactory(conf).createAccount();
} catch (CommandException ce) {
- throw new ElasticsearchIllegalArgumentException("Unable to
authenticate to Swift Basic " + url + "/" + username + "/" + password, ce);
+ throw new ElasticsearchException("Unable to authenticate to Swift
Basic " + url + "/" + username + "/" + password, ce);
}
return swiftUser;
}
@@ -60,7 +60,7 @@
conf.setTenantName(tenantName);
swiftUser = new AccountFactory(conf).createAccount();
} catch (CommandException ce) {
- throw new ElasticsearchIllegalArgumentException(
+ throw new ElasticsearchException(
"Unable to authenticate to Swift Keystone " + url + "/" +
username + "/" + password + "/" + tenantName, ce);
}
return swiftUser;
@@ -75,7 +75,7 @@
AccountConfig conf = getStandardConfig(url, username, password,
AuthenticationMethod.TEMPAUTH);
swiftUser = new AccountFactory(conf).createAccount();
} catch (CommandException ce) {
- throw new ElasticsearchIllegalArgumentException("Unable to
authenticate to Swift Temp", ce);
+ throw new ElasticsearchException("Unable to authenticate to Swift
Temp", ce);
}
return swiftUser;
}
diff --git
a/src/main/java/org/wikimedia/elasticsearch/swift/repositories/blobstore/SwiftBlobContainer.java
b/src/main/java/org/wikimedia/elasticsearch/swift/repositories/blobstore/SwiftBlobContainer.java
index 3171385..d280aa0 100644
---
a/src/main/java/org/wikimedia/elasticsearch/swift/repositories/blobstore/SwiftBlobContainer.java
+++
b/src/main/java/org/wikimedia/elasticsearch/swift/repositories/blobstore/SwiftBlobContainer.java
@@ -5,17 +5,17 @@
import org.elasticsearch.common.blobstore.BlobPath;
import org.elasticsearch.common.blobstore.support.AbstractBlobContainer;
import org.elasticsearch.common.blobstore.support.PlainBlobMetaData;
-import org.elasticsearch.common.collect.ImmutableMap;
+import org.elasticsearch.common.bytes.BytesReference;
import org.javaswift.joss.model.Directory;
import org.javaswift.joss.model.DirectoryOrObject;
import org.javaswift.joss.model.StoredObject;
+import com.google.common.collect.ImmutableMap;
+
import java.io.BufferedInputStream;
+import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
-import java.io.OutputStream;
-import java.io.PipedInputStream;
-import java.io.PipedOutputStream;
import java.util.Collection;
/**
@@ -56,17 +56,17 @@
* @param blobName A blob to delete
*/
@Override
- public boolean deleteBlob(String blobName) throws IOException {
+ public void deleteBlob(String blobName) throws IOException {
StoredObject object = blobStore.swift().getObject(buildKey(blobName));
if (object.exists()) {
object.delete();
}
- return true;
}
/**
* Get the blobs matching a given prefix
* @param blobNamePrefix The prefix to look for blobs with
+ * @return blobs metadata
*/
@Override
public ImmutableMap<String, BlobMetaData> listBlobsByPrefix(@Nullable
String blobNamePrefix) throws IOException {
@@ -101,48 +101,44 @@
/**
* Build a key for a blob name, based on the keyPath
* @param blobName The blob name to build a key for
+ * @return the key
*/
protected String buildKey(String blobName) {
return keyPath + blobName;
}
+ @Override
+ public void move(String sourceBlobname, String destinationBlobname) throws
IOException {
+
+ String source = buildKey(sourceBlobname);
+ String target = buildKey(destinationBlobname);
+ if (blobExists(sourceBlobname)) {
+ blobStore.moveBlobStorage(source, target);
+ }
+ }
+
/**
* Fetch a given blob into a BufferedInputStream
* @param blobName The blob name to read
+ * @return a stream
*/
@Override
- public InputStream openInput(String blobName) throws IOException {
- return new BufferedInputStream(
-
blobStore.swift().getObject(buildKey(blobName)).downloadObjectAsInputStream(),
+ public InputStream readBlob(String blobName) throws IOException {
+ return new
BufferedInputStream(blobStore.swift().getObject(buildKey(blobName)).downloadObjectAsInputStream(),
blobStore.bufferSizeInBytes());
}
@Override
- public OutputStream createOutput(final String blobName) throws IOException
{
- // need to remove old file if already exist
- deleteBlob(blobName);
+ public void writeBlob(String blobName, final BytesReference bytes) throws
IOException {
+ // need to remove old file if already exist
+ deleteBlob(blobName);
+ blobStore.swift().getObject(buildKey(blobName)).uploadObject(new
ByteArrayInputStream(bytes.array(), bytes.arrayOffset(), bytes.length()));
+ }
- final PipedInputStream in = new PipedInputStream();
-
- // We'll need to store this thread and make sure it terminates when the
output stream is closed.
- final Thread transport = new Thread(new Runnable(){
- public void run(){
- blobStore.swift().getObject(buildKey(blobName)).uploadObject(in);
- }
- });
- transport.start();
-
- return new PipedOutputStream(in) {
- @Override
- public void close() throws IOException {
- try {
- // Close output, close the thread
- super.close();
- transport.join();
- } catch(InterruptedException e) {
- throw new IOException("Swift input/output shenanigans.", e);
- }
- }
- };
+ @Override
+ public void writeBlob(String blobName, InputStream in, long blobSize)
throws IOException {
+ // need to remove old file if already exist
+ deleteBlob(blobName);
+ blobStore.swift().getObject(buildKey(blobName)).uploadObject(in);
}
}
diff --git
a/src/main/java/org/wikimedia/elasticsearch/swift/repositories/blobstore/SwiftBlobStore.java
b/src/main/java/org/wikimedia/elasticsearch/swift/repositories/blobstore/SwiftBlobStore.java
index 61877e6..898ca37 100644
---
a/src/main/java/org/wikimedia/elasticsearch/swift/repositories/blobstore/SwiftBlobStore.java
+++
b/src/main/java/org/wikimedia/elasticsearch/swift/repositories/blobstore/SwiftBlobStore.java
@@ -24,13 +24,12 @@
/**
* Constructor. Sets up the container mostly.
* @param settings Settings for our repository. Only care about buffer
size.
- * @param auth
- * @param container
+ * @param auth swift account info
+ * @param container swift container
*/
public SwiftBlobStore(Settings settings, Account auth, String container) {
super(settings);
this.bufferSizeInBytes = (int)settings.getAsBytesSize("buffer_size",
new ByteSizeValue(100, ByteSizeUnit.KB)).bytes();
-
swift = auth.getContainer(container);
if (!swift.exists()) {
swift.create();
@@ -38,15 +37,26 @@
}
}
+ public boolean moveBlobStorage(String sourceblob,String destinationblob){
+ StoredObject sourceObject = swift.getObject(sourceblob);
+ if(sourceObject.exists()) {
+ StoredObject newObject = swift.getObject(destinationblob);
+ sourceObject.copyObject(swift, newObject);
+ sourceObject.delete();
+ return true;
+ }
+ return false;
+ }
+
/**
- * Get the container
+ * @return the container
*/
public Container swift() {
return swift;
}
/**
- * Get our buffer size
+ * @return buffer size
*/
public int bufferSizeInBytes() {
return bufferSizeInBytes;
diff --git a/src/main/resources/es-plugin.properties
b/src/main/resources/es-plugin.properties
deleted file mode 100644
index 7d2b18b..0000000
--- a/src/main/resources/es-plugin.properties
+++ /dev/null
@@ -1,2 +0,0 @@
-plugin=${project.groupId}.SwiftRepositoryPlugin
-version=${project.version}
diff --git a/src/main/resources/plugin-descriptor.properties
b/src/main/resources/plugin-descriptor.properties
new file mode 100644
index 0000000..c9ca23b
--- /dev/null
+++ b/src/main/resources/plugin-descriptor.properties
@@ -0,0 +1,7 @@
+name=${elasticsearch.plugin.name}
+description=${project.description}
+version=${project.version}
+jvm=true
+classname=org.wikimedia.elasticsearch.swift.SwiftRepositoryPlugin
+java.version=${maven.compiler.target}
+elasticsearch.version=${elasticsearch.version}
--
To view, visit https://gerrit.wikimedia.org/r/288891
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: merged
Gerrit-Change-Id: I30ce16391d74b970e221c631deaef3185e911586
Gerrit-PatchSet: 5
Gerrit-Project: search/repository-swift
Gerrit-Branch: master
Gerrit-Owner: DCausse <[email protected]>
Gerrit-Reviewer: Avik07011988 <[email protected]>
Gerrit-Reviewer: DCausse <[email protected]>
Gerrit-Reviewer: EBernhardson <[email protected]>
Gerrit-Reviewer: jenkins-bot <>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits