}
public boolean delete(Integer item) {
INode pred = null, curr = null;
try{
Address predServer = (Address) Network.getAddress(Benchmark.getServerId(HEAD));
INode head = (INode)LocateRegistry.getRegistry(predServer.inetAddress.getHostAddress(), predServer.port).lookup(HEAD);
Network.linkDelay(true, predServer);
head.lock();
try {
pred = head;
boolean right = true;
Network.linkDelay(true, predServer);
String nextId = pred.getRightChild();
if(nextId==null)
return false;
Address currServer = (Address) Network.getAddress(Benchmark.getServerId(nextId));
curr = (INode)LocateRegistry.getRegistry(currServer.inetAddress.getHostAddress(), currServer.port).lookup(nextId);
Network.linkDelay(true, currServer);
curr.lock();
try {
while (true) {
Network.linkDelay(true, currServer);
if(item.equals(curr.getValue())){
String replacement;
Network.linkDelay(true, currServer);
String leftChildId = curr.getLeftChild();
String rightChildId;
if(leftChildId==null){
Network.linkDelay(true, currServer);
replacement = rightChildId = curr.getRightChild();
// System.err.println("replace with right child");
}else{
Network.linkDelay(true, currServer);
rightChildId = curr.getRightChild();
if(rightChildId==null){
replacement = leftChildId;
// System.err.println("replace with left child");
}else{ // get left most in right tree
// System.err.println("replace with left most in right tree");
String rcId = rightChildId;
Address server = (Address) Network.getAddress(Benchmark.getServerId(rcId));
INode rc = (INode)LocateRegistry.getRegistry(server.inetAddress.getHostAddress(), server.port).lookup(rcId);
Network.linkDelay(true, server);
rc.lock();
Address replServer;
INode replacementNode;
Network.linkDelay(true, server);
if(rc.getLeftChild()==null){
replacement = rcId;
replacementNode = rc;
replServer = server;
}else{
INode lf0 = rc;
Network.linkDelay(true, server);
replacement = lf0.getLeftChild();
Address lf1Server = (Address) Network.getAddress(Benchmark.getServerId(replacement));
INode lf1 = (INode)LocateRegistry.getRegistry(lf1Server.inetAddress.getHostAddress(), lf1Server.port).lookup(replacement);
Network.linkDelay(true, lf1Server);
lf1.lock();
Network.linkDelay(true, lf1Server);
while(lf1.getLeftChild()!=null){