public MainForm() { InitializeComponent(); numUpDownMaxBackupCapacity.Value = Settings.Default.maxBackupCapacity; db = new NodeDatabase(); indexDB = new IndexDatabase(); DataTable dt = db.GetNodes(); dataGridViewNodeSets.DataSource = dt; ebic = new EBInterfaceClient(); /* dataGridViewNodeSets.Rows.Add("936DA01F-9ABD-4d9d-80C7-02AF85C822A8", "PC1", "192.168.1.1", "00-21-70-FE-23-EF", "1", "51", "89", "0", "100","yes"); dataGridViewNodeSets.Rows.Add("936DA01F-9ABD-4d9d-80C7-02AF85C822A8", "PC2", "192.168.1.2", "00-21-69-FE-23-AB", "32", "50", "88", "25", "75", "yes"); dataGridViewNodeSets.Rows.Add("936DA01F-9ABD-4d9d-80C7-02AF85C822AC", "PC3", "192.168.1.3", "00-21-69-FE-23-AC", "62", "49", "87", "50", "50", "no"); */ }
// After the local node receives the index file from a foreign node // Merge that foreign index file with the local index file, then delete the foreign index file public void processIndexes(string filePath) { IndexDatabase ind = new IndexDatabase(); ind.MergeIndexFiles(filePath); if (System.IO.File.Exists(filePath)) { try { System.IO.File.Delete(filePath); } catch (System.IO.IOException e) { Debug.Print(e.Message); } } }
// Send indexes to a specific node // Use after a node comes online public void sendIndexes(string guid) { NodeDatabase ndb = new NodeDatabase(); IndexDatabase idd = new IndexDatabase(); if (!idd.TablesEmpty()) //if there are indexes to send { string indexDBCopy = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location) + @"\indexes_" + (Properties.Settings.Default.guid).ToString() + ".s3db"; if (System.IO.File.Exists(idd.GetPathFileName())) { try { System.IO.File.Copy(idd.GetPathFileName(), indexDBCopy, true); } catch (System.IO.IOException e) { Debug.Print(e.Message); } } Guid myGuid = Node.GetGuid(); TcpClient tcpClient = new TcpClient((ndb.SelectNodeIp(Guid.Parse(guid))).ToString(), 7890); ClientThread ct = new ClientThread(tcpClient, false, myGuid); PushIndexRequest pir = new PushIndexRequest(indexDBCopy, new FileInfo(indexDBCopy).Length); ct.EnqueueWork(pir); NetworkResponse response = (NetworkResponse)ct.DequeueEvent(); while (ct.IsWorking()) { Thread.Sleep(1000); } ct.RequestStop(); while (ct.IsAlive()) { Thread.Sleep(1000); } } }
// Send indexes to all trusted nodes that are online // For use after a backup and associated index insertion have occurred public void sendIndexes() { IndexDatabase idd = new IndexDatabase(); if (!idd.TablesEmpty()) //if there are indexes to send { DistributionDatabase ddb = new DistributionDatabase(); List<string> guidList = new List<string>(); NodeDatabase ndb = new NodeDatabase(); string online = "online"; string indexDBCopy = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location) + @"\indexes_" + (Properties.Settings.Default.guid).ToString() + ".s3db"; if (System.IO.File.Exists(idd.GetPathFileName())) { try { System.IO.File.Copy(idd.GetPathFileName(), indexDBCopy, true); } catch (System.IO.IOException e) { Debug.Print(e.Message); } } guidList = ndb.SelectGUID(); foreach (string currentGUID in guidList) { if (Node.GetGuid() != Guid.Parse(currentGUID) && ddb.GetStatus(currentGUID) == online && ndb.SelectNodeTrusted(Guid.Parse(currentGUID)) == "yes") { Guid myGuid = Node.GetGuid(); TcpClient tcpClient = new TcpClient((ndb.SelectNodeIp(Guid.Parse(currentGUID))).ToString(), 7890); ClientThread ct = new ClientThread(tcpClient, false, myGuid); PushIndexRequest pir = new PushIndexRequest(indexDBCopy, new FileInfo(indexDBCopy).Length); ct.EnqueueWork(pir); NetworkResponse response = (NetworkResponse)ct.DequeueEvent(); while (ct.IsWorking()) { Thread.Sleep(1000); } ct.RequestStop(); while (ct.IsAlive()) { Thread.Sleep(1000); } } } } }
protected void checkStorageThread() { if (storageThread.NumChunks() > 0) { Chunk chunk = storageThread.DequeueChunk(); Logger.Debug("EchoBackupService:checkStorageThread Finished archiving chunk."); //identify host(s) to send to. List<GuidAndIP> gai = NetworkFunctions.GetOnlineNodesIPAddresses(); if (gai.Count < 2) { Logger.Warn("EchoBackupService:checkStorageThread not enough online hosts. hosts online: " + gai.Count); } //send chunk to hosts. List<Block> blocks = new List<Block>(); long filesize = new FileInfo(chunk.Path()).Length; for (int i = 0; i < 2 && i < gai.Count; i++) { TcpClient tc = new TcpClient(gai[i].ipAddress.ToString(), CommandServer.SERVER_PORT); ClientThread ct = new ClientThread(tc, false, this.guid); PushRequest pr = new PushRequest(Node.GetIPAddress(), this.guid, MiscFunctions.Next()); pr.Path = chunk.Path(); pr.FileSize = filesize; pr.BackupNumber = chunk.BackupID(); pr.ChunkNumber = chunk.ChunkID(); ct.EnqueueWork(pr); lock (clientThreads) { clientThreads.Add(ct); } blocks.Add(new Block(this.guid.ToString(), gai[i].guid.ToString(), "bad storage path", filesize, MiscFunctions.DBDateAndTime())); } //do something with the index so we know about this backup //store files in BackupIndex IndexDatabase idb = new IndexDatabase(); foreach (FileInChunk fic in chunk.Files()) { BackupIndex bi = new BackupIndex(); string fullpath = Path.Combine(chunk.BasePath(), fic.path); if (Directory.Exists(fullpath)) continue; bi.backupLevel = 0; bi.dateAndTime = MiscFunctions.DBDateAndTime(); bi.firstBlockOffset = 0; bi.size = new FileInfo(fullpath).Length; bi.sourceGUID = this.guid.ToString(); bi.sourcePath = fullpath; //todo: we cannot insert multiple blocks for every file. that is what the index-to-block table is for //idb.InsertIndex(bi, blocks); } //store indexes in DB } if (storageThread.NumRecoverStructs() > 0) { RecoverResult rs = storageThread.DequeueRecoverResult(); lock (recoverResults) { recoverResults.Enqueue(rs); } } }