Ian Maxon has uploaded a new change for review.

  https://asterix-gerrit.ics.uci.edu/1489

Change subject: Fix ASTERIXDB-1776
......................................................................

Fix ASTERIXDB-1776

The source of the issue was a deprecated method that failed when two
IODevices share a common prefix in their absolute path

Change-Id: Iba7837b433ce57f99e2c547e8bd1fb0bfc5a31df
---
M 
hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/io/IOManager.java
A 
hyracks-fullstack/hyracks/hyracks-storage-am-common/src/test/java/org/apache/hyracks/storage/am/common/IOManagerPathTest.java
2 files changed, 41 insertions(+), 1 deletion(-)


  git pull ssh://asterix-gerrit.ics.uci.edu:29418/asterixdb 
refs/changes/89/1489/1

diff --git 
a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/io/IOManager.java
 
b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/io/IOManager.java
index 05c9f07..93790c2 100644
--- 
a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/io/IOManager.java
+++ 
b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/io/IOManager.java
@@ -23,6 +23,8 @@
 import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.nio.channels.FileChannel;
+import java.nio.file.Path;
+import java.nio.file.Paths;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
@@ -62,6 +64,20 @@
 
     public IOManager(List<IODeviceHandle> devices) throws HyracksDataException 
{
         this.ioDevices = Collections.unmodifiableList(devices);
+        for (IODeviceHandle d : ioDevices) {
+            Path p = Paths.get(d.getMount().toURI());
+            for (IODeviceHandle e : ioDevices) {
+                if (e.equals(d)) {
+                    continue;
+                } else {
+                    Path q = Paths.get(e.getMount().toURI());
+                    if (p.startsWith(q)) {
+                        throw new HyracksDataException("IODevices shouldn't be 
on a union mount.");
+                    }
+                }
+            }
+
+        }
         workspaces = new ArrayList<>();
         for (IODeviceHandle d : ioDevices) {
             if (d.getWorkspace() != null) {
@@ -350,8 +366,9 @@
     }
 
     public IODeviceHandle getDevice(String fullPath) {
+        Path full = Paths.get(fullPath);
         for (IODeviceHandle d : ioDevices) {
-            if (fullPath.startsWith(d.getMount().getAbsolutePath())) {
+            if (full.startsWith(Paths.get(d.getMount().getAbsolutePath()))) {
                 return d;
             }
         }
diff --git 
a/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/test/java/org/apache/hyracks/storage/am/common/IOManagerPathTest.java
 
b/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/test/java/org/apache/hyracks/storage/am/common/IOManagerPathTest.java
new file mode 100644
index 0000000..59cb8c1
--- /dev/null
+++ 
b/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/test/java/org/apache/hyracks/storage/am/common/IOManagerPathTest.java
@@ -0,0 +1,23 @@
+package org.apache.hyracks.storage.am.common;
+
+import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.hyracks.api.io.FileReference;
+import org.apache.hyracks.api.io.IODeviceHandle;
+import org.apache.hyracks.control.nc.io.IOManager;
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Arrays;
+
+public class IOManagerPathTest {
+    @Test
+    public void test() throws HyracksDataException {
+        IODeviceHandle shorter = new IODeviceHandle(new File("/tmp/1"), 
"storage");
+        IODeviceHandle longer = new IODeviceHandle(new File("/tmp/11"), 
"storage");
+        IOManager ioManager = new IOManager(Arrays.asList(new IODeviceHandle[] 
{ shorter, longer }));
+        FileReference f = 
ioManager.resolveAbsolutePath("/tmp/11/storage/Foo_idx_foo/my_btree");
+        Assert.assertEquals("/tmp/11/storage/Foo_idx_foo/my_btree", 
f.getAbsolutePath());
+    }
+}

-- 
To view, visit https://asterix-gerrit.ics.uci.edu/1489
To unsubscribe, visit https://asterix-gerrit.ics.uci.edu/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: Iba7837b433ce57f99e2c547e8bd1fb0bfc5a31df
Gerrit-PatchSet: 1
Gerrit-Project: asterixdb
Gerrit-Branch: master
Gerrit-Owner: Ian Maxon <[email protected]>

Reply via email to