package water;
import org.junit.*;
import water.api.UnlockTask;
import water.fvec.Frame;
import water.util.Log;
public class UnlockTest extends TestUtil {
@BeforeClass() public static void setup() { stall_till_cloudsize(5); }
@Test
public void run() {
// Put chunks into KV store
Frame f = new TestUtil().parse_test_file("smalldata/junit/syn_2659x1049.csv.gz");
// Create two lockable frames in KV store
Frame fr1 = new Frame(Key.<Frame>make(), f.names(), f.vecs());
Frame fr2 = new Frame(Key.<Frame>make(), f.names(), f.vecs());
// Lock the frames against writes
fr1.delete_and_lock();
fr2.delete_and_lock();
int i = 0;
try {
// try to delete the write-locked frames -> will throw an exception
fr1.delete();
fr2.delete(); // won't be reached
} catch (Throwable t) {
Log.info("Correctly unable to delete (was locked): " + t.getClass()); //either AssertionError if local or DistributedException if remote
i++;
} finally {
// second attempt: will unlock and delete properly
new UnlockTask().doAllNodes(); // without this line, there will be a leak (and assertion won't be shown)
fr1.delete();
fr2.delete();
f.delete();
Log.info("Able to delete after unlocking.");
}
Assert.assertTrue(i == 1);
}
}