Revision 2298
Added by Jing Tao about 20 years ago
src/edu/ucsb/nceas/metacat/MetacatReplication.java | ||
---|---|---|
47 | 47 |
private Vector fileLocks = new Vector(); |
48 | 48 |
private Thread lockThread = null; |
49 | 49 |
private static final AbstractDatabase dbAdapter = MetaCatUtil.dbAdapter; |
50 |
public static final String FORCEREPLICATEDELETE = "forcereplicatedelete"; |
|
50 | 51 |
|
51 | 52 |
/** |
52 | 53 |
* Initialize the servlet by creating appropriate database connections |
... | ... | |
228 | 229 |
//read a specific docid from remote host, and store it into local host |
229 | 230 |
handleForceReplicateRequest(out, params, response); |
230 | 231 |
|
232 |
} else if ( action.equals(FORCEREPLICATEDELETE) ) { |
|
233 |
//read a specific docid from remote host, and store it into local host |
|
234 |
handleForceReplicateDeleteRequest(out, params, response); |
|
235 |
|
|
231 | 236 |
} else if ( action.equals("update") ) { |
232 | 237 |
//request an update list from the server |
233 | 238 |
handleUpdateRequest(out, params, response); |
... | ... | |
595 | 600 |
}//finally |
596 | 601 |
} |
597 | 602 |
|
603 |
/* |
|
604 |
* when a forcereplication delete request comes in, local host will delete this |
|
605 |
* document |
|
606 |
*/ |
|
607 |
private void handleForceReplicateDeleteRequest(PrintWriter out, Hashtable params, |
|
608 |
HttpServletResponse response) |
|
609 |
{ |
|
610 |
String server = ((String[])params.get("server"))[0]; // the server that |
|
611 |
String docid = ((String[])params.get("docid"))[0]; // sent the document |
|
612 |
try |
|
613 |
{ |
|
614 |
MetacatReplication.replLog("force replication delete request from " + server); |
|
615 |
MetacatReplication.replLog("force replication delete docid " + docid); |
|
616 |
MetaCatUtil.debugMessage("Force replication delete request from: "+ server, 34); |
|
617 |
MetaCatUtil.debugMessage("Force replication delete docid: "+docid, 34); |
|
618 |
DocumentImpl.delete(docid, null, null, server); |
|
619 |
MetacatReplication.replLog("document " + docid + " was successfully deleted "); |
|
620 |
MetaCatUtil.debugMessage("document " + docid + " was successfully deleted ", 34); |
|
621 |
} |
|
622 |
catch(Exception e) |
|
623 |
{ |
|
624 |
MetacatReplication.replErrorLog("document " + docid + |
|
625 |
" failed to delete because "+ |
|
626 |
e.getMessage()); |
|
627 |
MetaCatUtil.debugMessage("ERROR in MetacatReplication.handleForceDeleteReplicate" + |
|
628 |
"Request(): " + e.getMessage(), 30); |
|
629 |
|
|
630 |
}//catch |
|
631 |
|
|
632 |
} |
|
633 |
|
|
634 |
|
|
598 | 635 |
/** |
599 | 636 |
* when a forcereplication data file request comes in, local host sends a |
600 | 637 |
* readdata request to the requesting server (remote server) for the specified |
... | ... | |
668 | 705 |
|
669 | 706 |
//if action is delete, we don't delete the data file. Just archieve |
670 | 707 |
//the xml_documents |
671 |
if (dbaction.equals("delete")) |
|
708 |
/*if (dbaction.equals("delete"))
|
|
672 | 709 |
{ |
673 | 710 |
//conn = util.getConnection(); |
674 | 711 |
DocumentImpl.delete(docid,user,null); |
675 | 712 |
//util.returnConnection(conn); |
676 |
} |
|
713 |
}*/
|
|
677 | 714 |
//To data file insert or update is same |
678 |
else if (dbaction.equals("insert")||dbaction.equals("update"))
|
|
715 |
if (dbaction.equals("insert")||dbaction.equals("update")) |
|
679 | 716 |
{ |
680 | 717 |
//Get data file and store it into local file system. |
681 | 718 |
// sending back readdata request to server |
src/edu/ucsb/nceas/metacat/MetaCatServlet.java | ||
---|---|---|
1822 | 1822 |
try { |
1823 | 1823 |
|
1824 | 1824 |
try { |
1825 |
DocumentImpl.delete(docid[0], user, groups); |
|
1825 |
// null means notify server is null |
|
1826 |
DocumentImpl.delete(docid[0], user, groups, null); |
|
1826 | 1827 |
EventLog.getInstance().log(request.getRemoteAddr(), |
1827 | 1828 |
user, docid[0], "delete"); |
1828 | 1829 |
response.setContentType("text/xml"); |
src/edu/ucsb/nceas/metacat/DocumentImpl.java | ||
---|---|---|
1156 | 1156 |
/** |
1157 | 1157 |
* Build the index records for this document. For each node, all absolute |
1158 | 1158 |
* and relative paths to the root of the document are created and inserted |
1159 |
* into the xml_index table. This requires that the DocumentImpl instance
|
|
1160 |
* exists, so first call the constructor that reads the document from the
|
|
1159 |
* into the xml_index table. This requires that the DocumentImpl instance |
|
1160 |
* exists, so first call the constructor that reads the document from the |
|
1161 | 1161 |
* database. |
1162 | 1162 |
* |
1163 | 1163 |
* @throws McdbException on error getting the node records for the document |
... | ... | |
1179 | 1179 |
Long nodeId = new Long(currentNode.getNodeId()); |
1180 | 1180 |
nodeRecordMap.put(nodeId, currentNode); |
1181 | 1181 |
} |
1182 |
|
|
1183 |
// Opening separate db connection for deleting and writing
|
|
1182 |
|
|
1183 |
// Opening separate db connection for deleting and writing |
|
1184 | 1184 |
// XML Index -- be sure that it is all in one db transaction |
1185 | 1185 |
int serialNumber = -1; |
1186 | 1186 |
DBConnection dbConn = null; |
... | ... | |
1191 | 1191 |
dbConn.setAutoCommit(false); |
1192 | 1192 |
//make sure record is done |
1193 | 1193 |
//checkDocumentTable(); |
1194 |
|
|
1194 |
|
|
1195 | 1195 |
// Delete the previous index entries for this document |
1196 | 1196 |
deleteNodeIndex(dbConn); |
1197 |
|
|
1197 |
|
|
1198 | 1198 |
// Step through all of the node records we were given |
1199 | 1199 |
// and build the new index and update the database |
1200 | 1200 |
it = nodeRecordLists.iterator(); |
... | ... | |
1204 | 1204 |
if (currentNode.nodetype.equals("ELEMENT") || |
1205 | 1205 |
currentNode.nodetype.equals("ATTRIBUTE") ) { |
1206 | 1206 |
|
1207 |
System.err.println("\nStarting Node: " +
|
|
1208 |
currentNode.getNodeId() + " (" +
|
|
1209 |
currentNode.getParentNodeId() + "): " +
|
|
1207 |
System.err.println("\nStarting Node: " + |
|
1208 |
currentNode.getNodeId() + " (" + |
|
1209 |
currentNode.getParentNodeId() + "): " + |
|
1210 | 1210 |
currentNode.getNodeName() + " (" + |
1211 | 1211 |
currentNode.getNodeType() + ")"); |
1212 | 1212 |
if (atRootElement) { |
1213 | 1213 |
rootNodeId = currentNode.getNodeId(); |
1214 | 1214 |
atRootElement = false; |
1215 | 1215 |
} |
1216 |
traverseParents(nodeRecordMap, rootNodeId,
|
|
1216 |
traverseParents(nodeRecordMap, rootNodeId, |
|
1217 | 1217 |
currentNode.getNodeId(), |
1218 | 1218 |
currentNode.getNodeId(), "", pathList); |
1219 | 1219 |
updateNodeIndex(dbConn, pathList); |
1220 |
|
|
1220 | 1221 |
} |
1222 |
|
|
1221 | 1223 |
} |
1222 | 1224 |
dbConn.commit(); |
1223 | 1225 |
} catch (SQLException e) { |
1224 | 1226 |
MetaCatUtil.debugMessage( |
1225 | 1227 |
"SQL Exception while inserting path index in " + |
1226 | 1228 |
"DocumentImpl.buildIndex for document " + docid, 10); |
1227 |
MetaCatUtil.debugMessage(e.getMessage(), 10);
|
|
1229 |
MetaCatUtil.debugMessage(e.getMessage(), 10);
|
|
1228 | 1230 |
e.printStackTrace(); |
1229 | 1231 |
try { |
1230 | 1232 |
dbConn.rollback(); |
1231 | 1233 |
} catch (SQLException sqle) { |
1232 |
MetaCatUtil.debugMessage(
|
|
1233 |
"Error while rolling back commit in DocumentImpl.buildIndex"
|
|
1234 |
MetaCatUtil.debugMessage(
|
|
1235 |
"Error while rolling back commit in DocumentImpl.buildIndex"
|
|
1234 | 1236 |
+ "\n" + sqle.getMessage(), 10); |
1235 | 1237 |
} |
1236 | 1238 |
} finally { |
1237 |
DBConnectionPool.returnDBConnection(dbConn, serialNumber);
|
|
1239 |
DBConnectionPool.returnDBConnection(dbConn, serialNumber);
|
|
1238 | 1240 |
} |
1239 | 1241 |
} |
1240 | 1242 |
|
... | ... | |
1249 | 1251 |
* @param children the string representation of all child nodes of this id |
1250 | 1252 |
* @param pathList the hash to which paths are added |
1251 | 1253 |
*/ |
1252 |
private void traverseParents(HashMap records, long rootNodeId, |
|
1253 |
long leafNodeId, long id, |
|
1254 |
|
|
1255 |
private void traverseParents(HashMap records, long rootNodeId, |
|
1256 |
long leafNodeId, long id, |
|
1254 | 1257 |
String children, HashMap pathList) { |
1255 | 1258 |
Long nodeId = new Long(id); |
1256 | 1259 |
NodeRecord current = (NodeRecord)records.get(nodeId); |
... | ... | |
1273 | 1276 |
String path = current.getNodeName() + children; |
1274 | 1277 |
if (!children.equals("")) { |
1275 | 1278 |
System.err.print("B: " + path +"\n"); |
1276 |
pathList.put(path, new PathIndexEntry(leafNodeId, path, docid,
|
|
1279 |
pathList.put(path, new PathIndexEntry(leafNodeId, path, docid, |
|
1277 | 1280 |
doctype, parentId)); |
1278 | 1281 |
} |
1279 | 1282 |
if (id == rootNodeId) { |
... | ... | |
1281 | 1284 |
System.err.print("C: " + fullPath +"\n"); |
1282 | 1285 |
pathList.put(fullPath, new PathIndexEntry(leafNodeId, fullPath, |
1283 | 1286 |
docid, doctype, parentId)); |
1287 |
|
|
1284 | 1288 |
} |
1285 | 1289 |
} |
1286 | 1290 |
} |
1287 | 1291 |
|
1288 | 1292 |
/** |
1289 |
* Delete the paths from the xml_index table on the database in preparation
|
|
1293 |
* Delete the paths from the xml_index table on the database in preparation |
|
1290 | 1294 |
* of a subsequent update. |
1291 | 1295 |
* |
1292 | 1296 |
* @param conn the database connection to use, keeping a single transaction |
... | ... | |
1298 | 1302 |
String sql = "DELETE FROM xml_index WHERE docid LIKE ?"; |
1299 | 1303 |
MetaCatUtil.debugMessage(sql, 55); |
1300 | 1304 |
System.err.println("SQL is: " + sql); |
1301 |
|
|
1305 |
|
|
1302 | 1306 |
PreparedStatement pstmt = conn.prepareStatement(sql); |
1303 | 1307 |
|
1304 | 1308 |
// Increase usage count for the connection |
1305 | 1309 |
conn.increaseUsageCount(1); |
1306 |
|
|
1310 |
|
|
1307 | 1311 |
// Execute the delete and close the statement |
1308 | 1312 |
pstmt.setString(1, familyId); |
1309 | 1313 |
int rows = pstmt.executeUpdate(); |
... | ... | |
1311 | 1315 |
MetaCatUtil.debugMessage("Deleted " + rows + " rows from xml_index " + |
1312 | 1316 |
"for document " + docid, 55); |
1313 | 1317 |
} |
1314 |
|
|
1318 |
|
|
1315 | 1319 |
/** |
1316 |
* Insert the paths from the pathList into the xml_index table on the
|
|
1320 |
* Insert the paths from the pathList into the xml_index table on the
|
|
1317 | 1321 |
* database. |
1318 | 1322 |
* |
1319 | 1323 |
* @param conn the database connection to use, keeping a single transaction |
1320 | 1324 |
* @param pathList the hash of paths to insert |
1321 | 1325 |
* @throws SQLException if there is an error inserting into the db |
1322 | 1326 |
*/ |
1323 |
private void updateNodeIndex(DBConnection conn, HashMap pathList)
|
|
1324 |
throws SQLException
|
|
1327 |
private void updateNodeIndex(DBConnection conn, HashMap pathList) |
|
1328 |
throws SQLException
|
|
1325 | 1329 |
{ |
1326 | 1330 |
// Create an insert statement to reuse for all of the path |
1327 | 1331 |
// insertions |
... | ... | |
1333 | 1337 |
String familyId = MetaCatUtil.getDocIdFromString(docid); |
1334 | 1338 |
pstmt.setString(3, familyId); |
1335 | 1339 |
pstmt.setString(4, doctype); |
1336 |
|
|
1340 |
|
|
1337 | 1341 |
// Step through the hashtable and insert each of the path values |
1338 | 1342 |
Iterator it = pathList.values().iterator(); |
1339 | 1343 |
while (it.hasNext()) { |
... | ... | |
1348 | 1352 |
// Close the database statement |
1349 | 1353 |
pstmt.close(); |
1350 | 1354 |
} |
1351 |
|
|
1355 |
|
|
1352 | 1356 |
private boolean isRevisionOnly(DocumentIdentifier docid) throws Exception |
1353 | 1357 |
{ |
1354 | 1358 |
//System.out.println("inRevisionOnly"); |
... | ... | |
2316 | 2320 |
* @param docid |
2317 | 2321 |
* the ID of the document to be deleted from the database |
2318 | 2322 |
*/ |
2319 |
public static void delete(String accnum, String user, String[] groups) |
|
2323 |
public static void delete(String accnum, String user, String[] groups, String notifyServer)
|
|
2320 | 2324 |
throws Exception |
2321 | 2325 |
{ |
2322 |
// OLD |
|
2323 |
//DocumentIdentifier id = new DocumentIdentifier(accnum); |
|
2324 |
//String docid = id.getIdentifier(); |
|
2325 |
//String rev = id.getRev(); |
|
2326 | 2326 |
|
2327 |
// OLD |
|
2328 |
// Determine if the docid,rev are OK for DELETE |
|
2329 |
//AccessionNumber ac = new AccessionNumber(conn); |
|
2330 |
//docid = ac.generate(docid, rev, "DELETE"); |
|
2331 | 2327 |
DBConnection conn = null; |
2332 | 2328 |
int serialNumber = -1; |
2333 | 2329 |
PreparedStatement pstmt = null; |
2330 |
boolean isXML = true; |
|
2334 | 2331 |
try { |
2335 | 2332 |
//check out DBConnection |
2336 | 2333 |
conn = DBConnectionPool.getDBConnection("DocumentImpl.delete"); |
... | ... | |
2338 | 2335 |
|
2339 | 2336 |
// NEW - WHEN CLIENT ALWAYS PROVIDE ACCESSION NUMBER INCLUDING REV |
2340 | 2337 |
// IN IT |
2341 |
AccessionNumber ac = new AccessionNumber(accnum, "DELETE"); |
|
2342 |
String docid = ac.getDocid();
|
|
2343 |
String rev = ac.getRev(); |
|
2338 |
//AccessionNumber ac = new AccessionNumber(accnum, "DELETE");
|
|
2339 |
String docid = MetaCatUtil.getDocIdFromAccessionNumber(accnum);
|
|
2340 |
//String rev = ac.getRev();
|
|
2344 | 2341 |
|
2342 |
// get the type of deleting docid, this will be used in forcereplication |
|
2343 |
String type = getDocTypeFromDB(conn, docid); |
|
2344 |
if (type != null && type.trim().equals("BIN")) |
|
2345 |
{ |
|
2346 |
isXML = false; |
|
2347 |
} |
|
2348 |
|
|
2345 | 2349 |
MetaCatUtil.debugMessage("Start deleting doc " + docid + "...", 20); |
2346 | 2350 |
// check for 'write' permission for 'user' to delete this document |
2347 | 2351 |
if (!hasAllPermission(user, groups, accnum)) { throw new Exception( |
... | ... | |
2428 | 2432 |
DBConnectionPool.returnDBConnection(conn, serialNumber); |
2429 | 2433 |
} |
2430 | 2434 |
} |
2431 |
//IF this is a package document: |
|
2432 |
//delete all of the relations that this document created. |
|
2433 |
//if the deleted document is a package document its relations should |
|
2434 |
//no longer be active if it has been deleted from the system. |
|
2435 |
// add force delete replcation document here. |
|
2436 |
ForceReplicationHandler frh = new ForceReplicationHandler( |
|
2437 |
accnum, ForceReplicationHandler.DELETE, isXML, notifyServer); |
|
2435 | 2438 |
} |
2436 | 2439 |
|
2440 |
private static String getDocTypeFromDB(DBConnection conn, String docidWithoutRev) |
|
2441 |
throws SQLException |
|
2442 |
{ |
|
2443 |
String type = null; |
|
2444 |
String sql = "SELECT DOCTYPE FROM xml_documents WHERE docid LIKE " + "'" + |
|
2445 |
docidWithoutRev +"'"; |
|
2446 |
Statement stmt = null; |
|
2447 |
stmt = conn.createStatement(); |
|
2448 |
ResultSet result = stmt.executeQuery(sql); |
|
2449 |
boolean hasResult = result.next(); |
|
2450 |
if (hasResult) |
|
2451 |
{ |
|
2452 |
type = result.getString(1); |
|
2453 |
} |
|
2454 |
MetaCatUtil.debugMessage("The type of deleting docid " + docidWithoutRev + |
|
2455 |
" is " + type, 2); |
|
2456 |
return type; |
|
2457 |
} |
|
2458 |
|
|
2437 | 2459 |
/** |
2438 | 2460 |
* Check for "WRITE" permission on @docid for @user and/or @groups |
2439 | 2461 |
* from DB connection |
... | ... | |
3096 | 3118 |
xmldoc.toXml(new PrintWriter(System.out), null, null, true); |
3097 | 3119 |
} |
3098 | 3120 |
} else if (action.equals("DELETE")) { |
3099 |
DocumentImpl.delete(docid, null, null); |
|
3121 |
DocumentImpl.delete(docid, null, null,null);
|
|
3100 | 3122 |
System.out.println("Document deleted: " + docid); |
3101 | 3123 |
} else { |
3102 | 3124 |
/* |
src/edu/ucsb/nceas/metacat/ReplicationHandler.java | ||
---|---|---|
124 | 124 |
ReplicationServer replServer = null; // Variable to store the |
125 | 125 |
// ReplicationServer got from |
126 | 126 |
// Server list |
127 |
String server; // Variable to store server name |
|
127 |
String server = null; // Variable to store server name
|
|
128 | 128 |
String update; |
129 | 129 |
ReplMessageHandler message = new ReplMessageHandler(); |
130 | 130 |
Vector responses = new Vector(); |
... | ... | |
332 | 332 |
String docId = (String)w.elementAt(0); |
333 | 333 |
try |
334 | 334 |
{ |
335 |
handleDeleteSingleDocument(docId); |
|
335 |
handleDeleteSingleDocument(docId, server);
|
|
336 | 336 |
} |
337 | 337 |
catch (Exception ee) |
338 | 338 |
{ |
... | ... | |
547 | 547 |
|
548 | 548 |
|
549 | 549 |
/* Handle delete single document*/ |
550 |
private void handleDeleteSingleDocument(String docId) |
|
550 |
private void handleDeleteSingleDocument(String docId, String notifyServer)
|
|
551 | 551 |
throws Exception |
552 | 552 |
{ |
553 | 553 |
MetaCatUtil.debugMessage("Try delete doc: "+docId, 40); |
... | ... | |
566 | 566 |
//so we just add one for it. This rev number is no sence. |
567 | 567 |
String accnum=docId+util.getOption("accNumSeparator")+"1"; |
568 | 568 |
//System.out.println("accnum: "+accnum); |
569 |
DocumentImpl.delete(accnum, null, null); |
|
569 |
DocumentImpl.delete(accnum, null, null, notifyServer);
|
|
570 | 570 |
MetaCatUtil.debugMessage("Successfully deleted doc " + docId, 30); |
571 | 571 |
MetacatReplication.replLog("Doc " + docId + " deleted"); |
572 | 572 |
} |
src/edu/ucsb/nceas/metacat/ForceReplicationHandler.java | ||
---|---|---|
1 | 1 |
/** |
2 | 2 |
* '$RCSfile$' |
3 |
* Purpose: A class to asyncronously force the replication of each server
|
|
4 |
* that has an entry in the xml_replication table. When run,
|
|
5 |
* this thread communicates with each server in the list and
|
|
6 |
* solicites a read of an updated or newly inserted document
|
|
3 |
* Purpose: A class to asyncronously force the replication of each server |
|
4 |
* that has an entry in the xml_replication table. When run, |
|
5 |
* this thread communicates with each server in the list and |
|
6 |
* solicites a read of an updated or newly inserted document |
|
7 | 7 |
* with a certain docid. |
8 | 8 |
* Copyright: 2000 Regents of the University of California and the |
9 | 9 |
* National Center for Ecological Analysis and Synthesis |
... | ... | |
28 | 28 |
* along with this program; if not, write to the Free Software |
29 | 29 |
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
30 | 30 |
*/ |
31 |
|
|
31 |
|
|
32 | 32 |
package edu.ucsb.nceas.metacat; |
33 | 33 |
|
34 | 34 |
import java.util.*; |
... | ... | |
39 | 39 |
import java.text.*; |
40 | 40 |
|
41 | 41 |
/** |
42 |
* A class to asyncronously force the replication of each server
|
|
43 |
* that has an entry in the xml_replication table. When run,
|
|
44 |
* this thread communicates with each server in the list and
|
|
45 |
* solicites a read of an updated or newly inserted document
|
|
42 |
* A class to asyncronously force the replication of each server |
|
43 |
* that has an entry in the xml_replication table. When run, |
|
44 |
* this thread communicates with each server in the list and |
|
45 |
* solicites a read of an updated or newly inserted document |
|
46 | 46 |
* with a certain docid. |
47 | 47 |
*/ |
48 | 48 |
public class ForceReplicationHandler implements Runnable |
... | ... | |
53 | 53 |
private String action; |
54 | 54 |
private boolean xmlDocument; |
55 | 55 |
private boolean dbactionFlag = true; |
56 |
private ReplicationServerList serverLists = null;//Serverlist
|
|
56 |
private ReplicationServerList serverLists = null;//Serverlist |
|
57 | 57 |
private int homeServerCode = 0; // home server code for the docid |
58 |
// When a metacat A got forcereplication
|
|
58 |
// When a metacat A got forcereplication |
|
59 | 59 |
// notification from B, then A will update its record. And A will notification |
60 | 60 |
// other metacat in its serverlist to update this docid if A is a hub. But we |
61 | 61 |
// don't want A to notify B again. B is nofitification of A |
62 | 62 |
private String notificationServer = null; |
63 |
|
|
64 |
|
|
65 |
|
|
63 |
|
|
64 |
//constant |
|
65 |
public static final String DELETE = "delete"; |
|
66 |
|
|
67 |
|
|
68 |
|
|
66 | 69 |
/** |
67 | 70 |
* Constructor of ForceReplicationHandler |
68 | 71 |
* @param docid the docid to force replicate |
69 |
* @param the action that is being performed on the document (either
|
|
72 |
* @param the action that is being performed on the document (either |
|
70 | 73 |
* INSERT or UPDATE) |
71 | 74 |
* @param xml the docid is a xml document or not (data file) |
72 |
* @param notificationServer, when a metacat A got forcereplication
|
|
75 |
* @param notificationServer, when a metacat A got forcereplication |
|
73 | 76 |
* notification from B, then A will update its record. And A will notification |
74 | 77 |
* other metacat in its serverlist to update this docid if A is a hub. But we |
75 | 78 |
* don't want A to notify B again. B is nofitification of A. |
76 | 79 |
*/ |
77 |
public ForceReplicationHandler(String docid, String action, boolean xml,
|
|
80 |
public ForceReplicationHandler(String docid, String action, boolean xml, |
|
78 | 81 |
String myNotificationServer) |
79 | 82 |
{ |
80 | 83 |
this.docid = docid; |
... | ... | |
94 | 97 |
}//catch |
95 | 98 |
// Get the notification server |
96 | 99 |
this.notificationServer = myNotificationServer; |
97 |
|
|
100 |
|
|
98 | 101 |
if(this.action.equals("")) |
99 | 102 |
{ |
100 | 103 |
dbactionFlag = false; |
101 | 104 |
} |
102 |
|
|
105 |
|
|
103 | 106 |
btThread = new Thread(this); |
104 | 107 |
btThread.setPriority(Thread.MIN_PRIORITY); |
105 | 108 |
btThread.start(); |
106 | 109 |
} |
107 |
|
|
110 |
|
|
108 | 111 |
/** |
109 | 112 |
* Use this constructor when the action is implied. |
110 | 113 |
*/ |
111 |
public ForceReplicationHandler(String docid, boolean xml,
|
|
114 |
public ForceReplicationHandler(String docid, boolean xml, |
|
112 | 115 |
String myNotificationServer ) |
113 | 116 |
{ |
114 | 117 |
this.docid = docid; |
... | ... | |
132 | 135 |
btThread.setPriority(Thread.MIN_PRIORITY); |
133 | 136 |
btThread.start(); |
134 | 137 |
} |
135 |
|
|
138 |
|
|
136 | 139 |
/** |
137 |
* Method to send force replication command to other server to get
|
|
140 |
* Method to send force replication command to other server to get |
|
138 | 141 |
* a new or updated docid |
139 | 142 |
*/ |
140 | 143 |
public void run() |
141 | 144 |
{ |
142 |
|
|
145 |
|
|
143 | 146 |
try |
144 | 147 |
{ |
145 | 148 |
// URL for notifcation |
... | ... | |
149 | 152 |
{ |
150 | 153 |
return; |
151 | 154 |
} |
152 |
|
|
153 |
// Thread seelping for some seconds to make sure the document was insert
|
|
155 |
|
|
156 |
// Thread seelping for some seconds to make sure the document was insert |
|
154 | 157 |
// into the database before we send force replication request |
155 | 158 |
int sleepTime = Integer.parseInt |
156 | 159 |
(MetaCatUtil.getOption("forcereplicationwaitingtime")); |
... | ... | |
165 | 168 |
ReplicationServer replicationServer = serverLists.serverAt(i); |
166 | 169 |
// Get this ReplicationServer 's name |
167 | 170 |
String server = replicationServer.getServerName(); |
168 |
|
|
169 |
// If the server is the notification server, we don't notify it back
|
|
171 |
|
|
172 |
// If the server is the notification server, we don't notify it back |
|
170 | 173 |
// again, if server is null we don't replication it |
171 | 174 |
if (server!=null && !server.equals(notificationServer)) |
172 | 175 |
{ |
173 |
|
|
176 |
|
|
174 | 177 |
if(dbactionFlag) |
175 | 178 |
{ |
176 | 179 |
// xml documents and server can replicate xml doucment |
... | ... | |
179 | 182 |
// If this docid's homeserver is localhost, replicate it |
180 | 183 |
if (homeServerCode==1) |
181 | 184 |
{ |
182 |
MetacatReplication.replLog("force xml replicating to "
|
|
185 |
MetacatReplication.replLog("force xml replicating to " |
|
183 | 186 |
+ server); |
184 |
comeAndGetIt = new URL("https://" + server +
|
|
185 |
"?action=forcereplicate&server=" +
|
|
186 |
util.getOption("server") +
|
|
187 |
comeAndGetIt = new URL("https://" + server + |
|
188 |
"?action=forcereplicate&server=" + |
|
189 |
util.getOption("server") + |
|
187 | 190 |
util.getOption("replicationpath") + |
188 | 191 |
"&docid=" + docid + "&dbaction=" + |
189 | 192 |
action); |
193 |
//over write the url for delete |
|
194 |
if (action != null && action.equals(DELETE)) |
|
195 |
{ |
|
196 |
comeAndGetIt = new URL("https://" + server + "?action=" + |
|
197 |
MetacatReplication.FORCEREPLICATEDELETE + |
|
198 |
"&docid=" + docid +"&server="+ util.getOption("server")+ |
|
199 |
util.getOption("replicationpath")); |
|
200 |
|
|
201 |
} |
|
190 | 202 |
}//if servercode==1 |
191 | 203 |
else if (replicationServer.getHub()|| |
192 | 204 |
server.equals(MetacatReplication. |
... | ... | |
195 | 207 |
// If the docid's home server is not local host, but local host |
196 | 208 |
// is a hub of this server, replicate the docid too. |
197 | 209 |
// If the server is homeserver of the docid, replication it too |
198 |
MetacatReplication.replLog("force xml replicating to "
|
|
210 |
MetacatReplication.replLog("force xml replicating to " |
|
199 | 211 |
+ server); |
200 |
comeAndGetIt = new URL("https://" + server +
|
|
201 |
"?action=forcereplicate&server=" +
|
|
202 |
util.getOption("server") +
|
|
212 |
comeAndGetIt = new URL("https://" + server + |
|
213 |
"?action=forcereplicate&server=" + |
|
214 |
util.getOption("server") + |
|
203 | 215 |
util.getOption("replicationpath") + |
204 | 216 |
"&docid=" + docid + "&dbaction=" + |
205 | 217 |
action); |
206 |
|
|
218 |
//over write the url for delete |
|
219 |
if (action != null && action.equals(DELETE)) |
|
220 |
{ |
|
221 |
comeAndGetIt = new URL("https://" + server + "?action=" + |
|
222 |
MetacatReplication.FORCEREPLICATEDELETE + |
|
223 |
"&docid=" + docid+"&server="+ util.getOption("server")+ |
|
224 |
util.getOption("replicationpath")); |
|
225 |
|
|
226 |
} |
|
207 | 227 |
}//else |
208 |
|
|
228 |
|
|
209 | 229 |
}//if xmlDocument |
210 | 230 |
//It is data file and configured to handle data replication |
211 | 231 |
else if (replicationServer.getDataReplication()) |
... | ... | |
213 | 233 |
// If the docid's home server is local host, replicate the docid |
214 | 234 |
if (homeServerCode==1) |
215 | 235 |
{ |
216 |
MetacatReplication.replLog("force data replicating to "
|
|
236 |
MetacatReplication.replLog("force data replicating to " |
|
217 | 237 |
+ server); |
218 |
comeAndGetIt = new URL("https://" + server +
|
|
219 |
"?action=forcereplicatedatafile&server=" +
|
|
220 |
util.getOption("server") +
|
|
238 |
comeAndGetIt = new URL("https://" + server + |
|
239 |
"?action=forcereplicatedatafile&server=" + |
|
240 |
util.getOption("server") + |
|
221 | 241 |
util.getOption("replicationpath") + |
222 | 242 |
"&docid=" + docid + "&dbaction=" + |
223 | 243 |
action); |
244 |
//over write the url for delete |
|
245 |
if (action != null && action.equals(DELETE)) |
|
246 |
{ |
|
247 |
comeAndGetIt = new URL("https://" + server + "?action=" + |
|
248 |
MetacatReplication.FORCEREPLICATEDELETE + |
|
249 |
"&docid=" + docid +"&server="+ util.getOption("server")+ |
|
250 |
util.getOption("replicationpath") ); |
|
251 |
|
|
252 |
} |
|
253 |
|
|
224 | 254 |
}//if serverCode==1 |
225 | 255 |
else if (replicationServer.getHub()|| |
226 | 256 |
server.equals(MetacatReplication. |
227 | 257 |
getServerNameForServerCode(homeServerCode))) |
228 | 258 |
{ |
229 |
// If the docid's home server is not local host, but local host
|
|
259 |
// If the docid's home server is not local host, but local host |
|
230 | 260 |
// is a hub of this server, replicate the docid too. |
231 | 261 |
// If the server is homeserver of the docid replication it too |
232 |
MetacatReplication.replLog("force data replicating to "
|
|
262 |
MetacatReplication.replLog("force data replicating to " |
|
233 | 263 |
+ server); |
234 |
comeAndGetIt = new URL("https://" + server +
|
|
235 |
"?action=forcereplicatedatafile&server=" +
|
|
236 |
util.getOption("server") +
|
|
264 |
comeAndGetIt = new URL("https://" + server + |
|
265 |
"?action=forcereplicatedatafile&server=" + |
|
266 |
util.getOption("server") + |
|
237 | 267 |
util.getOption("replicationpath") + |
238 | 268 |
"&docid=" + docid + "&dbaction=" + |
239 | 269 |
action); |
240 |
|
|
270 |
//over write the url for delete |
|
271 |
if (action != null && action.equals(DELETE)) |
|
272 |
{ |
|
273 |
comeAndGetIt = new URL("https://" + server + "?action=" + |
|
274 |
MetacatReplication.FORCEREPLICATEDELETE + |
|
275 |
"&docid=" + docid+"&server="+ util.getOption("server")+ |
|
276 |
util.getOption("replicationpath") ); |
|
277 |
|
|
278 |
} |
|
279 |
|
|
241 | 280 |
}//else if servercode==1 |
242 | 281 |
}//else if data file |
243 |
|
|
282 |
|
|
244 | 283 |
}//if has explicite action |
245 | 284 |
else |
246 | 285 |
{ // has implicite action |
... | ... | |
251 | 290 |
{ |
252 | 291 |
// If homeserver of this doicd is local, replicate it |
253 | 292 |
if (homeServerCode ==1) |
254 |
{
|
|
255 |
comeAndGetIt = new URL("https://" + server +
|
|
256 |
"?action=forcereplicate&server=" +
|
|
257 |
util.getOption("server") +
|
|
293 |
{ |
|
294 |
comeAndGetIt = new URL("https://" + server + |
|
295 |
"?action=forcereplicate&server=" + |
|
296 |
util.getOption("server") + |
|
258 | 297 |
util.getOption("replicationpath") + |
259 | 298 |
"&docid=" + docid); |
260 |
|
|
299 |
|
|
261 | 300 |
}//if homeserver ==1 |
262 | 301 |
else if (replicationServer.getHub()|| |
263 | 302 |
server.equals(MetacatReplication. |
264 | 303 |
getServerNameForServerCode(homeServerCode))) |
265 | 304 |
{ |
266 |
// If home server of this docid is not local host, but local
|
|
305 |
// If home server of this docid is not local host, but local |
|
267 | 306 |
// host is a hub for this server, replicate this doicd |
268 | 307 |
// If the server is homeserver of the docid, replication it too |
269 |
comeAndGetIt = new URL("https://" + server +
|
|
270 |
"?action=forcereplicate&server=" +
|
|
271 |
util.getOption("server") +
|
|
308 |
comeAndGetIt = new URL("https://" + server + |
|
309 |
"?action=forcereplicate&server=" + |
|
310 |
util.getOption("server") + |
|
272 | 311 |
util.getOption("replicationpath") + |
273 | 312 |
"&docid=" + docid); |
274 |
|
|
313 |
|
|
275 | 314 |
}//else if |
276 |
|
|
315 |
|
|
277 | 316 |
}//if xmlDoucment |
278 |
else if (replicationServer.getDataReplication())
|
|
317 |
else if (replicationServer.getDataReplication()) |
|
279 | 318 |
{ //It is datafile and server is configured to replicate data file |
280 |
|
|
319 |
|
|
281 | 320 |
//if home server is local host, replicate the data file |
282 | 321 |
if (homeServerCode ==1) |
283 | 322 |
{ |
284 |
comeAndGetIt = new URL("https://" + server +
|
|
285 |
"?action=forcereplicatedatafile&server=" +
|
|
286 |
util.getOption("server") +
|
|
323 |
comeAndGetIt = new URL("https://" + server + |
|
324 |
"?action=forcereplicatedatafile&server=" + |
|
325 |
util.getOption("server") + |
|
287 | 326 |
util.getOption("replicationpath") + |
288 | 327 |
"&docid=" + docid); |
289 | 328 |
}//if |
... | ... | |
294 | 333 |
// If home server is not local host, but the local host is a hub |
295 | 334 |
// For this server, replicate the data file |
296 | 335 |
// If the server is homeserver of the docid, replication it too |
297 |
comeAndGetIt = new URL("https://" + server +
|
|
298 |
"?action=forcereplicatedatafile&server=" +
|
|
299 |
util.getOption("server") +
|
|
336 |
comeAndGetIt = new URL("https://" + server + |
|
337 |
"?action=forcereplicatedatafile&server=" + |
|
338 |
util.getOption("server") + |
|
300 | 339 |
util.getOption("replicationpath") + |
301 | 340 |
"&docid=" + docid); |
302 |
|
|
341 |
|
|
303 | 342 |
}//else |
304 | 343 |
}//else if |
305 | 344 |
}//else has implicit action |
306 |
|
|
345 |
|
|
307 | 346 |
//Make sure comeAndGetIt is not empty |
308 | 347 |
if ( comeAndGetIt != null && !comeAndGetIt.equals("")) |
309 | 348 |
{ |
310 |
MetaCatUtil.debugMessage("sending message: "
|
|
349 |
MetaCatUtil.debugMessage("sending message: " |
|
311 | 350 |
+ comeAndGetIt.toString(), 25); |
312 | 351 |
String message = MetacatReplication.getURLContent(comeAndGetIt); |
313 | 352 |
} |
... | ... | |
316 | 355 |
//invoces a read request from the server to this local machine. |
317 | 356 |
}//if notification server |
318 | 357 |
}//for |
319 |
|
|
358 |
|
|
320 | 359 |
}//try |
321 | 360 |
catch(Exception e) |
322 | 361 |
{ |
323 |
System.out.println("error in ForceReplicationHandler.run: " +
|
|
362 |
System.out.println("error in ForceReplicationHandler.run: " + |
|
324 | 363 |
e.getMessage()); |
325 | 364 |
e.printStackTrace(System.out); |
326 | 365 |
} |
Also available in: Unified diff
Add new feature that delete can be broadcasted by force replication.