Pages

Descrição do Problema

Tenho em minha corporação um cluster de servidores WEB montado em cima de NLB e com o conteúdo das páginas replicado através do DFS Replication.  Todo o site é replicado com sucesso para qualquer formato de arquivo. Meus problemas começaram quando a webdesigner reclamou que alguns arquivos que ela coloca com sucesso em um dos servidores, no local correto, simplesmente não replica. Minha primeira ação foi achar que ela estava fazendo alguma coisa errada, mas qual não foi minha surpresa quando descobri que era exatamente isso. Alguns arquivos de imagem, que ela salva em um dos servidores, não replica para os demais. Analisando o erro vi que o arquivo está correto, não é corrompido, não registra erro no event viewer e está com as permissões corretas, mas não replica.  E para completar o problema, outros arquivos de imagem, no mesmo formato do rebelde, ela coloca exatamente no mesmo local com as mesmas permissões, e  replicam perfeitamente para todos os servidores.


CAUSA

Depois de uns bons cabelos arrancados, pesquisa no google, bing e meus recursos de criatividade, consegui resolver o problema e posto os passos usados no troubleshooting para você ter como referência em casos parecidos.

Por padrão o DFS-R gera um arquivo de log com todos os seus processos com considerável nível de riqueza. Estes arquivos de logs são gerados na pasta %systemroot%\debug. Analisando este log achei a seguinte entrada referente ao meu arquivo que não estava sendo replicado:

20101103 08:34:54.959 1912 USNC 1204 UsnConsumer::ProcessUsnRecord Skipping USN_RECORD with FILE_ATTRIBUTE_TEMPORARY flag:
+ USN_RECORD:
+ RecordLength: 88
+ MajorVersion: 2
+ MinorVersion: 0
+ FileRefNumber: 0x1200000000446a
+ ParentFileRefNumber: 0x1000000013b82
+ USN: 0xf20fdf18
+ TimeStamp: 20101103 08:34:54.959 E. South America Standard Time
+ Reason: Close File Delete
+ SourceInfo: 0x0
+ SecurityId: 0x3f0
+ FileAttributes: 0x120
+ FileNameLength: 26
+ FileNameOffset: 60
+ FileName: FlashImg.jpg
 
Quando li este log, entendi que o arquivo foi pulado do processamento por ser um arquivo temporário. Mas o arquivo não começa com "~" ou termina como .tmp, como são as exceções padrões do DFS. É um arquivo .jpg como vários outros. Então, de onde diabos este infeliz achou que este arquivo era temporário?  Neste momento descobri que, apesar de não aparecer em quase nenhuma interface padrão do Windows, console ou aplicativo, existe um atributo em cada arquivo em uma partição NTFS que marca este arquivo como temporário. Este atributo é mostrado na linha copiada acima: + FileAttributes: 0x120


Pesquisando um pouco percebi que o 0x120 representa os atributos marcados neste arquivo, onde 0x100 representa uma flag de arquivo temporário e 0x20 representa um arquivo pronto para ser arquivado (arquive).

O problema é que DFS Replication não replica arquivos com esta flag de temporário marcada.  Esta é uma política implícita e não existe opção de mudá-la (pelo menos nas versões atuais). Ele simplesmente pula o arquivo e pronto.  Uma maneira de visualizar  este atributo via linha de comando para você poder testar seus arquivos é através da seguinte linha de comando:

fsutil usn readdata Nome_arquivo (Execute como administrador e em arquivos locais);

O resultado será algo perecido com isso:

Major Version : 0x2
Minor Version : 0x0
FileRef# : 0x000c000000044e24
Parent FileRef# : 0x000200000002c892
Usn : 0x000000008d082d50
Time Stamp : 0x0000000000000000 00:00:00 01/01/1601
Reason : 0x0
Source Info : 0x0
Security Id : 0x0
File Attributes : 0x120
File Name Length : 0x1a
File Name Offset : 0x3c
FileName : Nome_Arquivo
 
Ainda como referência, veja a seguinte tabela de atributos que podem ser representados como saída deste comando:
 
READONLY 0x1
HIDDEN 0x2
SYSTEM 0x4
DIRECTORY 0x10
ARCHIVE 0x20
DEVICE 0x40
NORMAL 0x80
TEMPORARY 0x100
SPARSE_FILE 0x200
REPARSE_POINT 0x400
COMPRESSED 0x800
OFFLINE 0x1000
NOT_CONTENT_INDEXED 0x2000
ENCRYPTED 0x4000

Resolução


Como opção de resolução podemos simplesmente desmarcar o atributo de arquivo temporário, porém com esta solução você mata apenas o sintoma, e acaba fazendo o arquivo ser replicado. O ideal é você achar em que momento este arquivo se tornou temporário e por qual aplicação e tentar mudar o comportamento desta aplicação para resolver o caso. Só assim você garantirá que isso não voltará a acontecer.
 
Mas se você quiser limpar o atributos de temporário, pode fazer isso até para vários arquivos dentro de uma pasta, porém não é tão simples como usar um attrib, já que este aplicativo não toma ciência deste atributo. Instale o powershell neste servidor (http://www.microsoft.com/powershell) e execute o seguinte comando:
 
Get-childitem D:\Data -recurse | ForEach-Object -process {if (($_.attributes -band 0x100) -eq 0x100) {$_.attributes = ($_.attributes -band 0xFEFF)}}
 
Onde D:\Data é o diretório onde estão seus arquivos. A opção -recurse vai executar o comando em todos os subdiretórios.
 
Também existe aplicativos terceiros como File Tweak que te dá a chance de controlar este atributo de uma maneira mais simples.
 
Um grande abraço a todos

Reações: 

0 Responses so far.

Postar um comentário