Ejemplo n.º 1
0
        private StructureReader <T> LoadStruct <T>(TableOfStructures <T> table, Slice name, out ushort version) where T : struct
        {
            var reader = LoadStruct(table, name, writeBatch.Value, out version);

            if (reader == null)
            {
                throw new IndexDoesNotExistsException(string.Format("There is no index with the name: '{0}'", name.ToString()));
            }

            return(reader);
        }
Ejemplo n.º 2
0
        protected StructureReader <T> LoadStruct <T>(TableOfStructures <T> table, Slice key, WriteBatch writeBatch, out ushort version)
        {
            var read = table.ReadStruct(Snapshot, key, writeBatch);

            if (read == null)
            {
                version = 0;
                return(null);
            }

            version = read.Version;
            return(read.Reader);
        }
Ejemplo n.º 3
0
		private void Initialize()
		{
			Documents = new Table(Tables.Documents.TableName, bufferPool, Tables.Documents.Indices.KeyByEtag, Tables.Documents.Indices.Metadata);
			Details = new Table(Tables.Details.TableName, bufferPool);
			IndexingStats = new TableOfStructures<IndexingWorkStatsFields>(Tables.IndexingStats.TableName,
				new StructureSchema<IndexingWorkStatsFields>()
					.Add<int>(IndexingWorkStatsFields.IndexId)
					.Add<int>(IndexingWorkStatsFields.IndexingAttempts)
					.Add<int>(IndexingWorkStatsFields.IndexingSuccesses)
					.Add<int>(IndexingWorkStatsFields.IndexingErrors)
					.Add<long>(IndexingWorkStatsFields.LastIndexingTime)
					.Add<long>(IndexingWorkStatsFields.CreatedTimestamp),
				bufferPool);

			IndexingMetadata = new Table(Tables.IndexingMetadata.TableName, bufferPool);
			LastIndexedEtags = new TableOfStructures<LastIndexedStatsFields>(Tables.LastIndexedEtags.TableName,
				new StructureSchema<LastIndexedStatsFields>()
					.Add<int>(LastIndexedStatsFields.IndexId)
					.Add<long>(LastIndexedStatsFields.LastTimestamp)
					.Add<byte[]>(LastIndexedStatsFields.LastEtag),
				bufferPool);

			DocumentReferences = new TableOfStructures<DocumentReferencesFields>(Tables.DocumentReferences.TableName,
				new StructureSchema<DocumentReferencesFields>()
					.Add<int>(DocumentReferencesFields.IndexId)
					.Add<string>(DocumentReferencesFields.Key)
					.Add<string>(DocumentReferencesFields.Reference),
				bufferPool, Tables.DocumentReferences.Indices.ByRef, Tables.DocumentReferences.Indices.ByView, Tables.DocumentReferences.Indices.ByViewAndKey, Tables.DocumentReferences.Indices.ByKey);

			Queues = new Table(Tables.Queues.TableName, bufferPool, Tables.Queues.Indices.ByName, Tables.Queues.Indices.Data);
			Lists = new Table(Tables.Lists.TableName, bufferPool, Tables.Lists.Indices.ByName, Tables.Lists.Indices.ByNameAndKey);

			Tasks = new TableOfStructures<TaskFields>(Tables.Tasks.TableName,
				new StructureSchema<TaskFields>()
					.Add<int>(TaskFields.IndexId)
					.Add<long>(TaskFields.AddedAt)
					.Add<byte[]>(TaskFields.TaskId)
					.Add<string>(TaskFields.Type)
					.Add<byte[]>(TaskFields.SerializedTask),
				bufferPool, Tables.Tasks.Indices.ByIndexAndType, Tables.Tasks.Indices.ByType, Tables.Tasks.Indices.ByIndex);

			ScheduledReductions = new TableOfStructures<ScheduledReductionFields>(Tables.ScheduledReductions.TableName,
				new StructureSchema<ScheduledReductionFields>()
					.Add<int>(ScheduledReductionFields.IndexId)
					.Add<int>(ScheduledReductionFields.Bucket)
					.Add<int>(ScheduledReductionFields.Level)
					.Add<long>(ScheduledReductionFields.Timestamp)
					.Add<string>(ScheduledReductionFields.ReduceKey)
					.Add<byte[]>(ScheduledReductionFields.Etag),
				bufferPool, Tables.ScheduledReductions.Indices.ByView, Tables.ScheduledReductions.Indices.ByViewAndLevelAndReduceKey);
			
			MappedResults = new TableOfStructures<MappedResultFields>(Tables.MappedResults.TableName,
				new StructureSchema<MappedResultFields>()
					.Add<int>(MappedResultFields.IndexId)
					.Add<int>(MappedResultFields.Bucket)
					.Add<long>(MappedResultFields.Timestamp)
					.Add<string>(MappedResultFields.ReduceKey)
					.Add<string>(MappedResultFields.DocId)
					.Add<byte[]>(MappedResultFields.Etag),
				bufferPool, Tables.MappedResults.Indices.ByView, Tables.MappedResults.Indices.ByViewAndDocumentId, Tables.MappedResults.Indices.ByViewAndReduceKey, Tables.MappedResults.Indices.ByViewAndReduceKeyAndSourceBucket, Tables.MappedResults.Indices.Data);

			ReduceKeyCounts = new TableOfStructures<ReduceKeyCountFields>(Tables.ReduceKeyCounts.TableName,
				new StructureSchema<ReduceKeyCountFields>()
					.Add<int>(ReduceKeyCountFields.IndexId)
					.Add<int>(ReduceKeyCountFields.MappedItemsCount)
					.Add<string>(ReduceKeyCountFields.ReduceKey),
				bufferPool, Tables.ReduceKeyCounts.Indices.ByView);

			ReduceKeyTypes = new TableOfStructures<ReduceKeyTypeFields>(Tables.ReduceKeyTypes.TableName,
				new StructureSchema<ReduceKeyTypeFields>()
					.Add<int>(ReduceKeyTypeFields.IndexId)
					.Add<int>(ReduceKeyTypeFields.ReduceType)
					.Add<string>(ReduceKeyTypeFields.ReduceKey),
				bufferPool, Tables.ReduceKeyTypes.Indices.ByView);

			Attachments = new Table(Tables.Attachments.TableName, bufferPool, Tables.Attachments.Indices.ByEtag, Tables.Attachments.Indices.Metadata);

			ReduceResults = new TableOfStructures<ReduceResultFields>(Tables.ReduceResults.TableName,
				new StructureSchema<ReduceResultFields>()
					.Add<int>(ReduceResultFields.IndexId)
					.Add<int>(ReduceResultFields.Level)
					.Add<int>(ReduceResultFields.SourceBucket)
					.Add<int>(ReduceResultFields.Bucket)
					.Add<long>(ReduceResultFields.Timestamp)
					.Add<string>(ReduceResultFields.ReduceKey)
					.Add<byte[]>(ReduceResultFields.Etag),
				bufferPool, Tables.ReduceResults.Indices.ByView, Tables.ReduceResults.Indices.ByViewAndReduceKeyAndLevel, Tables.ReduceResults.Indices.ByViewAndReduceKeyAndLevelAndSourceBucket, Tables.ReduceResults.Indices.ByViewAndReduceKeyAndLevelAndBucket, Tables.ReduceResults.Indices.Data);

			General = new Table(Tables.General.TableName, bufferPool);
			ReduceStats = new TableOfStructures<ReducingWorkStatsFields>(Tables.ReduceStats.TableName,
				new StructureSchema<ReducingWorkStatsFields>()
					.Add<int>(ReducingWorkStatsFields.ReduceAttempts)
					.Add<int>(ReducingWorkStatsFields.ReduceSuccesses)
					.Add<int>(ReducingWorkStatsFields.ReduceErrors)
					.Add<long>(ReducingWorkStatsFields.LastReducedTimestamp)
					.Add<byte[]>(ReducingWorkStatsFields.LastReducedEtag),
				bufferPool);
		}
Ejemplo n.º 4
0
        public void MigrateToStructures <T>(StorageEnvironment env, TableOfStructures <T> table, Action <string> output, Action <RavenJObject, Structure <T> > copyToStructure)
        {
            long entriesCount;

            using (var tx = env.NewTransaction(TransactionFlags.ReadWrite))
            {
                entriesCount = tx.ReadTree(table.TableName).State.EntriesCount;
            }

            if (entriesCount == 0)
            {
                output(string.Format("No records to migrate in '{0}' table.", table.TableName));
                return;
            }

            output(string.Format("Starting to migrate '{0}' table to use structures. Records to process: {1}", table.TableName, entriesCount));

            var migratedEntries = 0L;
            var keyToSeek       = Slice.BeforeAllKeys;

            // delete Temp_TabelName if exists
            using (var txw = env.NewTransaction(TransactionFlags.ReadWrite))
            {
                env.DeleteTree(txw, "Temp_" + table.TableName);

                txw.Commit();
            }
            using (var txw = env.NewTransaction(TransactionFlags.ReadWrite))
            {
                env.CreateTree(txw, "Temp_" + table.TableName);

                txw.Commit();
            }
            do
            {
                using (var txw = env.NewTransaction(TransactionFlags.ReadWrite))
                {
                    var destTree = txw.ReadTree("Temp_" + table.TableName);
                    var srcTree  = txw.ReadTree(table.TableName);

                    var iterator = srcTree.Iterate();

                    if (iterator.Seek(keyToSeek) == false)
                    {
                        break;
                    }

                    var writtenStructsSize = 0;

                    do
                    {
                        keyToSeek = iterator.CurrentKey;

                        if (writtenStructsSize > 8 * 1024 * 1024) // 8 MB
                        {
                            break;
                        }


                        var readerForCurrent = iterator.CreateReaderForCurrent();
                        using (var stream = readerForCurrent.AsStream())
                        {
                            var currentDataSize = iterator.GetCurrentDataSize();
                            try
                            {
                                RavenJObject jsonValue   = stream.ToJObject();
                                var          structValue = new Structure <T>(table.Schema);
                                copyToStructure(jsonValue, structValue);
                                destTree.WriteStruct(iterator.CurrentKey, structValue);
                                writtenStructsSize += structValue.GetSize();
                            }
                            catch (Exception)
                            {
                                // already converted this, probably, just move as is
                                int used;
                                var readBytes = readerForCurrent.ReadBytes(currentDataSize, out used);
                                destTree.Add(iterator.CurrentKey, readBytes);
                                writtenStructsSize += currentDataSize;
                            }

                            migratedEntries++;
                        }
                    } while (iterator.MoveNext());

                    txw.Commit();

                    output(string.Format("{0} of {1} records processed.", migratedEntries, entriesCount));
                }
            } while (migratedEntries < entriesCount);

            using (var txw = env.NewTransaction(TransactionFlags.ReadWrite))
            {
                env.DeleteTree(txw, table.TableName);
                env.RenameTree(txw, "Temp_" + table.TableName, table.TableName);

                txw.Commit();
            }

            output(string.Format("All records of '{0}' table have been migrated to structures.", table.TableName));
        }